php zend-framework zend-form

php - Agregue algunos html a Zend Forms



zend-framework zend-form (10)

Estoy buscando un código simple que me permita agregar el siguiente html en mi formulario zend:

<div id="wmd-button-bar" class="wmd-panel"></div>

Eso es todo, debe estar por encima de mi elemento ''método'' en la forma, pero eso es todo. Para una acción tan simple, no puedo encontrar ningún método que no me implique aprender ciencia de cohetes (es decir, decoradores Zend).


La única forma en que puedo pensar en este momento es agregar un elemento ficticio al formulario y eliminar todos los decoradores excepto un ''HtmlTag'' con los atributos que especificó en su pregunta. Eliminar los decoradores significa que el elemento real no se representará, solo se renderizará el decorador HtmlTag.

por lo tanto, suponiendo que su formulario es $ form:

$form->addElement( ''hidden'', ''dummy'', array( ''required'' => false, ''ignore'' => true, ''autoInsertNotEmptyValidator'' => false, ''decorators'' => array( array( ''HtmlTag'', array( ''tag'' => ''div'', ''id'' => ''wmd-button-bar'', ''class'' => ''wmd-panel'' ) ) ) ) ); $form->dummy->clearValidators();

Tenga en cuenta que desea evitar cualquier validación del elemento. Esta es solo una forma: probablemente haya otras.

Salida:

<div id="wmd-button-bar" class="wmd-panel"></div>

Hay un buen artículo que describe decoradores http://devzone.zend.com/article/3450 y una vez que entiendas cómo funcionan, verás que no es ciencia espacial ...


Ponlo en tu script de vista ...

<!-- /application/views/scripts/myController/myAction.phtml --> <div id="wmd-button-bar" class="wmd-panel"></div> <?php echo $this->form ;?>



¿Qué tal si usas JQuery?

Algo como:

