Spec-Zone.ru › Yii 1.1

CCaptchaAction

Пакет system.web.widgets.captcha
Наследование class CCaptchaAction » CAction » CComponent
Реализует IAction
С версии 1.0
Исходный код framework/web/widgets/captcha/CCaptchaAction.php
CCaptchaAction отображает изображение CAPTCHA.

CCaptchaAction используется вместе с CCaptcha и CCaptchaValidator для предоставления функции CAPTCHA.

Вы должны настроить свойства CCaptchaAction для настройки внешнего вида сгенерированного изображения.

Обратите внимание, что CCaptchaAction требует расширения PHP GD2.

Использование CAPTCHA включает следующие шаги:
  1. Переопределите CController::actions() и зарегистрируйте действие класса CCaptchaAction с идентификатором 'captcha'.
  2. В модели формы укажите атрибут для хранения введенного пользователем кода проверки и укажите, что атрибут должен быть проверен с помощью валидатора 'captcha'.
  3. В представлении контроллера вставьте виджет CCaptcha в форму.

Общественные свойства

Свойство Тип Описание Определено
backColor integer цвет фона. CCaptchaAction
backend string графическое расширение, которое будет использоваться для рисования изображения CAPTCHA. CCaptchaAction
controller CController контроллер, которому принадлежит это действие. CAction
fixedVerifyCode string фиксированный код проверки. CCaptchaAction
fontFile string файл шрифта TrueType. CCaptchaAction
foreColor integer цвет шрифта. CCaptchaAction
height integer высота сгенерированного изображения CAPTCHA. CCaptchaAction
id string идентификатор этого действия CAction
maxLength integer максимальная длина случайно сгенерированного слова. CCaptchaAction
minLength integer минимальная длина случайно сгенерированного слова. CCaptchaAction
offset integer смещение между символами. CCaptchaAction
padding integer отступ вокруг текста. CCaptchaAction
testLimit integer сколько раз должно отображаться то же CAPTCHA. CCaptchaAction
transparent boolean использовать ли прозрачный фон. CCaptchaAction
verifyCode string Получает код проверки. CCaptchaAction
width integer ширина сгенерированного изображения CAPTCHA. CCaptchaAction

Защищенные свойства

Свойство Тип Описание Определено
sessionKey string Возвращает имя переменной сеанса, используемой для хранения кода проверки. CCaptchaAction

Общедоступные методы

Метод Описание Определено в
__call() Вызывает метод с указанным именем, который не является методом класса. CComponent
__construct() Конструктор. CAction
__get() Возвращает значение свойства, список обработчиков событий или поведение по его имени. CComponent
__isset() Проверяет, является ли значение свойства null. CComponent
__set() Устанавливает значение свойства компонента. CComponent
__unset() Устанавливает свойство компонента в null. CComponent
asa() Возвращает объект поведения с указанным именем. CComponent
attachBehavior() Прикрепляет поведение к этому компоненту. CComponent
attachBehaviors() Прикрепляет список поведений к компоненту. CComponent
attachEventHandler() Прикрепляет обработчик событий к событию. CComponent
canGetProperty() Определяет, можно ли прочитать свойство. CComponent
canSetProperty() Определяет, можно ли установить свойство. CComponent
detachBehavior() Отсоединяет поведение от компонента. CComponent
detachBehaviors() Отсоединяет все поведения от компонента. CComponent
detachEventHandler() Отсоединяет существующий обработчик событий. CComponent
disableBehavior() Отключает присоединенное поведение. CComponent
disableBehaviors() Отключает все присоединенные поведения этого компонента. CComponent
enableBehavior() Включает присоединенное поведение. CComponent
enableBehaviors() Включает все присоединенные поведения этого компонента. CComponent
evaluateExpression() Вычисляет PHP-выражение или обратный вызов в контексте этого компонента. CComponent
generateValidationHash() Генерирует хэш-код, который можно использовать для проверки на стороне клиента. CCaptchaAction
getController() Возвращает контроллер, владеющий этим действием. CAction
getEventHandlers() Возвращает список присоединенных обработчиков событий для события. CComponent
getId() Возвращает идентификатор этого действия. CAction
getVerifyCode() Получает код проверки. CCaptchaAction
hasEvent() Определяет, задано ли событие. CComponent
hasEventHandler() Проверяет, имеет ли указанное событие присоединенные обработчики. CComponent
hasProperty() Определяет, определено ли свойство. CComponent
raiseEvent() Вызывает событие. CComponent
run() Выполняет действие. CCaptchaAction
runWithParams() Выполняет действие с предоставленными параметрами запроса. CAction
validate() Проверяет входные данные, чтобы убедиться, что они соответствуют сгенерированному коду. CCaptchaAction

