В Phalcon можно создать собственную форму, расширяющую Phalcon\Form\Form
, Этот класс имеет метод с именем 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'));
в определении формы.
После еще одного дня исследований и общения в чате на канале Phalcon’s Slack я понял, что нет встроенного способа сделать то, что я намеревался.
Самое простое решение — создать BaseForm
класс, который расширяется 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;
}
}
С этим, после расширения пользовательского определения формы, я могу использовать:
# IndexController.php
public function index() {
$this->view->registerForm = new RegisterForm();
}
# index.volt
{{ registerForm.startForm() }}
{{ registerForm.endForm() }}
{{ registerForm.error('username') }}
Вот как визуализировать форму в вольт:
{{ 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() }}
Больше информации в Документы.
Вы также можете проверить проект Phalcon Vokuro для большего количества примеров.
Обновить: Лукаш попросил решение для визуализации тега формы из пользовательского элемента формы с его свойствами. Флаконовые декораторы это самое близкое решение проблемы, которую я могу найти.