Zend_Framework Decorators
Hoy voy a escribir un poco sobre la decoraciones en los form de Zend, ya que por defecto es bastante feo!
Hay varias formas de cambiar el formato, una que leí es cambiando el css, otra es seteandole un Decorators al form, y definirlo como nosotros mas nos guste!
Una forma que estoy usando, gracias a un amigo, es la siguiente:
En la página donde se arma el form (yo estoy usando un archivo en el modelo):
Definir:
private $decoratorUser = array();
public function init(){
$this->decoratorUser = array(
'ViewHelper',
'Errors',
array('ViewScript', array('viewScript' => '/decorators/decoratorUser.phtml', 'placement' => false)),
);
}
Aca le digo que tome la decoración del la pagina ubicada en views/scripts/decorators/decoratorUser.phtml
decoratorUser.phtml
<div>
<!-- parte que remplaza el decorador Label -->
<?php
$attribs = $this->element->getAttribs();
$label = $this->element->getLabel();
//nuevo, verificamos si el elemento es requerido,
//entonces agregamos un elemento en html al final de la etiqueta
$attribs['escape'] = false;
$attribs['class'] = '';
$label = $this->escape($label);
if ($this->element->isRequired()) {
echo "<div id='labelform' name='labelform' >" . $this->formLabel($this->element->getName(), $label, $attribs) . " <span class='required'>*</span> </div>";
} else {
echo "<div id='labelform' name='labelform' >" . $this->formLabel($this->element->getName(), $label, $attribs) . "</div>";
}
echo "<div id='inputform' name='inputform' >" . $this->content . "</div><div id='val" . $this->element->getName() . "' name='val" . $this->element->getName() . "' class='validarform' ></div>";
?>
</div>
<br>
Lo que hace esto es separar el label con el input, así se le da el style que uno quiere, además se le agrega un * si es requerido.
Yo además, acá no se encuentra, le agregue un validador con Jquery y ajax, si alguien le interesa me avisa y explico como..
En el armado del form deberia quedar:
$usuario = $form->createElement("text","formusuario")
->setLabel("Usuario")
->setDecorators($this->decoratorUser)
->setRequired(true)
$form->addElement($usuario);
Con eso ya estaría todo, obviamente creando los css necesarios, a gusto de cada uno!
Cualquier duda o problema me avisan..
Saludos!


Hola me gusto, podrías mostrar como es eso de los validadores con ajax, si es que ya no escribiste algún artículo sobre eso.
Gracias.
Te dejo una introducción sobre el tema. (veré si es necesario después hacer un post)
en el decoratorUser.phtml
podes usar
en vez de
(también en el que no tiene el requiered)
en la funcion que arma el form agregar:
->setAttrib('onBlur', 'verificarValor("formusuario",this.value);');Supongamos algo asi
$usuario = $form->createElement("text","formusuario") ->setLabel("Usuario") ->setDecorators($this->decoratorUser) ->setRequired(true) ->setAttrib('onBlur', 'verificarValor("formusuario",this.value);'); $form->addElement($usuario);Después en un js agregar la funcion…
function verificarValor(nombre,valor){ $.ajax({ type: "GET", url: "/validadores/"+nombre+"/", data: "valor="+valor, async:false, success: function(datos){ $("#val"+nombre).html(datos); if (datos){ $("#"+nombre).addClass('bad'); }else{ $("#"+nombre).removeClass('bad'); } } }); }y crear el siguiente file
ValidadoresController.php en la carpeta de controladores
y que tenga el siguiente texto
getResponse(); $this->_helper->layout->disableLayout(); } public function formusuarioAction(){ $this->_helper->layout->disableLayout(); $param = $this->_getAllParams(); $usuariosDB = new usuariosDB(); if($usuariosDB->getUsuarioByNombre($param['valor'])){ print "Nombre de Usuario ya registrado"; } }Supongo que con esto te vastara para tender ma so menos lo que hago y por que lo hago!
si tenes mas dudas preguntame y lo respondere, despues hago un post mejor con mas datos!
saludos!
disculpa donde como inserato la hoja de estilo.css y desde que archivo lo llamo.
gracias
@carloss -> la hoja de estilo lo pones dentro de la carpeta html (o donde tengas el handler y los archivos js y css del proyecto) luego lo llamas desde el layout.phtml y listo.
hola ta bueno tu post, una consulta al momento de subir mis archivos al host y cargar mi pagina me muestra la lista de archivos de zend como puedo hacer para q me redireccione defrente al index sin q salga la wada de public?…..