nepster-web
@nepster-web

Каптча в Yii без модели?

Столкнулся с такой проблемой, я использую на сайте модальные окна и написал простое апи на js для следующей вещи. К примеру нужно принять что то через подтверждение и ввести каптчу.

Допустим это будет сделка между пользователями. Я что то предлагаю, 2 пользователь должен согласиться с условиями и подтвердить.

Собственно при нажатии на кнопку открывается окно в нем текст и каптча. Так вот данное окно может открываться при нажатии на любой элемент с определенным классом.

А в Yii для выхова каптчи требуется передать модель. Мне не нужно передавать модель, как можно инициализировать каптчу не передавая модель?

<div class="form_item">
        <label>Зищитный код:  <span class="necessarily">*</span></label>
        <span style="cursor: pointer;"><?php $this->widget('CCaptcha',  array('showRefreshButton'=>false, 'clickableImage'=>true)); ?></span>
        <div class="clear"></div>
        <div class="inputVerifyCode"><?php echo CHtml::activeTextField($model,'verifyCode', array('placeholder'=>'Введите код','name'=>'verifyCode')); ?></div>
        <div class="error"></div>
    </div>


$model - вот мне нужно просто, проморозить данный пункт.

Подскажите можно ли так сделать?
  • Вопрос задан
  • 3025 просмотров
Решения вопроса 1
AMar4enko
@AMar4enko
Смысл капчи в том, чтобы проверить ее валидность при выполнении каких-то действий.
Как вы это будете делать без модели?
Вы же в курсе, что под моделью в Yii подразумевается не только CActiveRecord, но все, что унаследовано от CModel, например CFormModel?
Поэтому вы можете сделать так:
class AgreementForm extends CFormModel{
      var $captchaText;
      public function rules(){
          return array(
              array('captchaText', 'captcha')
          );
      }
}

// Код контроллера
public function actionAgreement(){
      $form = new AgreementForm();
      $form->attributes = $_POST['AgreementForm'];
      $form->validate();
      if($form->hasErrors()){
      // No way, you've got missed something, dude
      }else{
      // Hooray         
      }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@Nc_Soft
chtml::textfield
Ответ написан
Комментировать
nepster-web
@nepster-web Автор вопроса
А что делать с отсутствием вот этого:

<script type="text/javascript">
/*<![CDATA[*/
jQuery(function($) {

jQuery(document).on('click', '#yw0', function(){
    jQuery.ajax({
        url: "\/my\/path\/captcha?refresh=1",
        dataType: 'json',
        cache: false,
        success: function(data) {
            jQuery('#yw0').attr('src', data['url']);
            jQuery('body').data('captcha.hash', [data['hash1'], data['hash2']]);
        }
    });
    return false;
});

});
/*]]>*/
</script>
Ответ написан
Комментировать
nepster-web
@nepster-web Автор вопроса
там был момент не в том, что я проверяю ее без модели, мне в поле которое создает инпут не нужно было передавать модель, а в контроллере (за ранее не известном) я просто должен получить сам пост с капчей.

Зачем это нужно было:
Для апи окон подтверждения. К примеру если я хочу сделать какуе-то операцию с финансами. Например пользователь покупает что-то на сайте, ему нужно показать пользовательское соглашение и каптчу. При этот в виде у меня модель которая просто достает на экран список услуг и ничего не валидирует. А подтверждение кидает пользователя совсем на другой контроллер, который работает совершенно с другими моделями. Я же не буду в модуля тянуть модель другого модуля и только ради каптчи.

Поэтому я вообще отошел от этого варианта. Я нашел тему где жаловались на весьма слабенькую документацию по YII, там приводились примеры, которых нет в документации и я нашел для себя как раз вариант с каптчей.

Теперь каптча находится всегда в 1 экшине, и этот js код я вынес себе в js файл, где могу наконец управлять сменой кода. Все вышло очень хорошо без всяких гамалаев.

Ваш Вариант попробую рассмотреть, спасибо!
Ответ написан
Комментировать
@densol7
<script type="text/javascript">
/*<![CDATA[*/
jQuery(function($) {

jQuery(document).on('click', '#yw0', function(){
    jQuery.ajax({
        url: "\/my\/path\/captcha?refresh=1",
        dataType: 'json',
        cache: false,
        success: function(data) {
            jQuery('#yw0').attr('src', data['url']);
            jQuery('body').data('captcha.hash', [data['hash1'], data['hash2']]);
        }
    });
    return false;
});

});
/*]]>*/
</script>


Подскажите исходники каптчи, хочу добавиь себе на сайт
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы