26-11-1394، 12:20 ق.ظ
سلام دوستان من یک فرم دارم که توی ان یکسری دسته هست و هر دسته یک سری داره به صورت زیر : حالا توی کنترولر نیاز به ای دی ان فیلد ها دارم
یک 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 ارسال کنه اما راه اصولی نیست دنبال راه بهترم ؟
فرم :
کنترولر ها :
کنترولرذخیره سازی فرم :
مدل ها :
مدل fields نام فیلد ها را ذخیره میکنه .
مدل fields_relation : ذخیره سازی محتوای فیلد ها :
بهترین راه برای دریافت field_id را بگید لطفا ؟
یک 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 را بگید لطفا ؟