Zend Framework: jak usunąć dekoratory z ukrytego elementu Zend Form?

Próbuję usunąć domyślne dekoratory na ukrytym elemencie formularza. Domyślnie ukryty element jest wyświetlany w następujący sposób:

<dt>Hidden Element Label (if I had set one)</dt>
<dd><input type="hidden" name="foobar" value="1" id="foobar"></dd>

Nie chcę, aby mój ukryty element zajmował miejsce na mojej stronie. Chcę usunąć wszystkie domyślne dekoratory, więc pozostaje mi tylko znacznik wejściowy.

<input type="hidden" name="foobar" value="1" id="foobar">

Jak mogę to osiągnąć?

Author: Andrew, 2009-01-27

11 answers

Do ukrytego pola potrzebny jest tylko jeden dekorator-ViewHelper:

$field = new Zend_Form_Element_Hidden('id');
$field->setDecorators(array('ViewHelper'));

Spowoduje renderowanie tylko pola wejściowego, Bez opakowania Dt-Dd i etykiety.

 48
Author: Dmitri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-07 14:08:06

From the Zend Element Decorators documentation:

Domyślne dekoratory nie muszą być Loaded

Domyślnie domyślnymi dekoratorami są ładowane podczas inicjalizacji obiektu. Możesz to wyłączyć, przechodząc przez opcja "disableLoadDefaultDecorators" do konstruktora:

$element = new Zend_Form_Element('foo', 
    array('disableLoadDefaultDecorators' => true)
);
 32
Author: drfloob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 00:15:39

Używam tego

$element->removeDecorator('DtDdWrapper');

Aby pozbyć się znaczników dt dd wokół określonych elementów

 24
Author: dittonamed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-10 22:15:23

/ / na podstawie powyższego-prosta funkcja dodawania ukrytego elementu do $this form

/**
 * Add Hidden Element
 * @param $field
 * @param value
 * @return nothing - adds hidden element
 * */
public function addHid($field, $value){     
    $hiddenIdField = new Zend_Form_Element_Hidden($field);
    $hiddenIdField->setValue($value)
          ->removeDecorator('label')
          ->removeDecorator('HtmlTag');     
    $this->addElement($hiddenIdField);
}
 6
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-07 15:49:33

Gdy masz dużo ukrytych wejść, najlepszą odpowiedzią jest:

$elements = $this->getElements();
foreach ($elements as $elem)
    if ($elem instanceof Zend_Form_Element_Hidden)
        $elem->removeDecorator('label')->removeDecorator('HtmlTag');
 5
Author: yanek1988,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-02 10:09:34

Jak wspomniano w innych postach setDisableLoadDefaultDecorators(true) nie działa, jeśli są już załadowane... Ale clearDecorators() robi!

 4
Author: Grant Perry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-28 17:51:00

Nie mogłem uzyskać disableLoadDefaultDecorators do pracy całkiem dobrze. Oto rozwiązanie, które wymyśliłem.

$hiddenIdField = new Zend_Form_Element_Hidden('id');
$hiddenIdField->setValue($portalId)
              ->removeDecorator('label')
              ->removeDecorator('HtmlTag'); 

W HTML, ukryte pole pojawia się bez żadnych dodatkowych tagów wokół niego.

...
<dt><label for="password" class="required">Password</label></dt>
<dd><input type="password" name="password" id="password" value="" /></dd>
<input type="hidden" name="id" value="1" id="id" />
...
 3
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-06 18:11:26

Oto co takeme2web z http://www.phpfreaks.com/forums/index.php?topic=225848.0 sugeruje

$yourhiddenzendformelement->setDecorators (array ('ViewHelper'));

 2
Author: Svetoslav Marinov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-24 23:56:47

Użycie tylko jednego dekoratora "ViewHelper" wygeneruje nieprawidłowe znaczniki, jeśli nadal używasz opakowania <dl>. Inne podejście przedstawiono w ZF-2718 . Dodaje ukryte pola do formularza podrzędnego, który jest zawinięty w <dd>.

 2
Author: Tim Brayshaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-14 23:28:16

Rok 2012 i wciąż ten sam. Jeśli usuniesz dekoratory, html nie będzie sprawdzał poprawności. Jeśli je zostawisz, ukryte elementy zajmują miejsce. We wszystkich moich projektach mam CSS helper .ukryty, więc po prostu nakładam go na <dd> i wyłączam Etykietę:

$element = new Zend_Form_Element_Hidden('foo', array('value' => 'bar'));
$element->removeDecorator('Label');
$element->getDecorator('HtmlTag')->setOption('class', 'hidden');

Poprawny html(5), ładnie wyglądające formularze. Może to również przejść do niestandardowego dekoratora dla ukrytych pól.

EDIT

Oto jak umieściłem go w moim własnym elemencie formularza:

class Exanto_Form_Element_Hidden extends Zend_Form_Element_Hidden
{
    public function render(Zend_View_Interface $view = null)
    {
        $this->removeDecorator('Label');
        $this->getDecorator('HtmlTag')->setOption('class', 'hidden');
        return parent::render($view);
    }
}
 2
Author: Novalis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-01 08:05:57

Użyj tego:

    foreach ($this->getElements() as $element) {

        $decorator = $element->getDecorator('label');
        if (!$decorator) {
            continue;
        }
        $decorator->removeOption('tag');
    }
 0
Author: MD66,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-09 11:47:02