PDA

View Full Version : مشکل در قسمت role ها



jionelmessi
پنج شنبه 14 اسفند 1393, 12:32 عصر
باسلام

من تو یه قسمت از پروژم مدلم دارایسری کلید خارجی است ولی کلید خارجی های من نال پذیر هست
بعد من توی قسمت rules وقتی role برا یان فیلدها تعریف می کنم دچار مشکل مشم و متد save از کار میفتهه ممنون اگه کمکم کنید بدونم مشکل از کجاس؟

MMSHFE
پنج شنبه 14 اسفند 1393, 14:29 عصر
کدتون رو بگذارین. بدون دیدن کد که نمیشه بفهمیم مشکل از کجاست.

jionelmessi
پنج شنبه 14 اسفند 1393, 16:10 عصر
کدم درست کار مکنه فقط زمانی که فیلدهای کلید خارجی که تو دیتابیس تعریق کردم و قابلیت نال پذیر بودن هم دارند را به سمت مدل مفرستم(اگر نال باشه عمل ذخیرعه سازی انجام نمشه) ولی در غیر اینصورت انجام مده این کد رول مادل



/**
* @return array validation rules for model attributes.
*/
public function rules()
{
return array(
array('name', 'required'),
array('register_number, economy_code, national_id,owner, staff_number, logo,address, website, connection_priority, send_email_flag, send_fax_flag, post_code, post_box, marketer_id, search_tag,phone, email, fax, description, documents,status_organize_id', 'safe' , 'on'=>'insert'),

array(
'register_number,
economy_code,
national_id,
staff_number,
post_code,
post_box,
send_email_flag,
send_fax_flag,
city_id,
status_organize_id,
lead_source_id,
customer_type_id,
industry_id,
marketer_id,
member_id',
'numerical', 'integerOnly'=>true
),
array('name, owner, logo, website', 'length', 'max'=>100),
array('register_number, economy_code, national_id, staff_number, post_code, post_box, city_id, customer_type_id, status_organize_id, lead_source_id, industry_id, marketer_id, member_id', 'length', 'max'=>11),
array('address, search_tag', 'length', 'max'=>500),
array('connection_priority', 'length', 'max'=>15),
array('logo', 'file', 'types'=>'jpg, gif, png', 'allowEmpty'=> true),
array('industry_id', 'in', 'range'=> Industry::getAllowedOptions()),
array('lead_source_id', 'in', 'range'=> LeadSource::getAllowedOptions()),
array('customer_type_id', 'in', 'range'=>CustomerType::getAllowedOptions()),
array('status_organize_id', 'in', 'range'=> StatusOrganize::getAllowedOptions()),
array('member_id', 'in', 'range'=> self::getAllowedOptions()),
array('CityName,name, register_number, economy_code, national_id, owner, staff_number, logo, address, website, phone, email, fax, connection_priority, description, documents, send_email_flag, send_fax_flag, poct_code, post_box, city_id, customer_type_id, status_organize_id, lead_source_id, industry_id, marketer_id, member_id, search_tag', 'safe', 'on'=>'search'),
);
}






اینم کنترلر




/**
* Creates a new model.
* If creation is successful, the browser will be redirected to the 'view' page.
*/
public function actionCreate()
{
$model = new Organize;
// var_dump($_POST);
if(isset($_POST['Organize']))
{

$model->attributes = $_POST['Organize'];
//get all uploade field of documents
$docs = CUploadedFile::getInstancesByName('Docs');
//list of allowed extension that can be upload as doc.
$allowedDocExt = array('txt','pdf', 'zip', 'rar', 'xls', 'xlsx', 'doc', 'docx', 'jpg', 'png', 'gif');
//create a array for hold info of docs.
$documents = array();
//go through each uploaded image
foreach ($docs as $index=>$doc)
{
//check title and file entered for this doc?
if(
isset($doc->name) && isset($_POST['DocTitle'][$index])
&&
trim($_POST['DocTitle'][$index]) != ''
&&
in_array($doc->getExtensionName(), $allowedDocExt)
)
{
//randomName is new name for doc file.
$randomName = 1000*time().'_doc_organize.'.$doc->getExtensionName();
//put title and doc in array.
$documents[]= array(
'title'=>trim($_POST['DocTitle'][$index]),
'doc'=>$randomName.'.'.$doc->getExtensionName()
);
$doc->saveAs(Yii::app()->getBasePath().'/files/docs/organize/'.$randomName);
}
}
//creat a json string of documents.
$model->documents = json_encode($documents);

$allowedImages = array('jpg', 'png', 'gif');
if(isset($model->logo) && !is_null($model->logo)){

$model->logo = CUploadedFile::getInstance($model, 'logo');
if(in_array($model->logo->getExtensionName(), $allowedImage))
{
$model->logo->saveAs(Yii::app()->getBasePath().'/files/images/logo/'.$model->name.'_logo.'.$model->logo->getExtensionName());
$model->logo = $model->name.'_logo.'.$model->logo->getExtensionName();
}
}

if($model->save())
echo 'INSERT_SUCCESS';
}

}


