رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
با اجاکس dynamic model
#1
سلام 
من یک دیتابیس دارم به شرح زیر :
type : id - name -parent
fields : id - typeid-name - latinname
fields-value: id - filedid -objectid - fieldvalue
object : id - name -description - typeid-userid

من برای درج فرم در سایت زیر استفاده میکنم : 
http://www.4bit.ir/objects/add
حالا من توی این فرم یک dropdownlist دارم که type ها را نمایش میده دارم بر اساس ان با جیکوئری به صورت اجاکس فیلد های مخصوص به ان type را میگیرم حالا مساله اینجاست که نام فیلد های در fields و مقدارشون در fileds-value هست که جدول fields-value اطلاعاتی که کاربران برای ان فیلد ها وارد میکنند را قرار هست ذخیره کنه .
کد هاش :

$form = ActiveForm::begin([
    'id' => 'object-add',
   'options' => [
 'class' => 'form-horizontal',
 'enctype' => 'multipart/form-data'
 ],
])?>
<?= $form->field($model, 'type_id')->dropdownlist([['prompt'=>'نوع  را انتخاب کنید'],$type]) ?>
<?= $form->field($model, 'title') ?>
<?= $form->field($model, 'description')->textarea() ?>

<?= Html::submitButton('ثبت شی دیجیتال',['class'=>'btn btn-primary']) ?>
<?php ActiveForm::end();

$js=<<<Js


var URL="http://localhost/shop/";
$('#objects-type_id').change(function(e){
e.preventDefault();
e.stopImmediatePropagation();
$.post(URL+"fields/getfields",{getfields:'true',object_type_id:$(this).val()},function(res){
   res=JSON.parse(res);
   if(res!=[])
   {
      $('.hasremove').remove();
      for(var i=0;i<res.length;++i)
     {
       $.each(data.attributes, function(key, val) {
           val = $.parseJSON(val);
           val.validate = eval("var f = function(){ return "+val.validate.expression+";}; f() ;") ;
           $('#object-add-form').yiiActiveForm('add', val);
       });
         $('.field-objects-description').after('<div class="form-group field-fieldsrelationship-'+res[i].latin_name+' hasremove"><label class="control-label" for="fieldsrelationship-'+res[i].latin_name+'">'+res[i].name+'</label><input type="text"  required id="fieldsrelationship-'+res[i].latin_name+'" class="form-control" name="fieldsrelationship['+res[i].latin_name+']"><div class="help-block"></div></div>');
     }
   }
   else
   {

   }

});
 return false;
});

Js;
$this->registerJs($js);
?>

میخواستم بدونم ۱- با pjax چطور میتونم پیاده اش کنم به جای جیکوئری بنظرتون بهینه تره ؟

۲- من سعی کردم از url::to استفاده کنم اما ارور داد : 

var URL="http://localhost/shop/";

۳- چطور میتونم با کمک داینامیک مدل فیلد های که برای هر نوع میاد را ولیدیت کنم با وجود اینکه معلوم نیست چند فیلد باشه و هر لحظه امکان تغییرش هست ؟
پاسخ
تشکر شده توسط:
#2
1- دقت کنید که Pjax هم خودش یه پلاگین jQuery هست و کاربردهای خاص خودش رو داره. درمورد این نیاز شما بنظر من همون jQuery AJAX بهتر جواب میده.

2- باید قبل از اینکه JS رو بنویسید ازش استفاده کنید. مثال:
$url = Url::to('/fields/getfields']);
...
$js = <<<Js
.
.
.
$.post({$url},...);
Js;

3- باید فیلدهایی که جنریت میشه رو توی آرایه بگذارین (آخر اسمشون [] اضافه کنید) و بعد با foreach پردازش کنید.
پاسخ
تشکر شده توسط:
#3
دقیقا قبل js گذاشتم اما ارور میده :




$url = Url::to(['/fields/getfields']);

پاسخ
تشکر شده توسط:
#4
Class 'Url' not found
پاسخ
تشکر شده توسط:
#5
باید use بذارین خوب.
use yiihelpersUrl;
پاسخ
تشکر شده توسط:
#6
در مورد این بیشتر توضیح میدین ؟
3- باید فیلدهایی که جنریت میشه رو توی آرایه بگذارین (آخر اسمشون [] اضافه کنید) و بعد با foreach پردازش کنید.
پاسخ
تشکر شده توسط:
#7
<input name="tags[]" type="text" />

foreach($_POST['tags'] as $tag) {
    ...
}
پاسخ
تشکر شده توسط: dr.web
#8
سلام.
در مورد این کد و نحوه کارش لطفا توضیح بدین:

$url = Url::to('/fields/getfields']);
...
$js = <<<Js
.
.
.
$.post({$url},...);
Js;

متشکرم.
پاسخ
تشکر شده توسط:
#9
این کد ابتدا آدرس اکشن getfields از کنترلر fields رو مطابق با قواعدی که توی rules از کامپوننت UrlManager اعلام شده، تولید میکنه و توی url$ میگذاره و بعد، از همون متغیر توی اسکریپت js$ استفاده میکنه.
پاسخ
تشکر شده توسط: abdollah110110 , dr.web




کاربران در حال بازدید این موضوع: 1 مهمان