CCaptchaAction
| Пакет | system.web.widgets.captcha |
|---|---|
| Наследование | class CCaptchaAction » CAction » CComponent |
| Реализует | IAction |
| С версии | 1.0 |
| Исходный код | framework/web/widgets/captcha/CCaptchaAction.php |
CCaptchaAction используется вместе с CCaptcha и CCaptchaValidator для предоставления функции CAPTCHA.
Вы должны настроить свойства CCaptchaAction для настройки внешнего вида сгенерированного изображения.
Обратите внимание, что CCaptchaAction требует расширения PHP GD2.
Использование CAPTCHA включает следующие шаги:
- Переопределите CController::actions() и зарегистрируйте действие класса CCaptchaAction с идентификатором 'captcha'.
- В модели формы укажите атрибут для хранения введенного пользователем кода проверки и укажите, что атрибут должен быть проверен с помощью валидатора 'captcha'.
- В представлении контроллера вставьте виджет 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 |
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} | строка | сгенерированный код проверки |
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} | строка | имя переменной сеанса |
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} | строка | код проверки. |
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 | строка | код проверки |
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 | строка | код проверки |
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 | строка | код проверки |
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() |
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} | логическое | действителен ли ввод |
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