<script language="javascript"> $(document).ready(function() { $(''#submit-element'').append(''<div id="wmd-button-bar" class="wmd-panel"></div>''); }); </script>


  • Crea un decorador personalizado que devuelva la etiqueta (o cualquier otra cosa):

    class My_Decorator_CustomHtml extends Zend_Form_Decorator_Abstract { public function render($content) { $element = $this->getElement(); if (!$element instanceof Zend_Form_Element) { return $content; } if (null === $element->getView()) { return $content; } $html = $element->getLabel(); return $html; }

    }

  • Coloque esto en la ruta del decorador

    <pre>$form->addElementPrefixPath(''My_Decorator'', ''My/Decorator/'', ''decorator'');</pre>

  • Crea el elemento y pon el html personalizado en la etiqueta

    $html = ''<div id="wmd-button-bar" class="wmd-panel">some text....</div>''; $element = new Zend_Form_Element_Hidden(''hidden-input'', array( ''label''=>$html, ));
    $element->setDecorators(array(''CustomHtml'')); //add it to the form $form->addElement($element);

y eso es


Puede intentarlo de esta manera, sin configuración, solo una referencia de clase de extensión: http://www.zfsnippets.com/snippets/view/id/50

<?php /** * Form note element * * @author Ruslan Zavackiy <[email protected]> * @package elements */ /** * Loads helper Zend_View_Helper_FormNote */ class Custom_Form_Element_Note extends Zend_Form_Element_Xhtml { public $helper = ''formNote''; } ?>

entonces

$companies->addElement(''note'', ''companyNote'', array( ''value'' => ''<a href="javascript:;" id="addCompany">Add Company</a>'' ));


Puede crear su propia vista help libraray - App> View> Helper> PlainTextElemet.php

Cree una carpeta en la carpeta de su biblioteca, ese nombre es una aplicación, de modo que una carpeta con ese nombre sea Ver, de modo que en View cree la carpeta Helper, de modo que en la carpeta Helper cree una clase con el nombre PlainTextElement, el mismo que sigue

class App_View_Helper_PlainTextElement extends Zend_View_Helper_FormElement { public function PlainTextElement($name, $value = null, $attribs = null) { $info = $this->_getInfo($name, $value, $attribs); extract($info); // name, value, attribs, options, listsep, disable if (null === $value) {$value = $name;} return $value; } }

Luego, en libray, lo mismo que arriba, crea una aplicación de clase> Formulario> Elemento> PlainText.php

Y pon el siguiente código en esta clase

class App_Form_Element_PlainText extends Zend_Form_Element_Xhtml { public $helper=''PlainTextElement''; public function isValid($value){ return true; } }

Ahora, en su forma, puede crear cada código html que desee:

$someValue = ''<div id="wmd-button-bar" class="wmd-panel"></div>''; $this->addElement(new App_Form_Element_PlainText(''pliantext1'', array( ''value''=>$someValue, )));

No olvide en su application.ini agregar también líneas flotantes:

autoloaderNamespaces.app = "App_" resources.view.helperPath.App_View_Helper="App/View/Helper"


Esta funcionalidad está integrada en Zend a través de Zend_Form_Element_Note.

new Zend_Form_Element_Note(''forgot_password'', array( ''value'' => ''<a href="'' . $this->getView()->serverUrl($this->getView()->url(array(''action'' => ''forgot-password''))) . ''">Forgot Password?</a>'', ))


Vengo con un elemento Html que puedes incluir en tu propia biblioteca

class Application_Form_Element_Html extends Zend_Form_Element_Xhtml { /** * Build the element and set the decorator callback to generate the html. */ public function __construct($name, $options) { // Get the HTML to generate. $html = $options[''html'']; // Set the decorators for the generation. $this->setDecorators(array ( array(''Callback'', array ( ''callback'' => function($content) use ($html) { return $html; } )) )); } }

Para incluirlo, no olvides hacer

$form->addPrefixPath(''Application_Form_Element'', APPLICATION_PATH . ''/forms/Element'', ''element'');

Luego, en la inicialización del formulario, simplemente llame a:

$form->addElement($this->createElement(''html'', ''info'', array ( ''html'' => ''<div>My awesome HTML</div>''; )));


CÓDIGO DE SOLUCIÓN agregue esta clase a su / aplicación / formulario y extienda todos sus formularios de esta clase

class Application_Form_SpecialSubform extends Zend_Form_SubForm { protected $_openTag = ''<form>''; protected $_closeTag = ''</form>''; protected $_htmlIniCloseTagChars = ''</''; public function render(/Zend_View_Interface $view = null) { if (!$this->isPartOfAForm()) $this->addDecorator(''Form''); return parent::render($view); } protected function isPartOfAForm(){ return (!is_null($this->getElementsBelongTo())); } public function initForm() { $defaultZendCloseTag = $this->getDefaultFormViewCloseTag(); $completeTag=''''; $this->addDecorator(''Form''); $this->getDecorator(''Form'')->setElement($this); $completeTag=$this->getDecorator(''Form'')->render(''''); $this->set_openTag(str_replace($defaultZendCloseTag, '''', $completeTag)); return $this->get_openTag(); } public function endForm() { return $this->get_closeTag(); } protected function getDefaultFormViewCloseTag() { $defaultFormTag = $this->get_closeTag(); $view = $this->getView(); $defaultTag = $view->form('''',null,true); $pos = strrpos ($this->get_htmlIniCloseTagChars(),$defaultFormTag); if ($pos !== false) { $defaultFormTag = substr($defaultTag, $pos); } $this->set_closeTag($defaultFormTag); return $defaultFormTag; } protected function get_openTag() { return $this->_openTag; } protected function get_closeTag() { return $this->_closeTag; } protected function get_htmlIniCloseTagChars() { return $this->_htmlIniCloseTagChars; } protected function set_openTag($_openTag) { $this->_openTag = $_openTag; } protected function set_closeTag($_closeTag) { $this->_closeTag = $_closeTag; } protected function set_htmlIniCloseTagChars($_htmlIniCloseTagChars) { $this->_htmlIniCloseTagChars = $_htmlIniCloseTagChars; } }

en su opinión, debe llamar a initForm () cuando desee abrir la etiqueta de formulario y endForm () para cerrarla, ya que puede ver que TODO el comportamiento de ZF no ha sido tocado, por lo que es totalmente compatible.

MÁS EXPLICACIÓN TÉCNICA:

Para agregar o insertar cualquier código entre nuestros formularios Zend, la mejor y más limpia forma de utilizar SubForms en todos sus formularios, los Subformularios son formularios, por lo que tiene todas las funciones como validación, filtro ... y también puede reutilizarlo fácilmente y apilar como muchos como quieras dentro de tu formulario o dentro de cualquier otro subformulario. También maneja la publicación resultante es trivial.
así que hagamos un ejemplo si usted tiene un administrador de información de usuario como dirección, número de teléfono, etc., digamos userInfo otra parte de su sitio maneja más información privada como banck account y religion. y al menos un administrador de área restringida más protegido que maneja la contraseña y el rol del usuario. usted por supuesto tiene sus 3 formas, en diferentes controladores y acciones de su código. Y ahora necesita unir todo, pero necesita una gran cantidad de marcado para mostrarlo en las etiquetas o para explicar cualquier área. con subformularios es trivial simplemente echo $ this-> form-> subformName en su vista. En este punto, notará que la etiqueta del formulario no aparecerá y no podrá enviar la publicación. este es el único problema de esta técnica y resolverá con una simple y (déjenme decirlo) elegante clase extender y sobrecargar el método de renderizado.