PDA

View Full Version : نمایش ندادن ارور های ساخته شده با adderror !!



redhat2
دوشنبه 28 بهمن 1392, 17:13 عصر
سلام ، من یه سیستم register دارم ، که در این سیستم از Bootstrap تویتر استفاده کردم ، حالا یه مشکلی دارم ، توی register من client validation و ajax validation را فعال کردم ، ارور های که در کل مربوط به client میشن کار می کنن یعنی اگه اروری وجود داشته باشه ، textfield رو قرمز می کنند ولی اروری که من در 2تا متد checkUsername و checkEmail در مدل آوردم با وجود اینکه کار می کنن ( یعنی اگه getErrors بیگریم نشون داده میشن ) ، ولی در خود صفحه نشون داده نمیشن و یا مثلا textbox را قرمز نمی کنند و یا ارور را نشون نمیدن ، میخوام بدونم مشکل کجاست ؟
users model :


<?php

/**
* This is the model class for table "{{users}}".
*
* The followings are the available columns in table '{{users}}':
* @property integer $id
* @property string $username
* @property string $password
* @property string $email
* @property string $firstname
* @property string $lastname
* @property string $date_entered
* @property string $date_updated
*/
class Users extends CActiveRecord {

public $rpassword;

/**
* @return string the associated database table name
*/
public function tableName() {
return '{{users}}';
}

/**
* @return array validation rules for model attributes.
*/
public function rules() {
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('username, password,rpassword, email', 'required', "message" => Yii::t("register", "emptyField")),
array('username, password', 'length', 'min' => 6, 'max' => 12, "tooShort" => Yii::t("register", "wronglength")),
array('rpassword', 'compare', 'compareAttribute' => 'password', 'message' => Yii::t("register", "wrongrpassword")),
array('email', 'email', 'message' => Yii::t("register", "wrongemail")),
array('firstname,lastname', 'default', 'value' => null),
array('subscribe', 'numerical', 'integerOnly' => true),
array('username', 'checkUsername'),
array('email', 'checkEmail'),
array('date_entered, date_updated', 'safe'),
// The following rule is used by search().
// @todo Please remove those attributes that should not be searched.
array('id, username, password, email, firstname, lastname, date_entered, date_updated', 'safe', 'on' => 'search'),
);
}

/**
* @return array relational rules.
*/
public function relations() {
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
);
}

public function checkUsername() {
$user = $this->findByAttributes(array("username" => $this->username));
if ($user) {
$this->addError($this->username, Yii::t("register", "usernameExist"));
}
}

public function checkEmail() {
$email = $this->findByAttributes(array("email" => $this->email));
if ($email) {
$this->addError($this->email, Yii::t("register", "usernameExist"));
}
}

/**
* @return array customized attribute labels (name=>label)
*/
public function attributeLabels() {
return array(
'username' => Yii::t("register", "username"),
'password' => Yii::t("register", "password"),
"rpassword" => Yii::t("register", "rpassword"),
'email' => Yii::t("register", "email"),
'firstname' => Yii::t("register", "firstname"),
'lastname' => Yii::t("register", "lastname"),
'subscribe' => Yii::t("register", "subscribe"),
);
}

/**
* Retrieves a list of models based on the current search/filter conditions.
*
* Typical usecase:
* - Initialize the model fields with values from filter form.
* - Execute this method to get CActiveDataProvider instance which will filter
* models according to data in model fields.
* - Pass data provider to CGridView, CListView or any similar widget.
*
* @return CActiveDataProvider the data provider that can return the models
* based on the search/filter conditions.
*/
public function search() {
// @todo Please modify the following code to remove attributes that should not be searched.

$criteria = new CDbCriteria;

$criteria->compare('id', $this->id);
$criteria->compare('username', $this->username, true);
$criteria->compare('password', $this->password, true);
$criteria->compare('email', $this->email, true);
$criteria->compare('firstname', $this->firstname, true);
$criteria->compare('lastname', $this->lastname, true);
$criteria->compare('date_entered', $this->date_entered, true);
$criteria->compare('date_updated', $this->date_updated, true);

return new CActiveDataProvider($this, array(
'criteria

' => $criteria,
));
}

/**
* Returns the static model of the specified AR class.
* Please note that you should have this exact method in all your CActiveRecord descendants!
* @param string $className active record class name.
* @return Users the static model class
*/
public static function model($className = __CLASS__) {
return parent::model($className);
}

}



register.php :


