2011-12-09 15 views
7

Tengo algunos problemas para aprender a usar formularios personalizados en Zend Framework.Zend Framework Formularios personalizados con viewScript

He seguido varias guías pero ninguna parece funcionar. Nada en absoluto se rinde.

Aquí están los bits de código que estoy tratando de usar (Todos los códigos a continuación están en el módulo predeterminado). He simplificado el código a una sola entrada para la prueba.

aplicaciones/formas/una/Nametest.php

class Application_Form_One_Nametest extends Zend_Form { 

    public function init() { 

     $this->setMethod('post'); 

     $name = new Zend_Form_Element_Text('name'); 
     $name->setLabel('Box Name') 
       ->setRequired(true) 
       ->addFilter('StripTags') 
       ->addFilter('StringTrim') 
       ->addValidator('NotEmpty'); 

     $submit = new Zend_Form_Element_Submit('submit'); 
     $submit->setLabel('Submit Message'); 
     $submit->setAttrib('id', 'submitbutton'); 
     $submit->setAttrib('class', 'bluebutton'); 

     $this->addElements(array($name, $submit)); 
    } 

} 

de aplicación/views/scripts/uno/formlayout.phtml

<form action="<?= $this->escape($this->form->getAction()) ?>" method="<?= $this->escape($this->form->getMethod()) ?>"> 

    <p> 
     Please provide us the following information so we can know more about 
     you. 
    </p> 

    <? echo $this->element->name ?> 
    <? echo $this->element->submit ?> 

</form> 

application/controllers/IndexController.php

public function formtestAction() { 
    $form = new Application_Form_One_Nametest(); 
    $form->setDecorators(array(array('ViewScript', array('viewScript' => 'one/formlayout.phtml')))); 

    $this->view->form = $form; 
} 

application/views/scripts/index/formtest.phtml

<h1>Formtest</h1> 
<? 
echo $this->form;  
?> 

El código anterior no arroja ningún error ni representa ninguna parte de formlayout.phtml, incluidas las etiquetas de formulario o el texto entre las etiquetas p.

¿Alguien me puede decir lo que podría estar haciendo mal?

+0

Un error común es tener un constructor en la clase de formulario que no llama al constructor padre. Esto da como resultado un resultado de formulario vacío, ya que es el constructor padre el que finalmente llama al método 'init()'. Solo pensando en voz alta ... –

Respuesta

1

Aquí hay un ejemplo muy simple para que te adapten desde this article.

La forma: -

class Application_Form_Test extends Zend_Form 
{ 
    public function init() 
    { 
     $this->setMethod('POST'); 
     $this->setAction('/'); 
     $text = new Zend_Form_Element_Text('testText'); 

     $submit = new Zend_Form_Element_Submit('submit'); 

     $this->setDecorators(
       array(
        array('ViewScript', array('viewScript' => '_form_test.phtml')) 
        ) 
       ); 

     $this->addElements(array($text, $submit)); 
     $this->setElementDecorators(array('ViewHelper')); 
    } 
} 

El orden en el que setDecorators(), addElements() y setElementDecorators() son llamados es muy importante aquí.

La secuencia de comandos de vista _form_test.phtml se puede llamar como quieras, pero tiene que estar en /views/scripts para que pueda ser encontrada por el procesador.

/views/scripts/_form_test.phtml sería algo como esto: -

<form id="contact" action="<?php echo $this->element->getAction(); ?>" 
     method="<?php echo $this->element->getMethod(); ?>"> 

<p> 
Text<br /> 
<?php echo $this->element->testText; ?> 
</p> 

<p> 
<?php echo $this->element->submit ?> 
</p> 

</form> 

se ejemplariza la forma, pasarlo a la vista y lo hacen como de costumbre. La salida de este ejemplo se ve así: -

<form id='contact' action='/' method='post'> 
    <p> 
     Text<br /> 
     <input type="text" name="testText" id="testText" value=""></p> 
    <p> 

    <input type="submit" name="submit" id="submit" value="submit"></p> 
</form> 

Eso debería ser suficiente para comenzar a crear sus propios formularios.

0

Por lo general, si no ve nada en la pantalla, significa que ocurrió algún tipo de error. Quizás tenga errores desactivados o algo así, tal vez no. Solo estoy tratando de darte ideas.

Las únicas cosas que pude detectar fueron las siguientes. En el código siguiente, aún debe especificar el formulario cuando intenta imprimir los elementos.

<form> 
action="<?php $this->escape($this->element->getAction()) ?>" 
method="<?php $this->escape($this->element->getMethod()) ?>" > 

<p> 
    Please provide us the following information so we can know more about 
    you. 
</p> 

<?php echo $this->element->getElement('name'); ?> 
<?php echo $this->element->getElement('submit') ?> 

</form> 

Como se muestra en el código de vascowhite, una vez que están dentro de la ViewScript, la variable con la forma se llama elemento.El decorador de viewscript usa un parcial para hacer el renderizado y, por lo tanto, crea su propio alcance dentro del script de visualización con diferentes nombres de variables.

Por lo tanto, aunque en su vista original se llamaba $ form, en el script de visualización tendrá que llamarlo elemento.

Además, tal vez era copiar/pegar prisa, pero se utilizan en lugar de las etiquetas <? ?><?= ?> o <?php ?> etiquetas. Quizás eso causó algún error que está más allá del análisis y es por eso que no obtuviste ningún resultado.

+0

Me tomó un tiempo darme cuenta de que tenía que usar < para que aparezca el símbolo '<' en la publicación. ¿Alguien más conoce otros métodos? –

+0

Solo sangría por 4 espacios para mostrar el código y use el control invertido para escapar caracteres en línea o en comentarios – vascowhite

4

Creo que el problema es el decorador de su elemento de formulario. Debe configurar el decorador solo para ViewHelper y Error. Funciona para mí al menos.

Aquí está el código que utilicé y debería funcionar

aplicaciones/formas/form.php

class Application_Form_Form extends Zend_Form { 

public function loadDefaultDecorators() { 
    $this->setDecorators(
     array(
      array(
       'ViewScript', 
       array(
        'viewScript' => 'index/formlayout.phtml', 
       ) 
      ) 
     ) 
    ); 
} 

    public function init() { 
     $this->setAction('/action'); 
     $this->setMethod('post'); 

     $this->addElement('text', 'name', array(
      'decorators' => array('ViewHelper', 'Errors') 
     )); 
    } 
} 

application/views/scripts/index/formlayout.phtml

<form action="<?php echo $this->element->getAction(); ?>" method="<?php echo $this->element->getMethod(); ?>"> 
    <div> 
    <label for="name">Box Name</label> 
    <?php echo $this->element->name; ?> 
    </div> 

    <input type="submit" value="Submit Message" id="submitbutton" class="bluebutton"> 
</form> 

application/views/scripts/index/index.phtml

<!-- application/views/scripts/index/index.phtml --> 
<?php echo $this -> form; ?> 

application/controllers/IndexController.php

public function indexAction() { 
    $form = new Application_Form_Form(); 
    $this -> view -> form = $form; 
}