PDA

View Full Version : مشکل با زبان فارسی زمانی که از validate در Model استفاده میکنم



AmirAmiri
شنبه 16 شهریور 1392, 18:31 عصر
سلام و خسته نباشید خدمت اساتید محترم.
یه مشکلی که با کیک نسخه 2.3.8 پیدا کردم اینه که موفع validate کردن مدل دیگه امکان دریافت کاراکترهای فارسی رو از کاربر میگیره. یعنی یونیکد نیست.
کدی که برای مدل گذاشتم اینه :

<?php

class Message extends AppModel {

public $validate = array(
'name' => 'noEmpty',
'family' => 'noEmpty',
'email' => 'email',
'subject' => 'noEmpty',
'message' => 'noEmpty'
);

}


کد مربوط به view هم اینه :

<?php

echo $this->Form->create('Message');
echo $this->Form->inputs(array(
'legend' => __('Message'),
'name' => array('label' => __('Name')),
'family' => array('label' => __('Family')),
'email' => array('label' => __('Email')),
'subject' => array('label' => __('Subject')),
'message' => array('label' => __('Message'), 'rows' => 8,'cols'=>80)
));
echo $this->Form->end(__('Send'));
?>

و اما همه چیز درسته و کار میکنه به غیر از زمانی که از حروف یونیکد مثل حروف فارسی استفاده میکنم. :ناراحت:
وقتی حروف فارسی رو استفاده میکنم بعد از postback این خطا نشون داده میشه :


Warning (2): preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash [CORE\Cake\Model\Validator\CakeValidationRule.php, line 281]
Code Context
preg_match - [internal], line ??
CakeValidationRule::process() - CORE\Cake\Model\Validator\CakeValidationRule.php, line 281
CakeValidationSet::validate() - CORE\Cake\Model\Validator\CakeValidationSet.php, line 137
ModelValidator::errors() - CORE\Cake\Model\ModelValidator.php, line 260
ModelValidator::validates() - CORE\Cake\Model\ModelValidator.php, line 100
Model::validates() - CORE\Cake\Model\Model.php, line 3074
Model::save() - CORE\Cake\Model\Model.php, line 1658
MessagesController::add() - APP\Controller\MessagesController.php, line 19
ReflectionMethod::invokeArgs() - [internal], line ??
Controller::invokeAction() - CORE\Cake\Controller\Controller.php, line 486
Dispatcher::_invoke() - CORE\Cake\Routing\Dispatcher.php, line 187
Dispatcher::dispatch() - CORE\Cake\Routing\Dispatcher.php, line 162
[main] - APP\webroot\index.php, line 52

این در حالیه که برای حروف انگلیسی هیچ مشکلی وجود نداره و حتی هنگامی که validate رو از مدل برمیدارم بازم مشکلی با حروف فارسی نداره و مشکل با حروف فارسی فقط و فقط زمان Validate کردن مدل اتفاق میفته :متفکر:

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

zoghal
یک شنبه 17 شهریور 1392, 07:12 صبح
درود بر شما، شما دقیقا همین رو دارید استفاده می کنید در فرم؟ و مدلتون؟ اینجا هیچ متن فارسی که دیده نمیشه! پس لطفا رول های تعریف شده معتبر سازی تون رو کامل بزارید.
اما اللحساب شما بهتره همیشه رول ها رو کامل تعریف کنید.


