Как обновить изображение с картинки на странице? - PullRequest
5 голосов
/ 29 мая 2011

Я хочу, чтобы мой сайт обновлял изображение капчи каждый раз, когда он загружается, поэтому у меня есть метод javascript, запускаемый с событием onload ().Здесь у меня есть следующая строка:

document.getElementById('yw0_button').click;

Firebug не обнаруживает никаких ошибок, и для целей тестирования я добавил предупреждение сразу после отображаемой строки, и предупреждение появляется при каждой загрузке страницы,Однако изображение не обновляется!

Это то, что я считаю уместным в файле просмотра:

<?php if(extension_loaded('gd')): ?>
    <div class="row">
        <?php echo $form->labelEx($model,'verifyCode'); ?>
        <div>
            <?php
            $this->widget('CCaptcha',
                          array('showRefreshButton'=>true,
                                'buttonType'=>'button',
                                'buttonOptions'=>
                                                    array('type'=>'image',
                                                          'src'=>"/path/images/refresh-icon.png",
                                                          'width'=>30,
                                                    ),                                                            
                                'buttonLabel'=>'Refrescar imagen'),
                          false); 
            ?>
            <br>
            <?php echo $form->textField($model,'verifyCode'); ?>
        </div>
    <div class="hint">
        Porfavor ingrese las letras como las ve en la imagen superior.
        <br/>No hay distincion entre minúsculas y mayúsculas.</div>
    </div>
<?php endif; ?>

Есть идеи?


@ k к z только что увидел это!Да, конечно, если бы вы могли помочь мне найти более правильное решение, это было бы здорово!Вот что, по моему мнению, относится к файлу вида:

<?php if(extension_loaded('gd')): ?>
        <div class="row">
            <?php echo $form->labelEx($model,'verifyCode'); ?>
            <div>
                <?php
                $this->widget('CCaptcha',
                              array('showRefreshButton'=>true,
                                    'buttonType'=>'button',
                                    'buttonOptions'=>
                                                        array('type'=>'image',
                                                              'src'=>"/path/images/refresh-icon.png",
                                                              'width'=>30,
                                                        ),                                                            
                                    'buttonLabel'=>'Refrescar imagen'),
                              false); 
                ?>
                <br>
                <?php echo $form->textField($model,'verifyCode'); ?>
            </div>
        <div class="hint">
            Porfavor ingrese las letras como las ve en la imagen superior.
            <br/>No hay distincion entre minúsculas y mayúsculas.</div>
        </div>
    <?php endif; ?>

В контроллере я даю полномочия авторизованным пользователям в методе accessRules () для действия captcha, и это все.Могу ли я опубликовать что-нибудь еще?

Ответы [ 8 ]

6 голосов
/ 31 мая 2011

В случае, если кто-то сталкивается с подобной проблемой во время начала работы с Yii .. Вот так я решил проблему CAPTCHA, вызывающую щелчок: у меня есть событие, инициировавшее событие onload, которое имеет следующий код:

$ ( '# yw0_button') нажмите ();.

Там наверняка должен быть лучший путь, я открыт для предложений! Однако в качестве временного решения это работает просто отлично, обновляя изображение капчи каждый раз при загрузке страницы. Удачи!

РЕДАКТИРОВАТЬ: То, что я сделал, было обработать событие загрузки для моей HTML-страницы, как это

<body onload="initialize()"> 
.. 
</body> 

Тогда в моем файле js:

function initialize() 
{ 
     $('#yw0_button').click(); 
} 
5 голосов
/ 31 марта 2012

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

Я столкнулся с тем же требованием - обновить заголовок при обновлении страницы, но сохранитьэто когда пользовательский ввод недопустим в других полях, потому что повторение нового кода проверки при каждой ошибке проверки раздражает.Таким образом, похоже, что эта задача не обновляет заголовок в запросе POST и обновляет его в противном случае (запрос GET).Решение, предложенное самим Soph , не может этого достичь - как можно знать, POST запросы отправляются на сервер, и их данные не могут быть проанализированы клиентским JavaScript.

ПоэтомуЯ решил посмотреть на реализацию капчи Yii.Он состоит из двух классов, расположенных в пакете system.web.widgets.captcha.Первый CCaptcha расширен от CWidget и который мы используем для добавления капчи в веб-форму следующим образом:

<?php 
    $this->widget("CCaptcha", array(
    'buttonLabel' => "Generate another code",
    'showRefreshButton' => false,
    'clickableImage' => true
));
?>

Последний - CCaptchaAction, который делает большинствозначительная работа по предоставлению капчи путем генерации проверочного кода и создания изображения.Принимая во внимание, что Yii разработан для объектно-ориентированного подхода, мы можем создать пару наших собственных классов Captcha и CaptchaAction, расширенных относительно CCaptcha и CCaptchaAction относительно, и поместить их в подкаталог components нашего веб-приложения.directory.

Моя реализация обоих этих классов приведена ниже.

run() метод CCaptchaAction переопределен и очень похож на оригинальный, за исключением того, что есть еще один if -ветвь выполняется, когда установлен render_refreshed GET-параметр и где новый код проверки генерируется на лету, а соответствующее новое изображение отображается и возвращается как результат действия.

Введена открытая переменная refreshв Captcha классе и по умолчанию false означает, что поведение виджета аналогично поведению CCaptcha.Переопределив метод renderImage, мы изменим код, отвечающий за подготовку выходного HTML-кода виджета.Чтобы быть более точным, именно здесь подготовлена ​​ссылка на действие капчи, используемую как атрибут src тега img.В случае refresh элемент имеет значение true, к этой ссылке добавляется дополнительный параметр render_refreshed.

