PDA

View Full Version : اضافه کردن کپچا به یه اکشن خاص (حل شد)



Tarragon
جمعه 04 بهمن 1392, 19:24 عصر
با سلام
من می خوام به اکشن create از مدل user کپچا اضافه کنم.
خواستم روشش رو بپرسم.:بوس:
با تشکر

engmmrj
جمعه 04 بهمن 1392, 19:40 عصر
ابتدا باید cpatcha را به controller اضافه کنی

public function actions()
{
return array(
// captcha action renders the CAPTCHA image displayed on the contact page
'captcha'=>array(
'class'=>'CCaptchaAction',
'backColor'=>0xFFFFFF,
),



);
}
بعد به فرم مورد نظر در view

<?php if(CCaptcha::checkRequirements()): ?>
<div class="row">
<?php echo $form->labelEx($model,'verifyCode'); ?>
<div>
<?php $this->widget('CCaptcha'); ?>
<?php echo $form->textField($model,'verifyCode'); ?>
</div>
<div class="hint">Please enter the letters as they are shown in the image above.
<br/>Letters are not case-sensitive.</div>
<?php echo $form->error($model,'verifyCode'); ?>
</div>
<?php endif; ?>

برای verifyCode هم باید در validate مدل قطعه کد زیر را اضافه کنی

array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements()),

Tarragon
جمعه 04 بهمن 1392, 20:36 عصر
سلام
خب کجا تعیین کنیم فقط به اکشن create باشه؟!

engmmrj
جمعه 04 بهمن 1392, 21:04 عصر
در متد rules

array('verifyCode', 'captcha','captchaAction' => '/controller/actions', 'allowEmpty'=>!CCaptcha::checkRequirements()),

Tarragon
شنبه 05 بهمن 1392, 14:20 عصر
این ارور رو داد :
CInlineAction and its behaviors do not have a method or closure named "validate".

Tarragon
یک شنبه 06 بهمن 1392, 14:36 عصر
ممنون می شم اگرجواب بدید.

MMSHFE
دوشنبه 07 بهمن 1392, 16:35 عصر
من این کارها رو توی همون پروژه Trackstar انجام دادم و جواب گرفتم. البته بعضی کارها اضافه است و ضروری نیست و صرفاً چون میخواستم کار تر و تمیز باشه، انجام دادم.
1- این خط رو به انتهای ویجت CMenu توی فایل themes/newtheme/views/layouts/main.php اضافه کردم تا منوی Register به آخر منوهای بالای صفحه اضافه بشه:

array('label'=>'Register', 'url'=>array('/user/register'), 'visible'=>Yii::app()->user->isGuest),
2- یک rule به اول ruleهای موجود در protected/components/Controller.php اضافه کردم تا اکشنهای register و captcha در دسترس همه کاربران باشن:


array('allow',
'controllers' => array('user'),
'actions' => array('register', 'captcha'),
'users' => array('*'),
),

3- به کنترلر User (فایل protected/controllers/UserController.php) این اکشن رو اضافه کردم:


/**
* Register a new model.
* If registration is successful, the browser will be redirected to the 'view' page.
*/
public function actionRegister() {
$this->layout = '//layouts/column1';
$model = new User;
$model->scenario = 'register';
if(isset($_POST['User'])) {
$model->attributes = $_POST['User'];
if($model->save())
$this->redirect(array('view', 'id' => $model->id));
}

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

4- به مدل User (فایل protected/models/User.php) این فیلد رو اضافه کردم:

public $verifyCode;
5- به همون مدل، این validation ruleها رو هم (توی متد rules) اضافه کردم:


array('verifyCode', 'captcha', 'on' => 'register', 'allowEmpty'=>!CCaptcha::checkRequirements()),
array('verifyCode', 'required', 'on' => 'register'),

6- دوباره توی همون مدل، این label رو هم برای CAPTCHA به انتهای آرایه متد attributeLabels اضافه کردم:

'verifyCode' => 'Security Code',
6- یک ویوی جدید به اسم register (فایل protected/views/user/register.php) تعریف کردم:


<?php
/* @var $this UserController */
/* @var $model User */
/* @var $form CActiveForm */

$this->breadcrumbs=array(
'Users'=>array('index'),
'Register',
);
?>

<h1>Register a new user</h1>

<div class="form">

<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'user-form',
'enableAjaxValidation'=>false,
)); ?>

<p class="note">Fields with <span class="required">*</span> are required.</p>

<?php echo $form->errorSummary($model); ?>

<div class="row">
<?php echo $form->labelEx($model,'username'); ?>
<?php echo $form->textField($model,'username',array('size'=>60,'maxlength'=>255)); ?>
<?php echo $form->error($model,'username'); ?>
</div>

<div class="row">
<?php echo $form->labelEx($model,'email'); ?>
<?php echo $form->textField($model,'email',array('size'=>60,'maxlength'=>255)); ?>
<?php echo $form->error($model,'email'); ?>
</div>

<div class="row">
<?php echo $form->labelEx($model,'password'); ?>
<?php echo $form->passwordField($model,'password',array('size'=>60,'maxlength'=>255)); ?>
<?php echo $form->error($model,'password'); ?>
</div>

<div class="row">
<?php echo $form->labelEx($model,'password_repeat'); ?>
<?php echo $form->passwordField($model,'password_repeat',array('size '=>60,'maxlength'=>255)); ?>
<?php echo $form->error($model,'password_repeat'); ?>
</div>

<?php if(CCaptcha::checkRequirements()): ?>
<div class="row">
<?php echo $form->labelEx($model,'verifyCode'); ?>
<div>
<?php $this->widget('CCaptcha'); ?>
<?php echo $form->textField($model,'verifyCode'); ?>
</div>
<div class="hint">Please enter the letters as they are shown in the image above.
<br/>Letters are not case-sensitive.</div>
<?php echo $form->error($model,'verifyCode'); ?>
</div>
<?php endif; ?>

<div class="row buttons">
<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
</div>

<?php $this->endWidget(); ?>

</div><!-- form -->

اگه جایی رو متوجه نمیشین، بفرمایید تا توضیح بدم.

Tarragon
دوشنبه 07 بهمن 1392, 20:31 عصر
بسیار ممنونم.
عالی.
کاملا کار کرد.