Защищенные методы

Метод Описание Определено в
generateVerifyCode() Генерирует новый код проверки. CCaptchaAction
getSessionKey() Возвращает имя переменной сеанса, используемой для хранения кода проверки. CCaptchaAction
renderImage() Отображает изображение CAPTCHA на основе кода, используя библиотеку, указанную в свойстве $backend. CCaptchaAction
renderImageGD() Отображает изображение CAPTCHA на основе кода, используя библиотеку GD. CCaptchaAction
renderImageImagick() Отображает изображение CAPTCHA на основе кода, используя библиотеку ImageMagick. CCaptchaAction
runWithParamsInternal() Выполняет метод объекта с предоставленными именованными параметрами. CAction

Подробное описание свойств

backColor свойство

public integer $backColor;

цвет фона. Например, 0x55FF00. По умолчанию 0xFFFFFF, что означает белый цвет.

backend свойство (доступно начиная с v1.1.13)

public string $backend;

графический формат, который будет использоваться для отрисовки изображения CAPTCHA. Возможные значения: 'gd', 'imagick' и null. Значение null означает, что будет использоваться резервный режим: ImageMagick имеет приоритет над GD. Значение по умолчанию — null.

fixedVerifyCode свойство (доступно начиная с v1.1.4)

public string $fixedVerifyCode;

фиксированный код проверки. Если это свойство установлено, getVerifyCode всегда будет возвращать это значение. Это в основном используется в автоматических тестах, где необходимо воспроизвести тот же код проверки при каждом запуске тестов. По умолчанию null, что означает, что код проверки будет генерироваться случайным образом.

fontFile свойство

public string $fontFile;

файл шрифта TrueType. По умолчанию SpicyRice.ttf, который предоставляется с выпуском Yii. Обратите внимание, что нелицензионный Duality.ttf был заменен на открытый/бесплатный SpicyRice.ttf с версии 1.1.14.

foreColor свойство

public integer $foreColor;

цвет шрифта. Например, 0x55FF00. По умолчанию 0x2040A0 (синий цвет).

height свойство

public integer $height;

высота сгенерированного изображения CAPTCHA. По умолчанию 50.

maxLength свойство

public integer $maxLength;

максимальная длина случайного слова. По умолчанию 7.

minLength свойство

public integer $minLength;

минимальная длина случайного слова. По умолчанию 6.

offset свойство (доступно начиная с v1.1.7)

public integer $offset;

смещение между символами. По умолчанию -2. Вы можете настроить это свойство, чтобы уменьшить или увеличить читабельность капчи.

padding свойство

public integer $padding;

отступ вокруг текста. По умолчанию 2.

sessionKey свойство только для чтения

protected string getSessionKey()

Возвращает имя переменной сеанса, используемой для хранения кода проверки.

testLimit свойство

public integer $testLimit;

сколько раз должно отображаться то же CAPTCHA. По умолчанию 3. Значение меньше или равно 0 означает, что тест не ограничен (доступно начиная с версии 1.1.2).

transparent свойство

public boolean $transparent;

использовать ли прозрачный фон. По умолчанию значение false.

свойство verifyCode только для чтения

public string getVerifyCode(boolean $regenerate=false)

Возвращает код проверки.

ширина свойство

public integer $width;

ширина сгенерированного изображения CAPTCHA. По умолчанию 120.

Подробное описание методов

generateValidationHash() метод (доступен начиная с v1.1.7)

public string generateValidationHash(string $code)
$code строка код CAPTCHA
{return} строка код хэша, сгенерированный из кода CAPTCHA
Исходный код: framework/web/widgets/captcha/CCaptchaAction.php#140 (показать)
public function generateValidationHash($code)
{
    for(
$h=0,$i=strlen($code)-1;$i>=0;--$i)
        
$h+=ord($code[$i]);
    return 
$h;
}

