使用ZF2,为自定义表单元素注册自定义视图帮助程序非常简单。
您可以简单地创建这样的元素:
use Zend\Form\Element;
class Recaptcha extends Element
{
protected $attributes = [
'type' => 'recaptcha',
];
protected $secret;
public function getSecret()
{
return $this->secret;
}
public function __construct($secret)
{
parent::__construct();
$this->secret = $secret;
}
}创建一个匹配的助手:
use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\FormElement;
class Recaptcha extends FormElement
{
public function render(ElementInterface $element)
{
return '<div class="form-group">
<div id="register_recaptcha">
<div class="g-recaptcha" data-sitekey="' . $element->getSecret() . '"></div>
</div>
</div>
<script src="//www.google.com/recaptcha/api.js"></script>';
}
}然后将其连接到config:
return [
'form_elements' => [
'factories' => [
Recaptcha::class => RecaptchaFactory::class,
],
],
'view_helpers' => [
'invokables' => [
'recaptcha' => RecaptchaHelper::class,
],
],
];IIRC,你也得把它装在靴带里
public function onBootstrap($e)
{
$application = $e->getApplication();
$services = $application->getServiceManager();
$services->get('ViewHelperManager')->get('FormElement')->addType('recaptcha', 'recaptcha');
}将项目从ZF2升级到ZF3,自定义元素现在显示为textfield。
如果我在字段上直接调用助手,它将正确地呈现:
{{ recaptcha( user_form.get('recaptchafield') ) | raw }}--自动关联似乎消失了。这样,在每个调用formRow时,都不会调用助手。
有人能快速解决吗?希望避免查看实际的zend-表单和zend-view代码。
谢谢!
发布于 2017-02-23 07:01:29
我也有同样的问题,我用
$services->get('ViewHelperManager')->get('FormElement')->addType('recaptcha', 'recaptcha');使用
$services->get('ViewHelperManager')->get('FormElement')->addClass(Recaptcha::class, RecaptchaHelper::class);配置也需要一些调整。它现在是这样写的:
return [
'form_elements' => [
'factories' => [
Recaptcha::class => RecaptchaFactory::class,
],
],
'view_helpers' => [
'invokables' => [
RecaptchaHelper::class => RecaptchaHelper::class,
],
],
];希望能帮助别人更快地发现问题;)
发布于 2016-10-24 05:41:55
Invokable在ZF3中不再存在。您需要将recatpcha视图助手移动到工厂键,并将其连接到Zend\ServiceManager\Factory\InvokableFactory::class。
https://stackoverflow.com/questions/40210321
复制相似问题