public $validate = array( 'fieldName1' => array( 'rule' => 'ruleName', // or: array('ruleName', 'param1', 'param2' ...) 'required' => true, 'allowEmpty' => false, 'on' => 'create', // or: 'update' 'message' => 'Your Error Message' ) );





در ضمن زیر متن خطا دوتا لینک هست (Code Context) روشون کلیک کنید. متون داخلش رو هم قرار بدید تا بهتر بتونیم به شما کمک کنیم.

AmirAmiri
یک شنبه 17 شهریور 1392, 10:07 صبح
با تشکر از پاسخ و توجه شما دوست عزیز.
در حقیقت قبل از اینکه قوانین (rule ها) رو به صورت Simple تعریف کنم، از روش Multiple که شما فرمودید استفاده کرده بودم و همین مشکل همچنان وجود داشت.
این سایتی که دارم طراحی میکنم یک سایت سه زبانه ست که زبان پیشفرض اون انگلیسیه به همین خاطر متن فارسی توی فرم دیده نمیشه اما از مبدل متن و زبان استفاده کردم که در صورت فارسی شدن سایت نیز اطلاعات و متون این فرم تبدیل به متون فارسی میشه.

یک مثال از اتفاقی که میفته میزنم شاید بهتر مطلب رو برسونه.
فرض کنید صفحه لود شده و فرم آماده ورود اطلاعات هست. با داده های انگلیسی کاملا درست کار میکنه و اعتبارسنجی هم درست کار میکنه و همچنین اطلاعات در Database به درستی ذخیره میشه.
اما وقتی یکی یا چندی از فیلدها رو با داده های فارسی پر میکنم به عنوان مثال برای نام ==> امیر وارد میکنم، بعد از زدن دکمه ارسال و پست بک شدن صفحه، به تعداد فیلدهایی که فارسی وارد کردم خطایی که قبلا ذکر کرده بودم رو نشون میده و متن فارسی هم کاملا متفاوت از چیزی که وارد کردم توی فیلد قرار میگیره
مثلا فیلد نام که با داده ی ==> امیر پر شده بود حالا تبدیل به این متن شده ==> ط§ظ…غŒط±
با این تفاسیر حدس من اینه که اعتبارسنجی برای داده های یونیکد کار نمیکنه یا شایدم مشکل از جای دیگه ای باشه.

در مورد (Code Conten) هم این اطلاعات رو نشون میداد امیدوارم بتونه کمک کنه :

$field = 'name'
$data = array(
'visited' => '0',
'name' => 'ط§ظ…غŒط±',
'family' => 'ط¸â€‍ط¸â€‍',
'email' => 'amir@yahoo.com',
'subject' => 'ط؛إ’ط·آ¨ط؛إ’',
'message' => 'ط¸â€‍ط¸â€‍'
)
$methods = array(
'schema' => '*****',
'__construct' => array(
(int) 0 => object(Message) {},
(int) 1 => '__construct'
),
'implementedevents' => array(
(int) 0 => object(Message) {},
(int) 1 => 'implementedEvents'
),
'geteventmanager' => array(
(int) 0 => object(Message) {},
(int) 1 => 'getEventManager'
),
'__call' => array(
(int) 0 => object(Message) {},
(int) 1 => '__call'
),
'__isset' => array(
(int) 0 => object(Message) {},
(int) 1 => '__isset'
),
'__get' => array(
(int) 0 => object(Message) {},
(int) 1 => '__get'
),
'bindmodel' => array(
(int) 0 => object(Message) {},
(int) 1 => 'bindModel'
),
'unbindmodel' => array(
(int) 0 => object(Message) {},
(int) 1 => 'unbindModel'
),
'setsource' => array(
(int) 0 => object(Message) {},
(int) 1 => 'setSource'
),
'set' => array(
(int) 0 => object(Message) {},
(int) 1 => 'set'
),
'deconstruct' => array(
(int) 0 => object(Message) {},
(int) 1 => 'deconstruct'
),
'getcolumntypes' => array(
(int) 0 => object(Message) {},
(int) 1 => 'getColumnTypes'
),
'getcolumntype' => array(
(int) 0 => object(Message) {},
(int) 1 => 'getColumnType'
),
'hasfield' => array(
(int) 0 => object(Message) {},
(int) 1 => 'hasField'
),
'hasmethod' => array(
(int) 0 => object(Message) {},
(int) 1 => 'hasMethod'
),
'isvirtualfield' => array(
(int) 0 => object(Message) {},
(int) 1 => 'isVirtualField'
),
'getvirtualfield' => array(
(int) 0 => object(Message) {},
(int) 1 => 'getVirtualField'
),
'create' => array(
(int) 0 => object(Message) {},
(int) 1 => 'create'
),
'clear' => array(
(int) 0 => object(Message) {},
(int) 1 => 'clear'
),
'read' => array(
(int) 0 => object(Message) {},
(int) 1 => 'read'
),
'field' => array(
(int) 0 => object(Message) {},
(int) 1 => 'field'
),
'savefield' => array(
(int) 0 => object(Message) {},
(int) 1 => 'saveField'
),
'save' => array(
(int) 0 => object(Message) {},
(int) 1 => 'save'
),
'updatecountercache' => array(
(int) 0 => object(Message) {},
(int) 1 => 'updateCounterCache'
),
'saveall' => array(
(int) 0 => object(Message) {},
(int) 1 => 'saveAll'
),
'savemany' => array(
(int) 0 => object(Message) {},
(int) 1 => 'saveMany'
),
'validatemany' => array(
(int) 0 => object(Message) {},
(int) 1 => 'validateMany'
),
'saveassociated' => array(
(int) 0 => object(Message) {},
(int) 1 => 'saveAssociated'
),
'validateassociated' => array(
(int) 0 => object(Message) {},
(int) 1 => 'validateAssociated'
),
'updateall' => array(
(int) 0 => object(Message) {},
(int) 1 => 'updateAll'
),
'delete' => array(
(int) 0 => object(Message) {},
(int) 1 => 'delete'
),
'deleteall' => array(
(int) 0 => object(Message) {},
(int) 1 => 'deleteAll'
),
'exists' => array(
(int) 0 => object(Message) {},
(int) 1 => 'exists'
),
'hasany' => array(
(int) 0 => object(Message) {},
(int) 1 => 'hasAny'
),
'find' => array(
(int) 0 => object(Message) {},
(int) 1 => 'find'
),
'buildquery' => array(
(int) 0 => object(Message) {},
(int) 1 => 'buildQuery'
),
'resetassociations' => array(
(int) 0 => object(Message) {},
(int) 1 => 'resetAssociations'
),
'isunique' => array(
(int) 0 => object(Message) {},
(int) 1 => 'isUnique'
),
'query' => array(
(int) 0 => object(Message) {},
(int) 1 => 'query'
),
'validates' => array(
(int) 0 => object(Message) {},
(int) 1 => 'validates'
),
'invalidfields' => array(
(int) 0 => object(Message) {},
(int) 1 => 'invalidFields'
),
'invalidate' => array(
(int) 0 => object(Message) {},
(int) 1 => 'invalidate'
),
'isforeignkey' => array(
(int) 0 => object(Message) {},
(int) 1 => 'isForeignKey'
),
'escapefield' => array(
(int) 0 => object(Message) {},
(int) 1 => 'escapeField'
),
'getid' => array(
(int) 0 => object(Message) {},
(int) 1 => 'getID'
),
'getlastinsertid' => array(
(int) 0 => object(Message) {},
(int) 1 => 'getLastInsertID'
),
'getinsertid' => array(
(int) 0 => object(Message) {},
(int) 1 => 'getInsertID'
),
'setinsertid' => array(
(int) 0 => object(Message) {},
(int) 1 => 'setInsertID'
),
'getnumrows' => array(
(int) 0 => object(Message) {},
(int) 1 => 'getNumRows'
),
'getaffectedrows' => array(
(int) 0 => object(Message) {},
(int) 1 => 'getAffectedRows'
),
'setdatasource' => array(
(int) 0 => object(Message) {},
(int) 1 => 'setDataSource'
),
'getdatasource' => array(
(int) 0 => object(Message) {},
(int) 1 => 'getDataSource'
),
'associations' => array(
(int) 0 => object(Message) {},
(int) 1 => 'associations'
),
'getassociated' => array(
(int) 0 => object(Message) {},
(int) 1 => 'getAssociated'
),
'joinmodel' => array(
(int) 0 => object(Message) {},
(int) 1 => 'joinModel'
),
'beforefind' => array(
(int) 0 => object(Message) {},
(int) 1 => 'beforeFind'
),
'afterfind' => array(
(int) 0 => object(Message) {},
(int) 1 => 'afterFind'
),
'beforesave' => array(
(int) 0 => object(Message) {},
(int) 1 => 'beforeSave'
),
'aftersave' => array(
(int) 0 => object(Message) {},
(int) 1 => 'afterSave'
),
'beforedelete' => array(
(int) 0 => object(Message) {},
(int) 1 => 'beforeDelete'
),
'afterdelete' => array(
(int) 0 => object(Message) {},
(int) 1 => 'afterDelete'
),
'beforevalidate' => array(
(int) 0 => object(Message) {},
(int) 1 => 'beforeValidate'
),
'aftervalidate' => array(
(int) 0 => object(Message) {},
(int) 1 => 'afterValidate'
),
'onerror' => array(
(int) 0 => object(Message) {},
(int) 1 => 'onError'
),
'validator' => array(
(int) 0 => object(Message) {},
(int) 1 => 'validator'
),
'tostring' => array(
(int) 0 => object(Message) {},
(int) 1 => 'toString'
),
'requestaction' => array(
(int) 0 => object(Message) {},
(int) 1 => 'requestAction'
),
'dispatchmethod' => array(
(int) 0 => object(Message) {},
(int) 1 => 'dispatchMethod'
),
'log' => array(
(int) 0 => object(Message) {},
(int) 1 => 'log'
)
)
$validator = array(
'rule' => 'noEmpty',
'required' => null,
'allowEmpty' => null,
'on' => null,
'last' => true,
'message' => null
)
$rule = 'noempty'


اگه ممکنه در این زمینه راهنمایی کنید ممنون میشم.
موفق و پیروز باشید.

zoghal
یک شنبه 17 شهریور 1392, 17:19 عصر
درود مجدد
این که کدینگ صفحه عوض میشه مربوط به خطایی هست که ایجاد میشه. و بر میگرده به لایوت و ...


اما مشکل شما اینه که رول name , سایر فیلد ها رو noEmpty تعریف کردید. در اصل notEmpty هست. به رول ها دقت کافی داشته باشید.

AmirAmiri
یک شنبه 17 شهریور 1392, 23:37 عصر
کاملا درست میفرمایید اشتباه از من بود :(
اینا هش بخاطر بی دقتیه من بود. الان که notEmpty کردمش همش درست شد. بازم ازتون ممنونم. خیلی لطف کردید.