ورود

View Full Version : فرم داینامیک و validation



hooman.pro
سه شنبه 28 مرداد 1393, 22:29 عصر
یک قسمت از برنامه ای که دارم با yii مینویسم یک فرم داینامیک بر اساس سلکت باکس قبلی کاربر لود میشود مثلا فرض کنید اگر عدد 2 از سلکت باکس انتخاب شد در ادامه فیلد هایی به این صورت از دیتابیس جدول prpperty خوانده و اضافه میشود:

(فیلد تکستی)چند دفعه:
(فیلد تکست اریا): توضیحات:

خوب حالا مشکل اینجاست که باید ولیدیشن هم برای این ها بگذارم. به این صورت که اولی فقط عدد قبول کند
و دومی فقط متن

در حالی که هر دو از یک مدل value ساخته شده اند. و این که کدام باید چه مقداری بگیرد و نوعشان که تکست فیلد و یا تکست اریا و ... باشد در جدول property مشخص شده

دوستان دقت کنید من با نحوه رول نوشتن در yii مشکلی ندارم اما کاری که میخوام انجام بشه اینه که:

بر اساس جدول property که فرم داینامیک تولید شده validation اختصاصی خود را بگیرد. و هر کدام از این ها فیلد ها در جدول values نهایتا ذخیره شود.

tinybyte
چهارشنبه 29 مرداد 1393, 07:52 صبح
اگر شما بتونی سرور ساید، اونو ولیدیت کنی مثلا در beforeValidate در فرمتون فقط کافیه که ajax validation فرمتون را فعال کنین.

hooman.pro
چهارشنبه 29 مرداد 1393, 11:06 صبح
مشکل حل شد تقریبا اما از متد CValidator::createValidator
استفاده کردم

مشکل اصلی اینجاست که میخوام به مدل بعد از ساخت آبجکت ازش attribute اضافه کنم.
یعنی همان توابع جادویی __set و __get در php مشکل اینجاست که وقتی این توابع را مینویسم پدرشان هم این توابع را دارند و خرابکاری میشود.
من چی کار کنم که این کد اررو نده:


$valuesQP= new ValuesQuestionParameter();

echo $valuesQP->value_test=10;



ارور اینه:
Property "ValuesQuestionParameter.value_test" is not defined.

MMSHFE
چهارشنبه 29 مرداد 1393, 11:28 صبح
خوب توی کلاس ValuesQuestionParameter فیلد value_test رو تعریف نکردین.

hooman.pro
چهارشنبه 29 مرداد 1393, 20:47 عصر
خوب توی کلاس ValuesQuestionParameter فیلد value_test رو تعریف نکردین.

بله میدونم که ایجاد نکردم و میخواستم با __set و __get ایجاد کنم و بخونم یعنی در واقع یک مدل داینامیک داشته باشم که در نهایت موفق شدم و به این صورت عمل کردم



class ValuesQuestionParameter extends CActiveRecord
{

protected $_members = array();
protected $_validation_rules=array();

public function __construct($nameFields)
{
foreach ($nameFields as $member=>$mmb) {
$this->_members[$mmb['name']] = null;
$this->_validation_rules[$mmb['name']] = $mmb['validation_rules'];
}

parent::__construct();
}

/**
* @return array validation rules for model attributes.
* این تابع کلا در حال تست و بررسی هست و درست نوشته نشده و اصل مشکلم هم همین جا هست
* همان طور که میبینید سعی کردم کلا آرایه ای که ولیدیشن رول قرار است بازگشت دهد را به صورت یک متن از تکمیل کنم. راهی هست که این متن درون متغییر مانند کد
* عمل کند. البته دارم تابع eval رو امتحان میکنم شاید جواب بده
*/
public function rules()
{
$allMembers = implode(', ', array_values($this->_validation_rules));
$s= array_values($this->_validation_rules);
$roles="return array(";
foreach ($s as $rol){
$roles.=$rol;
}
$roles.=");";


//eval($roles);

...
}

public function __get($attribute)
{

if (in_array($attribute, array_keys($this->_members))) {
return $this->_members[$attribute];
} else {
return parent::__get($attribute);
}
}

public function __set($attribute, $value)
{
if (in_array($attribute, array_keys($this->_members))) {
return $this->_members[$attribute] = $value;
} else {
return parent::__set($attribute, $value);
}
}

....




و در موقع ساخت مدل هم این کارو کردم:





$sql="SELECT name,validation_rules FROM tbl_parameter";
$names = Yii::app()->db->createCommand($sql)->query()->readAll();
$valuesQP= new ValuesQuestionParameter($names);



همون طور که میبینید و فقط قسمت ولیدیشن رول هام مشکل داره توی دیتابیس در جدول tbl_parameter فیلدی دارم که یک رکورد آن به طور مثال به این صورت است:



name: test
validation_rules:
array('test', 'numerical', 'integerOnly'=>true),



خوب حالا ولیدیشن رول رو به صورت متنی از دیتا بیس خوندم و باید اعمالش کنم. مشکلم اینهکه متنه و آرایه واقعی نیست. اصلا به نظر شما ولیدشن رول ها رو چه طوری تو دیتابیس ذخیره کنم؟ الان میشه اینا رو یه جور فهموند به مدل که اعمال کنه.

hooman.pro
پنج شنبه 30 مرداد 1393, 12:10 عصر
حالا که تا اینجا رو گفتم، و تونستم اون مشکلم حل کنم میگم چه طور حل شد که اگر کسی خواست مثل من فرم و مدل داینامیک و ولیدیشن داینامیک داشته باشه بدونه باید چی کار کنه

آرایه ولیدیشن رو با تابع serialize تبدیل به متن کردم. و در دیتابیس ذخیره کردم. نه به صورت یک متن ساده

موقع واکشی هم توی اون forech به جای جوین به استرینگ . یه آرایه ساختم و درون اون ریختمشون اما قبل از ریختن تو خونه های اون آرایه unserialize روشون انجام دادم. و در نهایت آرایه بدست آمده رو بازگشت دادم.

http://99webtools.com/how-to-store-array-mysql.php
نحوه ذخیره و خواندن آرایه در دیتابیس

hooman.pro
پنج شنبه 30 مرداد 1393, 12:26 عصر
من به هدف رسیدم اما از دوستان، و اساتید درخواست میکنم یکبار داستان را بخونند و اگر ایده بهینه تری برای اینکار دارند به من پیشنهاد بدن خیلی ممنون میشم