رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
دریافت id فیلدی که با ajax ساخته شده
#1
سلام دوستان من یک فرم دارم که توی ان یکسری دسته هست و هر دسته یک سری داره به صورت زیر : حالا توی کنترولر نیاز به ای دی ان فیلد ها دارم

یک dropdownlist هست که دسته ها را داره بعد با ajax دارم از کنترولر اطلاعات فیلد مربوط به ان دسته را میگیرم و برای یک input text میسازم حالا مشکل اینجاست که توی دیتابیس باید ریلیشن باشه و field_id که از جدول fields هست را برام برگردونه

ساختار دیتابیس :‌ fields (id- name- latin_name) fieldsrelation(id- fields_id - field_value) in sakhtaresh hast

مسخره ترین راه این هست که id را هم در یک input بگذارم که واقعا غیر حرفه ای هست راه دیگه میتونه کوکی یا session باشه که انم معلوم نیست تعداد فیلد ها چقدر بشه و قابل قبول نیست راه بعدی اجاکس هست که ایده خاصی براش ندارم.
ای دی میده مساله جور دیگه ای هست یک dropdownlist دسته ها توش هست ما با اجاکس گفتیم هر وقت تغییر داد دسته را بره از جدول  fields اسم فیلدش رابخونه و بعد بر اساس ان یک input text بسازیم با همون اجاکس و نمایش بدیم که اینکار برای هر تعداد فیلد مربوط به ان دسته انجام میشه حالا مشکل اینجاست که ما اینجا محتوای ان فیلد را با Input میتونیم بخوینم اما دیتابیس ریلشن داره و نیاز به fields_id هم هست بر اساس دیتایسی ک قبل گفتم حالا یک راه این هست که کنار هر input که میسازم بگم یک input hidden باشه که id ارسال کنه اما راه اصولی نیست دنبال راه بهترم ؟
فرم :
<?php
use yiihelpersHtml;
use yiiwidgetsActiveForm;
use appmodelsFields;
use appmodelsFieldsrelationship;

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