ک

فیلد های customer_type_id,lead_source_id,member_id,....کل ید خارجین و نال پذیر ولی وقتی با مقدار نال مرن سمت مدل عمل سیو انجام نمشه ولی وقتی همونا با مقدار مرن مشه
در ضمن مقادیر کلید خارجیام به صورت پیش فرض تو فرمم اینجوره '' ( تو کمبو اوردم ایتمامو و اپشن اول پیش فرض و مقدارش '')

aphpdeveloper
پنج شنبه 14 اسفند 1393, 18:33 عصر
در مدلتون جزو قوانین گذاشتین که این فیلدها حتما integer باشند. فیلدهای کلید خارجی رو از این آرایه حذف کنید.
array( 'register_number,
economy_code,
national_id,
staff_number,
post_code,
post_box,
send_email_flag,
send_fax_flag,
city_id,
status_organize_id,
lead_source_id,
customer_type_id,

industry_id,
marketer_id,

member_id',
'numerical', 'integerOnly'=>true

),
موفق باشید.

MMSHFE
جمعه 15 اسفند 1393, 09:05 صبح
نه نباید حذف کنید (اگه rule نداشته باشن توی Mass Assignment مقدار نمیگیرن). بجاش باید allowEmpty رو فعال کنید. مثال:

array('economy_code', 'numerical', 'integerOnly'=>true, 'allowEmpty'=>true),

ضمناً رول safe رو هم بردارین چون با وجود اون دیگه numerical چک نمیشه. safe یعنی فقط Escape کنه و هیچ Validation Rule خاصی برای اون فیلد ندارین. معمولاً برای فیلدهایی مثل توضیحات و... این رول رو میگذارن.

jionelmessi
شنبه 16 اسفند 1393, 10:46 صبح
من allowempty فعال کردم ولی باز جواب نداد

jionelmessi
شنبه 16 اسفند 1393, 11:15 صبح
اشکال کارو پیدا کردم

allowEmpty جواب نداد چون yii فیلدهای integer اگر خالی یا '' باشند تبدیل مکنه به صفر و از اونجایی که ما فیلد کلید خارجی نداریم تو جدولمون با یدی صفر مای اسکیو ال ارور مده و کار انجام نمشه
برای این که ما بتونیم foregin key با قابلیت نال پذیر داشته باشیم متونیم از این کد استفاده کنیم





public function beforeSave()
{
//get foreign keys of this model
$arrayForeignKeys = $this->tableSchema->foreignKeys;
//go throutout attributes
foreach ($this->attributes as $name=>$value)
{
//check current attribute is member of foreign keys?
//and check this foreign key is nullable and is current value equal to ''
if (array_key_exists($name, $arrayForeignKeys) && $this->metadata->columns[$name]->allowNull && trim($value)=='')
{
//change value to null.
$this->$name = null;
}
}

return parent::beforeSave();
}







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

MMSHFE
شنبه 16 اسفند 1393, 19:32 عصر
این متد رو به مدلتون اضافه کنید:

public function beforeValidate()
{
if(!(intval($this->register_number) > 0)) {
$this->register_number = null;
}
// do the same for other numeric fields
return parent::beforeValidate();
}
ببینید مشکل برطرف میشه یا نه.