Установил на свой проект google reCaptcha от himiklab
https://github.com/himiklab/yii2-recaptcha-widget
Устанавливал руками, то есть сделал все сам за composera, И при установке ловлю
exception 'yii\base\UnknownPropertyException' with message 'Getting unknown property: himiklab\yii2\recaptcha\ReCaptcha::field' in /var/www/bigbluebutton-default/vendor/yiisoft/yii2/base/Component.php:143
Вот код класса ReCaptcha
<?php
/**
* @link https://github.com/himiklab/yii2-recaptcha-widget
* @copyright Copyright (c) 2014-2018 HimikLab
* @license http://opensource.org/licenses/MIT MIT
*/
namespace himiklab\yii2\recaptcha;
use Yii;
use yii\base\InvalidConfigException;
use yii\helpers\Html;
use yii\widgets\InputWidget;
/**
* Yii2 Google reCAPTCHA widget.
*
* For example:
*
* ```php
* <?= $form->field($model, 'reCaptcha')->widget(
* ReCaptcha::className(),
* ['siteKey' => 'your siteKey']
* ) ?>
* ```
*
* or
*
* ```php
* <?= ReCaptcha::widget([
* 'name' => 'reCaptcha',
* 'siteKey' => 'your siteKey',
* 'widgetOptions' => ['class' => 'col-sm-offset-3']
* ]) ?>
* ```
*
* @see https://developers.google.com/recaptcha
* @author HimikLab
* @package himiklab\yii2\recaptcha
*/
class ReCaptcha extends InputWidget
{
const JS_API_URL = '//www.google.com/recaptcha/api.js';
const THEME_LIGHT = 'light';
const THEME_DARK = 'dark';
const TYPE_IMAGE = 'image';
const TYPE_AUDIO = 'audio';
const SIZE_NORMAL = 'normal';
const SIZE_COMPACT = 'compact';
const SIZE_INVISIBLE = 'invisible';
/** @var string Your sitekey. */
public $siteKey;
/** @var string Your secret. */
public $secret;
/** @var string The color theme of the widget. [[THEME_LIGHT]] (default) or [[THEME_DARK]] */
public $theme;
/** @var string The type of CAPTCHA to serve. [[TYPE_IMAGE]] (default) or [[TYPE_AUDIO]] */
public $type;
/** @var string The size of the widget. [[SIZE_NORMAL]] (default) or [[SIZE_COMPACT]] or [[SIZE_INVISIBLE]] */
public $size;
/** @var integer The tabindex of the widget */
public $tabIndex;
/** @var string Your JS callback function that's executed when the user submits a successful CAPTCHA response. */
public $jsCallback;
/**
* @var string Your JS callback function that's executed when the recaptcha response expires and the user
* needs to solve a new CAPTCHA.
*/
public $jsExpiredCallback;
/** @var string Your JS callback function that's executed when reCAPTCHA encounters an error (usually network
* connectivity) and cannot continue until connectivity is restored. If you specify a function here, you are
* responsible for informing the user that they should retry.
*/
public $jsErrorCallback;
/** @var array Additional html widget options, such as `class`. */
public $widgetOptions = [];
public function run()
{
$view = $this->view;
if (empty($this->siteKey)) {
/** @var ReCaptcha $reCaptcha */
$reCaptcha = Yii::$app->reCaptcha;
if ($reCaptcha && !empty($reCaptcha->siteKey)) {
$this->siteKey = $reCaptcha->siteKey;
} else {
throw new InvalidConfigException('Required `siteKey` param isn\'t set.');
}
}
$arguments = http_build_query([
'hl' => $this->getLanguageSuffix(),
'render' => 'explicit',
'onload' => 'recaptchaOnloadCallback',
]);
$view->registerJsFile(
self::JS_API_URL . '?' . $arguments,
['position' => $view::POS_END, 'async' => true, 'defer' => true],
'recaptcha-api'
);
$view->registerJs(
<<<'JS'
var recaptchaOnloadCallback = function() {
jQuery(".g-recaptcha").each(function() {
var reCaptcha = jQuery(this);
if (reCaptcha.data("recaptcha-client-id") === undefined) {
var recaptchaClientId = grecaptcha.render(reCaptcha.attr("id"), {
"callback": function(response) {
if (reCaptcha.attr("form-id") !== "") {
jQuery("#" + reCaptcha.attr("input-id"), "#" + reCaptcha.attr("form-id")).val(response).trigger("change");
} else {
jQuery("#" + reCaptcha.attr("input-id")).val(response).trigger("change");
}
if (reCaptcha.attr("data-callback")) {
eval("(" + reCaptcha.attr("data-callback") + ")(response)");
}
},
"expired-callback": function() {
if (reCaptcha.attr("form-id") !== "") {
jQuery("#" + reCaptcha.attr("input-id"), "#" + reCaptcha.attr("form-id")).val("");
} else {
jQuery("#" + reCaptcha.attr("input-id")).val("");
}
if (reCaptcha.attr("data-expired-callback")) {
eval("(" + reCaptcha.attr("data-expired-callback") + ")()");
}
},
});
reCaptcha.data("recaptcha-client-id", recaptchaClientId);
if (reCaptcha.data("size") === "invisible") {
grecaptcha.execute(recaptchaClientId);
}
}
});
};
JS
, $view::POS_END, 'recaptcha-onload');
if (Yii::$app->request->isAjax) {
$view->registerJs(<<<JS
if (typeof grecaptcha !== "undefined") {
recaptchaOnloadCallback();
}
JS
, $view::POS_END
);
}
$this->customFieldPrepare();
echo Html::tag('div', '', $this->buildDivOptions());
}
protected function getReCaptchaId()
{
if (isset($this->widgetOptions['id'])) {
return $this->widgetOptions['id'];
}
if ($this->hasModel()) {
return Html::getInputId($this->model, $this->attribute);
}
return $this->id . '-' . $this->name;
}
protected function getLanguageSuffix()
{
$currentAppLanguage = Yii::$app->language;
$langsExceptions = ['zh-CN', 'zh-TW', 'zh-TW'];
if (strpos($currentAppLanguage, '-') === false) {
return $currentAppLanguage;
}
if (in_array($currentAppLanguage, $langsExceptions)) {
return $currentAppLanguage;
}
return substr($currentAppLanguage, 0, strpos($currentAppLanguage, '-'));
}
protected function customFieldPrepare()
{
$inputId = $this->getReCaptchaId();
if ($this->hasModel()) {
$inputName = Html::getInputName($this->model, $this->attribute);
} else {
$inputName = $this->name;
}
echo Html::input('hidden', $inputName, null, ['id' => $inputId]);
}
protected function buildDivOptions()
{
$divOptions = [
'class' => 'g-recaptcha',
'data-sitekey' => $this->siteKey
];
$divOptions += $this->widgetOptions;
if (!empty($this->jsCallback)) {
$divOptions['data-callback'] = $this->jsCallback;
}
if (!empty($this->jsExpiredCallback)) {
$divOptions['data-expired-callback'] = $this->jsExpiredCallback;
}
if (!empty($this->jsErrorCallback)) {
$divOptions['data-error-callback'] = $this->jsErrorCallback;
}
if (!empty($this->theme)) {
$divOptions['data-theme'] = $this->theme;
}
if (!empty($this->type)) {
$divOptions['data-type'] = $this->type;
}
if (!empty($this->size)) {
$divOptions['data-size'] = $this->size;
}
if (!empty($this->tabIndex)) {
$divOptions['data-tabindex'] = $this->tabIndex;
}
if (isset($this->widgetOptions['class'])) {
$divOptions['class'] = "{$divOptions['class']} {$this->widgetOptions['class']}";
}
$divOptions['input-id'] = $this->getReCaptchaId();
if ($this->field !== null && $this->field->form !== null) {
if (!empty($this->field->form->options['id'])) {
$divOptions['form-id'] = $this->field->form->options['id'];
} else {
$divOptions['form-id'] = $this->field->form->id;
}
} else {
$divOptions['form-id'] = '';
}
$divOptions['id'] = $this->getReCaptchaId() . '-recaptcha' .
($divOptions['form-id'] ? ('-' . $divOptions['form-id']) : '');
return $divOptions;
}
}
Где здесь должен быть field? Может кто сталкивался
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
В wxPanel есть wxFlexGridSizer в котором два wxStatiсText один из которых может безпредельно менять свою длинуКак мне сделать так чтоб в зависимости от длины...
Допустим , идет поиск наибольшего числа, и имя человека с наибольшим числом очковЕго имя должно записаться в, скажем ,тип char , string
Наверное, очень глупый вопрос, но никак не могу найти на него ответа