<?= Html::submitButton('ثبت شی دیجیتال',['class'=>'btn btn-primary']) ?>
<?php ActiveForm::end();
$js=<<<Js
var URL="http://localhost/digifile/";
$('#objects-object_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)
     {
       $('.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" 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);
?>

کنترولر ها :

کنترولرذخیره سازی فرم :

<?php

namespace appcontrollers;
use Yii;
use appmodelsObjects;
use appmodelsObjectTypes;
use appmodelsPayments;
use appmodelsFieldsrelationship;
use yiihelpersArrayHelper;

class ObjectsController extends yiiwebController
{
   public function actionIndex()
   {
       $objects=Objects::find()->All();
       return $this->render('index',array('objects'=>$objects));
   }
   public function actionAdd()
   {
     $jdf=Yii::$app->jdf->date('Y m d h:i:s');
     $model=new Objects;
     $fields = new Fieldsrelationship;
     $model->user_id='1';
     $model->submit_date=$jdf;
     $model->status='0';
     if(isset($_POST['Objects']) && isset($_POST['fieldsrelationship'])){
       $model->attributes=$_POST['Objects'];
       if ($model->load(Yii::$app->request->post()) && $model->save())
       {
          $fields->attributes=$_POST['fieldsrelationship'];
          var_dump($_POST['fieldsrelationship']);
         //  foreach ($_POST['fieldsrelationship'] as $myfield)
         //  {
           //  $fieldsrelation=Fields::find()->where('')->One();
            $fields->object_id = $model->id;
           //  $fields->field_id = $fieldsrelation->id;
             $fields->field_id = '5';
             $fields->field_value =$_POST['fieldsrelationship']['story'];
             $fields->save();
         //  }
       // return $this->redirect(['index', 'id' => $model->id]);
       }
     }
     else {

             $objectstype=ObjectTypes::find()->All();
             $objectstype=ArrayHelper::map($objectstype,'id','name');
               return $this->render('add',
             ['model'=>$model,'fields'=>$fields,'objectstype' => $objectstype]);

       }



   }
   public function actionShow()
   {
       $id=intval($_GET['id']);
       $model=Objects::find()->where(['id'=>$id])->One();
       return $this->render('show',['post'=>$model]);
   }
   public function actionDownload()
{
 $id=intval($_GET['id']);
 $model=Objects::find()->where(['id'=>$id])->One();
   return Yii::$app->response->sendFile($model->file);
}
public function actionPay()
{
   $session=Yii::$app->session;
   $session->open();
   $model=new Payments();
   if($model->load(Yii::$app->request->post()))
   {
       $model->submit_date=Yii::$app->formatter->asTimestamp(date('Y-m-d h:i:s'));
       $model->status='0';
       $model->price=$_SESSION['price'];
       $model->object_id=$_SESSION['object_id'];

       $Connection=Yii::$app->db;
       $sql=$Connection->createCommand("SELECT * FROM do_settings WHERE setting_name='pay'")->queryOne();
       unset($_SESSION['object_id']);
       unset($_SESSION['price']);
       if($sql['setting_value']=='payline')
       {
           $this->layout='location';
           $result=Payline::pardakht($model->price);
           if($result>0 && is_numeric($result))
           {
               $model->id_get=$result;
               if($model->save())
               {
                   $url="http://payline.ir/payment-test/gateway-$result";
                   ?>
                   <script>
                       window.location='<?= $url ?>';
                   </script>
               <?php
               }

           }
       }
       else
       {

           $model->setting_name='mellat';
           require_once 'components/nusoap.php';
           $bank_mellat=new bank_mellat();
           $res=$bank_mellat->pay($model->price);
           if($res)
           {
               $model->RefId=$res;
               $model->save();
               return $this->render('location',array('res'=>$res));
           }
           else
           {
               return $this->render('location',array('msg'=>'در اتصال به درگاه بانک مشکلی بیش آمده لطفا دوباره امتحان کنید'));
           }
       }


   }
   else
   {
       return $this->render('location',array('model'=>$model));
   }

}




}

مدل ها :
مدل fields نام فیلد ها را ذخیره میکنه .
<?php

namespace appmodels;

use Yii;

// public $id;
// public $name;
// public $object_type_id;

class Fields extends yiidbActiveRecord
{
   /**
    * @inheritdoc
    */
   public static function tableName()
   {
       return '{{do_fields}}';
   }

   /**
    * @inheritdoc
    */
   public function rules()
   {
       return [
           [['name', 'object_type_id','latin_name'], 'required','message'=>'لطفا فیلد {attribute} را وارد کنید'],
           [['object_type_id'], 'integer'],
           [['name','latin_name'], 'string', 'max' => 256]
       ];
   }

   /**
    * @inheritdoc
    */
   public function attributeLabels()
   {
       return [
            'id' => 'ID',
            'name' => 'نام فیلد به فارسی',
            'latin_name' => 'نام فیلد به انگلیسی',
            'object_type_id' => 'نوع شی دیجیتال',
        ];
   }
}

مدل fields_relation : ذخیره سازی محتوای فیلد ها :

<?php

namespace appmodels;

use Yii;

/**
* This is the model class for table "do_fields_relationship".
*
* @property string $id
* @property string $object_id
* @property string $field_id
* @property string $field_value
*/
class Fieldsrelationship extends yiidbActiveRecord
{
   /**
    * @inheritdoc
    */
   public static function tableName()
   {
       return 'do_fields_relationship';
   }

   /**
    * @inheritdoc
    */
   public function rules()
   {
       return [
           [['object_id', 'field_id', 'field_value'], 'required'],
           [['object_id', 'field_id'], 'integer'],
           [['field_value'], 'string', 'max' => 256]
       ];
   }

   /**
    * @inheritdoc
    */
   public function attributeLabels()
   {
       return [
            'id' => 'ID',
            'object_id' => 'Object ID',
            'field_id' => 'Field ID',
            'field_value' => 'Field Value',
        ];
   }
}

بهترین راه برای دریافت field_id را بگید لطفا ؟
پاسخ
تشکر شده توسط:
#2
کنترلر Fields شما چه کدی داره؟ ضمناً بهتره URL رو توی JS این مدلی بگذارین:
$url = Url::to['fields/getfields', true];

و از متغیر url$ استفاده کنید. اینطوری اگه بعداً با URL Manager لینکها رو عوض کردین، کدتون بطور خودکار اصلاح میشه.
پاسخ
تشکر شده توسط:
#3
درمورد این بیشتر توضیح میدین چطور ازش توی جکوئری استفاده کنم ؟ 
کد جی کوئریش در قسمت فرم هست بالا فرستادم .
 Url::to['fields/getfields', true];

من تازه با این فریمورک کار میکنم قبلا خودم cms پیاده سازی میکردم خیلی کار را سرعت میبخشه .

کنترولر fields :

<?php

namespace appcontrollers;

use Yii;
use appmodelsFields;
use appmodelsfieldSearch;
use appmodelsFieldsrelationship;
use yiiwebController;
use yiiwebNotFoundHttpException;
use yiifiltersVerbFilter;
use yiihelpersHtml;
use yiiwidgetsActiveForm;

class FieldsController extends Controller
{
   public function behaviors()
   {
       return [
           'verbs' => [
               'class' => VerbFilter::className(),
               'actions' => [
                   'delete' => ['post'],
               ],
           ],
       ];
   }

   /**
    * Lists all Fields models.
    * @return mixed
    */
   public function actionIndex()
   {
       $searchModel = new fieldSearch();
       $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

       return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
   }
   public function actionGetfields()
   {
     if(Yii::$app->request->post('getfields'))
     {
       $field=new Fields();
       $fields=Fields::find()->where(['object_type_id'=>$_POST['object_type_id']])->All();
       $res=[];
       $i=0;
       foreach ($fields as $s):
         $res[$i]['id']=$s->id;
         $res[$i]['name']=$s->name;
         $res[$i]['latin_name']=$s->latin_name;
     
         ++$i;
       endforeach;
       echo json_encode($res);
       }
       else
       {
         return $this->redirect(Yii::$app->homeUrl);
       }
     }


   /**
    * Displays a single Fields model.
    * @param string $id
    * @return mixed
    */
   public function actionView($id)
   {
       return $this->render('view', [
            'model' => $this->findModel($id),
        ]);
   }

   /**
    * Creates a new Fields model.
    * If creation is successful, the browser will be redirected to the 'view' page.
    * @return mixed
    */
   public function actionCreate()
   {
       $model = new Fields();

       if ($model->load(Yii::$app->request->post()) && $model->save()) {
           return $this->redirect(['view', 'id' => $model->id]);
       } else {
           return $this->render('create', [
                'model' => $model,
            ]);
       }
   }

   /**
    * Updates an existing Fields model.
    * If update is successful, the browser will be redirected to the 'view' page.
    * @param string $id
    * @return mixed
    */
   public function actionUpdate($id)
   {
       $model = $this->findModel($id);

       if ($model->load(Yii::$app->request->post()) && $model->save()) {
           return $this->redirect(['index', 'id' => $model->id]);
       } else {
           return $this->render('update', [
                'model' => $model,
            ]);
       }
   }

   /**
    * Deletes an existing Fields model.
    * If deletion is successful, the browser will be redirected to the 'index' page.
    * @param string $id
    * @return mixed
    */
   public function actionDelete($id)
   {
       $this->findModel($id)->delete();

       return $this->redirect(['index']);
   }

   /**
    * Finds the Fields model based on its primary key value.
    * If the model is not found, a 404 HTTP exception will be thrown.
    * @param string $id
    * @return Fields the loaded model
    * @throws NotFoundHttpException if the model cannot be found
    */
   protected function findModel($id)
   {
       if (($model = Fields::findOne($id)) !== null) {
           return $model;
       } else {
           throw new NotFoundHttpException('The requested page does not exist.');
       }
   }
}
پاسخ
تشکر شده توسط:
#4
من این مساله را با این کد حل کردم حالا یک مشکل دیگه هست ؟

اینکه فقط اخرین فیلد را ذخیره میکنه ؟


foreach($_POST['fieldsrelationship'] as $key => $value)
          {
           $fieldsrelation=Fields::find()->where(['latin_name'=> $key])->One();
           $fields->object_id = $model->id;
           $fields->field_id = $fieldsrelation->id;
           $fields->field_value =$value;
           $fields->save();
           echo $key.' : '.$value;
         }
پاسخ
تشکر شده توسط:
#5
برای استفاده از Url::to کافیه توی یه متغیر بگذارین و در مکان مناسب توی JS بگذارین به این شکل {url$}

کدتون رو هم به این شکل اصلاح کنید:
foreach($_POST['fieldsrelationshop'] as $key => $value) {
    if($fieldsrelation = Fields::findOne(['latin_name' => $key])) {
        $fields = new Fieldsrelationship;
        $fields->object_id = $model->id;
        $fields->field_id = $fieldsrelation->id;
        $fields->field_value = $value;
        $fields->save();
    }
}
پاسخ
تشکر شده توسط:




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