<?php
Yii::app()->clientScript->registerScriptFile($this->module->js . "/register/js.js", CClientScript::POS_HEAD);
?>
<div class="title">
<?php echo CHtml::tag("span", array(), "به مرحله ی ثبت نام خوش آمدید ."); ?>
</div>
<hr>
<div class="alert alert-info">
<?php
echo CHtml::tag("p", array(), "لطفا قبل از ثبت نام ، به موارد زیر توجه فرمایید : ");
echo CHtml::tag("span", array(), " 1 . برای استفاده از تمامی امکانات سایت باید در سایت ثبت نام کنید . ");
echo CHtml::tag("br", array());
echo CHtml::tag("span", array(), " 2 . پذیرش تمامی قوانین سایت قبل از ثبت نام الزامی است ");
echo CHtml::tag("br", array());
echo CHtml::tag("span", array(), "3 . تمامی موارد که با * مشخص شده است را به طور صحیح پر نمایید . ");
?>
</div>
<?php
if ($model->hasErrors()) {
print_r($model->getErrors());
}
?>
<div class="form">
<?php
$form = $this->beginWidget('CActiveForm', array(
'id' => 'register-form',
'enableAjaxValidation' => true,
'enableClientValidation' => true,
'clientOptions' => array(
'validateOnSubmit' => true,
),
'errorMessageCssClass' => 'text-error',
));
?>
<div class="row">
<?php echo $form->labelEx($model, 'username', array('class' => 'control-label')); ?>
<?php
echo $form->textField($model, 'username', array(
"data-placement" => "top",
"data-toggle" => "tooltip",
"data-trigger" => "focus",
"data-original-title" => Yii::t("register", "correctCharacter"),
));
?>
<?php echo $form->error($model, 'username', array('errorCssClass' => 'control-group error', 'successCssClass' => 'control-group success')); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model, 'password', array('class' => 'control-label')); ?>
<?php
echo $form->passwordField($model, 'password', array(
"data-placement" => "top",
"data-toggle" => "tooltip",
"data-trigger" => "focus",
"data-original-title" => Yii::t("register", "strongPassword"),
));
?>
<?php echo $form->error($model, 'password', array('errorCssClass' => 'control-group error', 'successCssClass' => 'control-group success')); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model, 'rpassword', array('class' => 'control-label')); ?>
<?php echo $form->passwordField($model, 'rpassword'); ?>
<?php echo $form->error($model, 'rpassword', array('errorCssClass' => 'control-group error', 'successCssClass' => 'control-group success')); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model, 'email', array('class' => 'control-label')); ?>
<?php
echo $form->textField($model, 'email', array(
"data-placement" => "top",
"data-toggle" => "tooltip",
"data-trigger" => "focus",
"data-original-title" => Yii::t("register", "emailtooltip"),
));
?>
<?php echo $form->error($model, 'email', array('errorCssClass' => 'control-group error', 'successCssClass' => 'control-group success')); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model, 'firstname', array('class' => 'control-label')); ?>
<?php
echo $form->textField($model, 'firstname', array(
"data-placement" => "top",
"data-toggle" => "tooltip",
"data-trigger" => "focus",
"data-original-title" => Yii::t("register", "optionalField"),
));
?>
<?php echo $form->error($model, 'firstname', array('errorCssClass' => 'control-group error', 'successCssClass' => 'control-group success')); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model, 'lastname', array('class' => 'control-label')); ?>
<?php
echo $form->textField($model, 'lastname', array(
"data-placement" => "top",
"data-toggle" => "tooltip",
"data-trigger" => "focus",
"data-original-title" => Yii::t("register", "optionalField"),
));
?>
<?php echo $form->error($model, 'lastname', array('errorCssClass' => 'control-group error', 'successCssClass' => 'control-group success')); ?>
</div>
<div class="row">
<?php echo $form->checkBox($model, 'subscribe'); ?>
<?php echo $form->labelEx($model, 'subscribe', array('class' => 'control-label')); ?>
</div>
<div class="row">
<?php
echo CHtml::submitButton("ثبت نام ", array("class" => "btn btn-success"));
echo CHtml::link("انصراف", Yii::app()->createUrl("home"), array("class" => "btn btn-primary"));
?>
</div>
<?php
$this->endWidget();
?>
</div>



و action register :



$model = new Users;

if (isset($_POST['ajax']) && $_POST['ajax'] === 'register-form') {
echo CActiveForm::validate($model);
Yii::app()->end();
}

if (isset($_POST['Users'])) {
$model->attributes = $_POST['Users'];
if ($model->validate()) {

}
}
$this->render('register', array('model' => $model));


اگه مفهوم نبود ، بگین تا کل پروژه را آپ کنم . ممنون میشم .

آپدیت : اینم یه عکس از صفحه register که ارور های مربوط به 2 تا متد را با print نشون میده ولی روی textbox اعمال نمی کنه یا حتی روی label error .

MMSHFE
سه شنبه 29 بهمن 1392, 20:55 عصر
اگه ممکنه کل پروژه رو با یک نسخه از Backup دیتابیس بگذارین یا TeamViewer بدین ببینم مشکل از کجاست.

afshin9032
سه شنبه 29 بهمن 1392, 23:47 عصر
فکر می کنم addError رو اشتباه استفاده کردی .

شیوه صحیح :


$this->addError("username", Yii::t("register", "usernameExist"));
$this->addError("email", Yii::t("register", "usernameExist"));

afshin9032
سه شنبه 29 بهمن 1392, 23:50 عصر
این توابع که خودتون تعریف کردید در Client Validation معمولا کار نمیکنه ، اما فکر می کنم در ajax validation جواب میده .

MMSHFE
چهارشنبه 30 بهمن 1392, 09:47 صبح
برای اضافه کردن Validation سفارشی خودتون، باید متدهای validateAttributes و clientValidateAttributes رو با هم، Override کنید. چرا از ولیدیشن unique خود Yii استفاده نمیکنید؟!