Использование пользовательских декораторов для обертывания элементов формы внутри div с помощью zend_form - PullRequest
1 голос
/ 27 февраля 2012

Я ищу способ обернуть элементы формы zend_form внутри элементов div. Я могу получить желаемый результат, используя приведенный ниже код внутри класса формы.

                $element->setDecorators(array(
                'ViewHelper',
                'Description',
                'Errors',
                array(array('top-left' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-top-left')),
                array(array('top-right' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-top-right')),
                array(array('top-center' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-top-center')),
                array(array('bottom-left' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-bottom-left')),
                array(array('bottom-right' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-bottom-right')),
                array(array('bottom-center' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-bottom-center')),
                array(array('left' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-left')),
                array(array('right' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-right')),
                array(array('dd' => 'HtmlTag'), array('tag' => 'dd', 'id' => $element->getLabel().'-element')),
                array('Label', array('tag' => 'dt')),
            ));

Я хотел бы знать, могу ли я использовать собственные декораторы для достижения желаемого результата.

Приведенный выше код очень прост в реализации, но его необходимо выполнить для каждого элемента. Тогда я подумал: можно ли использовать собственный декоратор для достижения того же результата?

Пока я не смог, поэтому я задаю этот вопрос здесь.

:: Edit ::

Я забыл упомянуть, что я пытался сделать до сих пор. Я пытался сломать форму внутри моего пользовательского декоратора. Но мне пока не повезло.

class Form_Decorator_Borders extends Zend_Form_Decorator_Abstract

{

public function render($content)
{
    $element    = $this->getElement();          // get form
    $elements   = $element->getElements();      // get form elements
    $placement  = $this->getPlacement();
    $name       = htmlentities($element->getFullyQualifiedName());
    $id         = htmlentities($element->getId());

    foreach ($elements as $k => $v) {
        if (is_object($v) && get_class($v) == "Zend_Form_Element_Text") {
            $elements[$k]->setDecorators(array(
                'ViewHelper',
                'Description',
                'Errors',
                array(array('top-left' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-top-left')),
                array(array('top-right' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-top-right')),
                array(array('top-center' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-top-center')),
                array(array('bottom-left' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-bottom-left')),
                array(array('bottom-right' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-bottom-right')),
                array(array('bottom-center' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-bottom-center')),
                array(array('left' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-left')),
                array(array('right' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-right')),
                array(array('dd' => 'HtmlTag'), array('tag' => 'dd', 'id' => $elements[$k]->getLabel().'-element')),
                array('Label', array('tag' => 'dt')),
            ));
        }
    }

    $element->setElements($elements);
    $this->setElement($element);

    $this->setElement($element);
    return $this->getElement()->getView()->render($name);
}

}

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Более простой способ создания расширенного класса Zend_Form с частным свойством для ваших границ.

class Custom_Form extends Zend_Form
{
    /**
     * array
     */
    private $_borderDecorators = array(/*...*/);
}

И для элемента Custom_Form выполните следующее (работает, если декораторы установлены в классе, расширенном от Custom_Form):

$element->setDecorators($this->_borderDecorators);
0 голосов
/ 28 февраля 2012

Я пришел, чтобы использовать другой подход. Это то, что я сейчас использую и до сих пор работает нормально.

public function render($content)
{
    $innerHTML = "";
    //Create a new DOM document
    $dom = new DOMDocument;
    $dom->preserveWhiteSpace = false;

    //Parse the HTML. The @ is used to suppress any parsing errors
    //that will be thrown if the $html string isn't valid XHTML.
    @$dom->loadHTML($content);

    //Get all inputs. You could also use any other tag name here,
    //like 'img' or 'table', to extract other tags.
    $eInputs = $dom->getElementsByTagName('input');

    //Iterate over the extracted dds
    foreach ($eInputs as $eInput) {
        if ($eInput->getAttribute('type') == "text") {
            $tmp_doc = new DOMDocument();
            $tmp_doc->appendChild($tmp_doc->importNode($eInput,true));
            $innerHTML .= $tmp_doc->saveHTML()." ";
        } else if ($eInput->getAttribute('type') == "password") {
            $tmp_doc = new DOMDocument();
            $tmp_doc->appendChild($tmp_doc->importNode($eInput,true));
            $innerHTML .= $tmp_doc->saveHTML()." ";
        }
    }

    $inputs = explode(" ", $innerHTML);

    foreach ($inputs as $input) {
        if (!empty($input)) {
            $input = str_replace(">", " />", $input);
            $input = substr($input, 0, -1);
            $replace = '<div class="content-border-bottom-center">
                <div class="content-border-top-center">
                    <div class="content-border-corner-bottom-right">
                        <div class="content-border-corner-bottom-left">
                            <div class="content-border-corner-top-right">
                                <div class="content-border-corner-top-left">
                                    '.$input.'
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>';
            $content = str_replace($input, $replace, $content);
        }
    }
    return $content;
}
...