Adding a dollar sign to a text field in Zend Frame

2019-06-01 07:31发布

问题:

Is there a way to add a "$" right before the <input> for a Zend_Form element? (using standard ZF stuff would be great, of course).

EDIT: For example, if the html generated by Zend_Form for a cost element is something like: (very simplified)

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

I'd like it to output this:

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

回答1:

You can use callback decorator to put whatever html you want in your elements:

For example in your case I could do:

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

This should result in the following html code:

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

Hope this will be helfull or at least point you in the right direction.



回答2:

Using the AnyMarkup decorator, you could do something this:

$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.
));

As usual, be sure to register the namespace for the decorator with the form. So, if you use the class as named in the linked snippet My_Decorator_AnyMarkup located in the file My/Decorator/AnyMarkup.php on the include path, then you'd need something like:

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



回答3:

You can add it as a description

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

And then configure element's decorators properly.

Upd:

Suggested element's decorators:

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

Note the placement option.