Есть ли способ добавить знак "$" прямо перед <input> для элемента Zend_Form? (конечно, было бы здорово использовать стандартные ZF).

РЕДАКТИРОВАТЬ : например, если HTML-код, сгенерированный Zend_Form для элемента cost, выглядит примерно так: (очень упрощенно)

<label>Cost:</label>
<input type="text" name="cost" />

Я бы хотел, чтобы он вывел это:

<label>Cost:</label>
$ <input type="text" name="cost" />
1
cambraca 16 Мар 2011 в 19:36
Пожалуйста, приведите пример того, что вы имеете в виду
 – 
ahmedsafan86
16 Мар 2011 в 19:49

3 ответа

Лучший ответ

Вы можете использовать декоратор callback. чтобы поместить любой HTML-код в свои элементы:

Например, в вашем случае я мог бы сделать:

    $el1 = $this->createElement('text', 'el1')->setLabel('Cost:');

    // Anonymous function that will generate your custom html (needs PHP 5.3).
    // For older PHP there are other ways of making anonymous functions.
    $myHtml = function($content, $element, array $options) {
                return '$';
            };
    $el1->setDecorators(array(
        'ViewHelper',
        'Errors',
        array('Callback', array('callback' => $myHtml, 'placement' => 'PREPEND')),
        'Label'
    ));

В результате должен получиться следующий html-код:

<label for="el1" class="optional">Cost:</label> 
$
<input type="text" name="el1" id="el1" value="" /> 

Надеюсь, это будет полезно или, по крайней мере, укажет вам правильное направление.

3
Marcin 17 Мар 2011 в 11:33

Используя декоратор AnyMarkup, вы можете сделать следующее:

$element->setDecorators(array(
    'ViewHelper',
    array('AnyMarkup', array('markup' => '$', 'placement' => 'prepend')),
    // And any other decorators, like Label, Description, Errors, and 
    // other wrapping like td, tr, etc.
));

Как обычно, не забудьте зарегистрировать пространство имен для декоратора с формой. Итак, если вы используете класс, названный в связанном фрагменте My_Decorator_AnyMarkup, расположенный в файле My/Decorator/AnyMarkup.php по пути включения, вам понадобится что-то вроде:

$form->addElementPrefixPath('My_Decorator_', 'My/Decorator', 'decorator');

3
David Weinraub 16 Мар 2011 в 20:26
Хороший ответ, но хотелось бы, чтобы в нем не использовалось никаких лишних вещей. Разве это нельзя сделать с помощью стандартного декоратора Description?
 – 
cambraca
16 Мар 2011 в 20:29

Вы можете добавить это как описание

$this->createElement('text', 'cost')
     ->setLabel('Cost:')
     ->setDescription('$');

А затем правильно настройте декораторы элемента.

< Сильный > Upd :

Предлагаемые декораторы элемента:

array(
    'ViewHelper',
    array('Description', array('placement' => Zend_Form_Decorator_Abstract::PREPEND, 'tag' => 'em'))
);

Обратите внимание на вариант размещения.

1
Vika 16 Мар 2011 в 20:37
Разве это не добавляет знак $ после элемента <input>?
 – 
cambraca
16 Мар 2011 в 20:13
Спасибо за ответ, хотя я не могу заставить его работать ... но, вероятно, это то, что я делаю где-то еще в форме (я вроде как новичок в Zend_Form, нужно узнать больше о декораторах ...)
 – 
cambraca
17 Мар 2011 в 01:13