Что такое макрос VOLT для рендеринга & lt; формы & gt; тег?

В 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'));

в определении формы.

1

Решение

После еще одного дня исследований и общения в чате на канале 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') }}
2

Другие решения

Вот как визуализировать форму в вольт:

{{ 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 для большего количества примеров.

Обновить: Лукаш попросил решение для визуализации тега формы из пользовательского элемента формы с его свойствами. Флаконовые декораторы это самое близкое решение проблемы, которую я могу найти.

0

По вопросам рекламы [email protected]