0

使用 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>';
    }
}

然后在配置中连接它:

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,自定义元素现在显示为文本字段。

如果我直接在现场调用助手,它会正确呈现:

{{ recaptcha( user_form.get('recaptchafield') ) | raw }}

这是似乎消失的自动联想。 这样在每个上调用 formRow 不会调用帮助程序。

有人有快速修复吗?希望免于查看实际的 zend-form 和 zend-view 代码。

谢谢!

4

2 回答 2

1

我有同样的问题,我通过更换解决了

    $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,
        ],
    ],
];

希望可以帮助其他人更快地找到问题;)

于 2017-02-23T07:01:29.593 回答
0

ZF3 中不再存在可调用对象。您需要将 recatpcha 视图助手移动到 factory 键并将其连接到 Zend\ServiceManager\Factory\InvokableFactory::class

于 2016-10-24T05:41:55.230 回答