Генерирует код хэша, который может использоваться для проверки на стороне клиента.

generateVerifyCode() метод

protected string generateVerifyCode()
{return} строка сгенерированный код проверки
Исходный код: framework/web/widgets/captcha/CCaptchaAction.php#191 (показать)
protected function generateVerifyCode()
{
    if(
$this->minLength > $this->maxLength)
        
$this->maxLength = $this->minLength;
    if(
$this->minLength < 3)
        
$this->minLength = 3;
    if(
$this->maxLength > 20)
        
$this->maxLength = 20;
    
$length = mt_rand($this->minLength,$this->maxLength);

    
$letters = 'bcdfghjklmnpqrstvwxyz';
    
$vowels = 'aeiou';
    
$code = '';
    for(
$i = 0; $i < $length; ++$i)
    {
        if(
$i % 2 && mt_rand(0,10) > 2 || !($i % 2) && mt_rand(0,10) > 9)
            
$code.=$vowels[mt_rand(0,4)];
        else
            
$code.=$letters[mt_rand(0,20)];
    }

    return 
$code;
}

Генерирует новый код проверки.

getSessionKey() метод

protected string getSessionKey()
{return} строка имя переменной сеанса
Исходный код: framework/web/widgets/captcha/CCaptchaAction.php#219 (показать)
protected function getSessionKey()
{
    return 
self::SESSION_VAR_PREFIX . Yii::app()->getId() . '.' . $this->getController()->getUniqueId() . '.' . $this->getId();
}

Возвращает имя переменной сеанса, используемой для хранения кода проверки.

getVerifyCode() метод

public string getVerifyCode(boolean $regenerate=false)
$regenerate логическое следует ли перегенерировать код проверки.
{return} строка код проверки.
Исходный код: framework/web/widgets/captcha/CCaptchaAction.php#152 (показать)
public function getVerifyCode($regenerate=false)
{
    if(
$this->fixedVerifyCode !== null)
        return 
$this->fixedVerifyCode;

    
$session = Yii::app()->session;
    
$session->open();
    
$name = $this->getSessionKey();
    if(
$session[$name] === null || $regenerate)
    {
        
$session[$name] = $this->generateVerifyCode();
        
$session[$name . 'count'] = 1;
    }
    return 
$session[$name];
}

Возвращает код проверки.

renderImage() метод

protected void renderImage(string $code)
$code строка код проверки
Исходный код: framework/web/widgets/captcha/CCaptchaAction.php#228 (показать)
protected function renderImage($code)
{
    if(
$this->backend===null && CCaptcha::checkRequirements('imagick') || $this->backend==='imagick')
        
$this->renderImageImagick($code);
    else if(
$this->backend===null && CCaptcha::checkRequirements('gd') || $this->backend==='gd')
        
$this->renderImageGD($code);
}

Отображает изображение CAPTCHA на основе кода, используя библиотеку, указанную в свойстве $backend.

renderImageGD() метод (доступен начиная с v1.1.13)

protected void renderImageGD(string $code)
$code строка код проверки
Исходный код: framework/web/widgets/captcha/CCaptchaAction.php#241 (показать)
protected function renderImageGD($code)
{
    
$image = imagecreatetruecolor($this->width,$this->height);

    
$backColor = imagecolorallocate($image,
            (int)(
$this->backColor % 0x1000000 / 0x10000),
            (int)(
$this->backColor % 0x10000 / 0x100),
            
$this->backColor % 0x100);
    
imagefilledrectangle($image,0,0,$this->width,$this->height,$backColor);
    
imagecolordeallocate($image,$backColor);

    if(
$this->transparent)
        
imagecolortransparent($image,$backColor);

    
$foreColor = imagecolorallocate($image,
            (int)(
$this->foreColor % 0x1000000 / 0x10000),
            (int)(
$this->foreColor % 0x10000 / 0x100),
            
$this->foreColor % 0x100);

    if(
$this->fontFile === null)
        
$this->fontFile = dirname(__FILE__).DIRECTORY_SEPARATOR.'SpicyRice.ttf';

    
$length = strlen($code);
    
$box = imagettfbbox(30,0,$this->fontFile,$code);
    
$w = $box[4] - $box[0] + $this->offset * ($length - 1);
    
$h = $box[1] - $box[5];
    
$scale = min(($this->width - $this->padding * 2) / $w,($this->height - $this->padding * 2) / $h);
    
$x = 10;
    
$y = round($this->height * 27 / 40);
    for(
$i = 0; $i < $length; ++$i)
    {
        
$fontSize = (int)(rand(26,32) * $scale * 0.8);
        
$angle = rand(-10,10);
        
$letter = $code[$i];
        
$box = imagettftext($image,$fontSize,$angle,$x,$y,$foreColor,$this->fontFile,$letter);
        
$x = $box[2] + $this->offset;
    }

    
imagecolordeallocate($image,$foreColor);

    
header('Pragma: public');
    
header('Expires: 0');
    
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    
header('Content-Transfer-Encoding: binary');
    
header("Content-Type: image/png");
    
imagepng($image);
    
imagedestroy($image);
}

