什么是渲染 <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\Form
的 BaseForm
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') }}
在 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\Form
的 BaseForm
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') }}