Zend: быстрый и лаконичный способ вставки пользовательского HTML в Zend_Form? - PullRequest
0 голосов
/ 07 октября 2010

Есть ли какой-нибудь метод, который допускает вставку пользовательского html без необходимости фактически добавлять элементы управления формой, даже если они скрыты и делает мой html декоратором?

Я ищу что-то вроде:

$this->addCustomElement( array(
'div', 
'body' => '<p>inner text</p>'
) );

Мне нужно что-то короткое и быстрое, я не хочу создавать новый класс или что-то излишнее.

Ответы [ 2 ]

3 голосов
/ 07 октября 2010

Ну, это действительно так просто:

$note = new Zend_Form_Element('note');
$note->helper = 'formNote';
$note->setValue('<b>hi</b>');
$form->addElement($note);

Но проблема в том, что когда вы отправляете форму, форма вызывает $note->isValid(), которая переопределяет значение, поэтому, если в форме есть ошибки, при следующем ее отображении пользовательский HTML не будет отображаться , Есть два простых способа исправить это, первый - переопределить isValid() в вашем классе Form следующим образом:

public function isValid($data)
{
    $note = $this->note->getValue();
    $valid = parent::isValid($data);
    $this->note->setValue($note);
    return $valid;
}

Но лично я нахожу этот хакерский способ и предпочитаю второй вариант. То есть написать очень простой класс (он должен действительно быть частью самого Zend, я понятия не имею, почему это не так, поскольку он включает formNote помощник вида, но нет элемента, который его использует ):

class My_Form_Element_Note extends Zend_Form_Element_Xhtml
{
    public $helper = 'formNote';
    public function isValid($value, $context = null) { return true; }
}

Тогда вам просто нужно сделать:

$note = new My_Form_Element_Note('note');
$note->setValue('<b>hi</b>');
$form->addElement($note);

И все будет работать.

Другие варианты включают создание чёрной магии с декораторами, но я действительно рекомендую вам не идти по этому пути.

2 голосов
/ 07 октября 2010

Также обратите внимание на AnyMarkup Decorator .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...