Вот CaptchaAction.php:

<?php

Yii::import("system.web.widgets.captcha.CCaptchaAction");

class CaptchaAction extends CCaptchaAction
{
    const RENDER_REFRESHED_GET_VAR = "render_refreshed";

    public function run()
    {
        if (isset($_GET[self::REFRESH_GET_VAR]))  // AJAX request for regenerating code
        {
            $code = $this->getVerifyCode(true);
            echo CJSON::encode(array(
                'hash1' => $this->generateValidationHash($code),
                'hash2' => $this->generateValidationHash(strtolower($code)),
                // we add a random 'v' parameter so that FireFox can refresh the image
                // when src attribute of image tag is changed
                'url'=> $this->getController()->createUrl($this->getId(), array(
                    'v' => uniqid()
                )),
            ));
        }
        else if (isset($_GET[self::RENDER_REFRESHED_GET_VAR]))
        {
            $this->renderImage($this->getVerifyCode(true));
        }
        else
            $this->renderImage($this->getVerifyCode());
        Yii::app()->end();
    }
}

И этоCaptcha.php:

<?php

Yii::import("web.system.widgets.CCaptcha");

class Captcha extends CCaptcha
{
    public $refresh = false;

    protected function renderImage()
    {
        if (!isset($this->imageOptions['id']))
            $this->imageOptions['id'] = $this->getId();

        if ($this->refresh)
        {
            $url = $this->getController()->createUrl($this->captchaAction, array(
                'v' => uniqid(),
                CaptchaAction::RENDER_REFRESHED_GET_VAR => 1
            ));
        }
        else
        {
            $url = $this->getController()->createUrl($this->captchaAction, array(
                'v' => uniqid()
            ));
        }
        $alt = isset($this->imageOptions['alt']) ? $this->imageOptions['alt'] : '';
        echo CHtml::image($url, $alt, $this->imageOptions);
    }
}

Таким образом, использование довольно просто.В процессе подготовки данных модели для страницы сайта сделайте следующее:

...

// Creating order model's instance
$model = new MyModel();
$refreshCaptcha = true;

if (isset($_POST['MyModel']))
{
    $refreshCaptcha = false;
    ...
}

...

$this->render("myView", array(
    'model' => $model,
    'refreshCaptcha' => $refreshCaptcha
));

После этого измените вызов виджета капчи в myView шаблоне действия этой страницы:

<?php 
    $this->widget("Captcha", array(
    'buttonLabel' => "Generate another code",
    'showRefreshButton' => false,
    'clickableImage' => true,
    'refresh' => $refreshCaptcha
));

и незабудьте изменить actions метод контроллера страницы, заменив CCaptchaAction class на CaptchaAction:

public function actions()
{
    return array(
        'captcha'=>array(
            'class'=>'CaptchaAction',
            'backColor'=>0xFFFFFF
        )
    );
}

Мне кажется, что он работает как положено.Надеюсь, это кому-нибудь поможет.

1 голос
/ 11 января 2016

Я использовал: http://www.yiiframework.com/extension/captcha-extended/

и измените CaptchaExtendedAction.php (путь: extensions / captchaExtended)

в строке 154

$this->renderImage($this->getVerifyCode());  

до

$this->renderImage($this->getVerifyCode(true));
1 голос
/ 24 июня 2014

Вот еще один (правильный?) Способ сделать это (обсуждение) :

Yii::app()->getController()->createAction('captcha')->getVerifyCode(true);
1 голос
/ 20 декабря 2013

Вы можете написать скрипт до того, как форма beginWedget.

при каждой загрузке страницы генерирует новый код капчи.

  $script=' $(document).ready(function() {

            document.getElementById("yw0_button").click();
    });';
  Yii::app()->clientScript->registerScript('yw0_button', $script);

  $form=$this->beginWidget('CActiveForm', array(
    'id'=>'test-form',
    'action'=>Yii::app()->createUrl('controllerName/actionName'),
    'enableClientValidation'=>true, 
    'clientOptions'=>array(
        'validateOnSubmit'=>true,
    ),
  ));

это работа для меня.

Я надеюсь, что это также работает для вас

1 голос
/ 27 ноября 2012

Добавить этот JavaScript:

jQuery(document).ready(function() {
    jQuery.ajax({
        'success':function(html){jQuery("#yw0").attr("src",html)},
        'url':'/checkout/finish/captcha?refresh=1',
        'cache':false
    });
    return false;
});
1 голос
/ 26 октября 2012

Я хотел бы добавить что-то к ответу Ezze:

Чтобы сделать clientValidation работающим, вы можете использовать пользовательскую проверку капчи:

class CaptchaValidatorRefresh extends CCaptchaValidator
{
    public function clientValidateAttribute($object,$attribute)
{
    $js="";

    if(!$this->allowEmpty)
    {
        $message=$this->message!==null ? $this->message : Yii::t('yii','The verification code is incorrect.');

        $js="
            if($.trim(value)=='') {
                messages.push(".CJSON::encode($message).");
            }
        ";
    }       
    return $js;
    }
}

, а затем

public function rules()
{
    return array(
        array('verifyCode', 'CaptchaValidatorRefresh', 'on'=>'request', 'allowEmpty'=>!CCaptcha::checkRequirements()),                          
    );
}
0 голосов
/ 15 июля 2016

У меня есть лучшее решение для вас, ребята:

public function beforeAction($action)
{
    if($action->id == 'captcha'){
        $action->getVerifyCode(true);
    }
    return parent::beforeAction($action); 
}

Поместите эти коды в контроллер, в который вы включили действие капчи!

...