تالار گفتمان nCIS.ir

نسخه‌ی کامل: با اجاکس dynamic model
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام 
من یک دیتابیس دارم به شرح زیر :
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/";

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

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

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




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

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

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

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

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