什么是渲染 <form> 标签的 VOLT 宏?

What is VOLT macro for rendering a <form> tag?

在 Phalcon 中,可以创建一个扩展 Phalcon\Form\Form 的自定义表单。此 class 具有名为 setAction 的方法,但我找不到有关如何使用我指定的操作自动呈现 <form> 标记的任何信息。

我的表单名为 RegisterForm,我将它传递给 VOLT 视图,如下所示:

$this->view->registerForm = new RegisterForm(new UserModel()); 

在我的 VOLT 模板中,我可以使用 registerForm.render('username') 宏来自动呈现在我的表单中注册的输入字段。

是否有任何宏可以创建以下内容?

<form action="/register" method="post">

假设我使用过:

$this->setAction($this->url->get('index/register')); 

在表单定义中。

以下是在 Volt 中呈现表单的方法:

{{ form('products/save', 'method': 'post') }}

    <label for="name">Name</label>
    {{ text_field("name", "size": 32) }}

    <label for="type">Type</label>
    {{ select("type", productTypes, 'using': ['id', 'name']) }}

    {{ submit_button('Send') }}

{{ end_form() }}

Docs 中的更多信息。

您还可以查看 Phalcon 的项目 Vokuro 以获取更多示例。

更新: Lukasz 要求提供一种解决方案,以使用其属性从自定义表单元素呈现表单标签。 Phlacon Form Decorators 是我能找到的最接近问题的解决方案。

经过又一天的研究,并在 Phalcon 的 Slack 频道聊天,我开始意识到,没有内置的方法可以实现我的预期。

最简单的解决方案是创建一个扩展 Phalcon\Forms\FormBaseForm class。这是一个例子:

<?php

namespace MyNamespace\Common\Form;

use Phalcon\Forms\Form;

class BaseForm extends Form {
    /**
     * Creates <form> tag in VOLT view.
     */
    public function startForm($method = 'post') {
        return '<form action="'.$this->getAction().'" method="'.$method.'">';
    }

    /**
     * Creates </form> tag in VOLT view.
     */
    public function endForm() {
        return '</form>';
    }

    /**
     * Pushes all errors to flash container.
     */
    public function error($name) {
        if($this->hasMessagesFor($name)) {
            foreach($this->getMessagesFor($name) as $message) {
                $this->flash->error($message);
            }

            return true;
        }

        return false;
    }
}

有了这个,在扩展自定义表单定义之后,我可以使用:

# IndexController.php
public function index() {
    $this->view->registerForm = new RegisterForm();
}

# index.volt
{{ registerForm.startForm() }}
{{ registerForm.endForm() }}
{{ registerForm.error('username') }}