Отображает изображение CAPTCHA на основе кода, используя библиотеку GD.

renderImageImagick() метод (доступен начиная с v1.1.13)

protected void renderImageImagick(string $code)
$code строка код проверки
Исходный код: framework/web/widgets/captcha/CCaptchaAction.php#295 (показать)
protected function renderImageImagick($code)
{
    
$backColor=$this->transparent ? new ImagickPixel('transparent') : new ImagickPixel(sprintf('#%06x',$this->backColor));
    
$foreColor=new ImagickPixel(sprintf('#%06x',$this->foreColor));

    
$image=new Imagick();
    
$image->newImage($this->width,$this->height,$backColor);

    if(
$this->fontFile===null)
        
$this->fontFile=dirname(__FILE__).DIRECTORY_SEPARATOR.'SpicyRice.ttf';

    
$draw=new ImagickDraw();
    
$draw->setFont($this->fontFile);
    
$draw->setFontSize(30);
    
$fontMetrics=$image->queryFontMetrics($draw,$code);

    
$length=strlen($code);
    
$w=(int)($fontMetrics['textWidth'])-8+$this->offset*($length-1);
    
$h=(int)($fontMetrics['textHeight'])-8;
    
$scale=min(($this->width-$this->padding*2)/$w,($this->height-$this->padding*2)/$h);
    
$x=10;
    
$y=round($this->height*27/40);
    for(
$i=0; $i<$length; ++$i)
    {
        
$draw=new ImagickDraw();
        
$draw->setFont($this->fontFile);
        
$draw->setFontSize((int)(rand(26,32)*$scale*0.8));
        
$draw->setFillColor($foreColor);
        
$image->annotateImage($draw,$x,$y,rand(-10,10),$code[$i]);
        
$fontMetrics=$image->queryFontMetrics($draw,$code[$i]);
        
$x+=(int)($fontMetrics['textWidth'])+$this->offset;
    }

    
header('Pragma: public');
    
header('Expires: 0');
    
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    
header('Content-Transfer-Encoding: binary');
    
header("Content-Type: image/png");
    
$image->setImageFormat('png');
    echo 
$image->getImageBlob();
}

Отображает изображение CAPTCHA на основе кода, используя библиотеку ImageMagick.

run() метод

public void run()
Исходный код: framework/web/widgets/captcha/CCaptchaAction.php#116 (показать)
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
        
$this->renderImage($this->getVerifyCode());
    
Yii::app()->end();
}

Выполняет действие.

validate() метод

public boolean validate(string $input, boolean $caseSensitive)
$input строка ввод пользователя
$caseSensitive логическое чувствительность к регистру
{return} логическое действителен ли ввод
Исходный код: framework/web/widgets/captcha/CCaptchaAction.php#174 (показать)
public function validate($input,$caseSensitive)
{
    
$code = $this->getVerifyCode();
    
$valid = $caseSensitive ? ($input === $code) : strcasecmp($input,$code)===0;
    
$session = Yii::app()->session;
    
$session->open();
    
$name = $this->getSessionKey() . 'count';
    
$session[$name] = $session[$name] + 1;
    if(
$session[$name] > $this->testLimit && $this->testLimit > 0)
        
$this->getVerifyCode(true);
    return 
$valid;
}

Проверяет ввод, чтобы убедиться, что он соответствует сгенерированному коду.

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CCaptchaAction

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API