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

时间:2016-11-15 00:25:33

标签: php forms macros phalcon volt

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

我的表单名为<form>,我将其传递给VOLT视图:

RegisterForm

在我的VOLT模板中,我可以使用$this->view->registerForm = new RegisterForm(new UserModel()); 宏自动呈现在我的表单中注册的输入字段。

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

registerForm.render('username')

假设我已经使用过:

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

在表单定义中。

2 个答案:

答案 0 :(得分:2)

经过另一天的研究,并在Phalcon的Slack频道聊天,我意识到,没有内置的方式来做我想要的事情。

最简单的解决方案是创建一个扩展BaseForm的{​​{1}}类。这是一个例子:

Phalcon\Forms\Form

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

<?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;
    }
}

答案 1 :(得分:0)

以下是如何在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 是我能找到的问题的最接近的解决方案。