| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 15103 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.form.forms">
- <title>Creando formularios usando Zend_Form</title>
- <para> La clase <classname>Zend_Form</classname> es usada para agregar elementos de formulario,
- desplegar grupos y subformularios. Éstos pueden ejecutar las siguientes acciones en estos
- elementos: </para>
- <itemizedlist>
- <listitem>
- <para> Validación, incluyendo la recuperación de código y mensajes de error </para>
- </listitem>
- <listitem>
- <para> Agregación de valor, incluyendo el llenado de elementos y recuperación de valores
- tanto filtrados como no filtrados para todos los elementos </para>
- </listitem>
- <listitem>
- <para> Iteración sobre todos los elementos, en el orden en el cual han sido introducidos
- o basados en el orden recuperado de cada elemento </para>
- </listitem>
- <listitem>
- <para> Generando el formulario entero, ya sea por un simple decorador que ejecuta un
- muestreo personalizado o por iteración sobre cada elemento del formulario </para>
- </listitem>
- </itemizedlist>
- <para> Mientras los formularios creados con <classname>Zend_Form</classname> pueden ser
- complejos, probablemente su mejor uso es para formularios simples; es mejor utilizarlo para
- desarrollar aplicaciones rápidas (RAD) y de prototipado. </para>
- <para> En lo más básico, simplemente instancie el objeto formulario: </para>
- <programlisting language="php"><![CDATA[
- // Objeto form genérico:
- $form = new Zend_Form();
- // Objeto form personalizado:
- $form = new My_Form()
- ]]></programlisting>
- <para> Opcionalmente puede pasarlo en la configuración, la cual será usada para establecer el
- estado del objeto, potencialmente así como también crear nuevos elementos: </para>
- <programlisting language="php"><![CDATA[
- // Pasando opciones en la configuración:
- $form = new Zend_Form($config);
- ]]></programlisting>
- <para>
- <classname>Zend_Form</classname> es iterable, e iterará sobre elementos, grupos que mostrar
- y subformularios, usando el orden en el cual han sido registrados y en cualquier índice de
- orden que cada uno pueda tener. Esto es útil en casos donde desee generar los elementos
- manualmente en el orden apropiado. </para>
- <para> La magia de <classname>Zend_Form</classname> radica en la habilidad para servir como
- fábrica para elementos y grupos, así como también la habilidad de generarse a sí mismo a
- través de decoradores. </para>
- <sect2 id="zend.form.forms.plugins">
- <title>Cargadores de Plugin</title>
- <para>
- <classname>Zend_Form</classname> hace uso de
- <classname>Zend_Loader_PluginLoader</classname> para permitir a los desarroladores
- especificar la ubicación de elementos y decoradores alternativos. Cada uno tiene su
- propio plugin loader asociado, y métodos de acceso genéricos son usados para recuperar y
- modificar cada uno. </para>
- <para> Los siguientes tipos de cargadores son usados con los variados métodos del plugin
- loader: 'element' y 'decorator'. Los nombres de los tipos no distinguen mayúsculas de
- minúsculas. </para>
- <para> Los métodos usados para interactuar con plugin loaders son los siguientes: </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setPluginLoader($loader, $type)</methodname>: $loader es el propio
- objeto plugin loader, mientras $type es uno de los tipos especificados arriba.
- Esto establece el plugin loader para el tipo dado al objeto loader recién
- especificado. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getPluginLoader($type)</methodname>: recupera el plugin loader
- asociado con $type. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addPrefixPath($prefix, $path, $type = null)</methodname>: agrega una
- asociación prefijo/ruta al loader especificado por $type. Si $type es nulo,
- intentará añadir una ruta a todos los loaders, añadiendo el prefijo "_Element" y
- "_Decorator"; y añadiendo la ruta con "Element/" y "Decorator/". Si tiene todas
- sus clases form element extras bajo una jerarquía común, éste es un método
- coveniente para establecer el prefijo de base para ellas. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addPrefixPaths(array $spec)</methodname>: le permite añadir varias
- rutas en uno o mas plugin loaders. Se espera que cada elemento del array sea un
- array con las claves 'path', 'prefix' y 'type'. </para>
- </listitem>
- </itemizedlist>
- <para> Adicionalmente, puede especificar prefijos de rutas para todos los elementos y
- mostrar grupos creados a través de una instancia de <classname>Zend_Form</classname>
- usando los siguientes métodos: </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>addElementPrefixPath($prefix, $path, $type = null)</methodname>:
- Igual que <methodname>addPrefixPath()</methodname>, debe especificar un prefijo
- y ruta de clase. <methodname>$type</methodname>, cuando se especifica, tiene que
- ser uno de los tipos plugin loader especificados por
- <classname>Zend_Form_Element</classname>; vea la <link
- linkend="zend.form.elements.loaders">sección elemento plugins </link> para
- más información de valores válidos para <methodname>$type</methodname>. Si
- <methodname>$type</methodname> no es especificado, el método asumirá que es
- un prefijo general para todos los tipos. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addDisplayGroupPrefixPath($prefix, $path)</methodname>: Igual que
- <methodname>addPrefixPath()</methodname>, debe especificar un prefijo y ruta
- de clase; sin embargo, dado que los grupos de visualización (display groups)
- sólo soportan decoradores como plugins, <methodname>$type</methodname> no es
- necesario. </para>
- </listitem>
- </itemizedlist>
- <para> Elementos y decoradores personalizados son una manera fácil de compartir
- funcionalidad entre formularios y encapsular funcionalidad personalizada. Vea el <link
- linkend="zend.form.elements.loaders.customLabel">ejemplo de Etiqueta
- Personalizada</link> en la documentación de elementos para un ejemplo de cómo
- elementos personalizados pueden ser usados como reemplazos para clases estándar. </para>
- </sect2>
- <sect2 id="zend.form.forms.elements">
- <title>Elementos</title>
- <para>
- <classname>Zend_Form</classname> proporciona varios métodos de acceso para añadir y
- eliminar elementos de el formulario. Éstos pueden tomar instancias de objetos de
- elemento o servir como fábricas para instanciar el objeto elemento a sí mismo. </para>
- <para> El método más básico para añadir un elemento es
- <methodname>addElement()</methodname>. Este método puede tomar también un objeto de tipo
- <classname>Zend_Form_Element</classname> (o de una clase extendiendo
- <classname>Zend_Form_Element</classname>), o argumentos para construir un nuevo
- elemento -- incluyendo el elemento tipo, nombre y algunas opciones de configuración. </para>
- <para> Como algunos ejemplos: </para>
- <programlisting language="php"><![CDATA[
- // Usando un elemento instanciado:
- $element = new Zend_Form_Element_Text('foo');
- $form->addElement($element);
- // Usando una fábrica
- //
- // Crea un elemento de tipo Zend_Form_Element_Text con el
- // nombre de 'foo':
- $form->addElement('text', 'foo');
- // Pasa una opción etiqueta al elemento:
- $form->addElement('text', 'foo', array('label' => 'Foo:'));
- ]]></programlisting>
- <note>
- <title>addElement() Implementa una Interfaz Fluida</title>
- <para>
- <methodname>addElement()</methodname> implementa una interfaz fluida; es decir,
- retorna el objeto <classname>Zend_Form</classname> y no un elemento. Esto se ha
- hecho para permitirle encadenar multiples métodos addElement() u otros métodos
- formulario que implementen una interfaz fluida (todos los establecedores en
- Zend_Form implementan el patrón). </para>
- <para> Si desea retornar el elemento, use <methodname>createElement()</methodname>, el
- cual es esbozado abajo. Tenga en cuenta de cualquier manera que
- <methodname>createElement()</methodname> no adjunta el elemento al formulario. </para>
- <para> Internamente, <methodname>addElement()</methodname> en realidad emplea
- <methodname>createElement()</methodname> para crear el elemento antes de
- adjuntarlo al formulario. </para>
- </note>
- <para> Una vez que el elemento ha sido añadido al formulario, puede recuperarlo por el
- nombre. Puede también finalizar usando el método <methodname>getElement()</methodname> o
- usando sobrecarga para acceder al elemento como una propiedad de objeto: </para>
- <programlisting language="php"><![CDATA[
- // getElement():
- $foo = $form->getElement('foo');
- // Como propiedad del objeto:
- $foo = $form->foo;
- ]]></programlisting>
- <para> Ocasionalmente, se quiere crear un elemento sin adjuntarlo al formulario (para
- instanciar, si se desea hacer uso de las rutas de plugin introducidas con el formulario,
- pero después se desea adjuntar el objeto al subformulario). El método
- <methodname>createElement()</methodname> permite hacer eso: </para>
- <programlisting language="php"><![CDATA[
- // $username llega a ser un objeto Zend_Form_Element_Text:
- $username = $form->createElement('text', 'username');
- ]]></programlisting>
- <sect3 id="zend.form.forms.elements.values">
- <title>Llenar y recuperar valores</title>
- <para> Después de validar el formulario, originalmente se necesitará recuperar los
- valores para poder ejecutar otras operaciones, tal como actualizar una base de datos
- o notificar un servicio web. Se pueden recuperar todos los valores para todos los
- elementos usando <methodname>getValues()</methodname>;
- <methodname>getValue($name)</methodname> le permite recuperar un solo valor del
- elemento por su nombre: </para>
- <programlisting language="php"><![CDATA[
- // Obtener todos los valores:
- $values = $form->getValues();
- // Obtener sólo los valores del elemento 'foo':
- $value = $form->getValue('foo');
- ]]></programlisting>
- <para> A veces se quiere llenar el formulario con valores especificos antes de
- generarlos. Éstos pueden ser llevados a cabo ya sea con los métodos
- <methodname>setDefaults()</methodname> o <methodname>populate()</methodname>: </para>
- <programlisting language="php"><![CDATA[
- $form->setDefaults($data);
- $form->populate($data);
- ]]></programlisting>
- <para> Por otro lado, si se quisera limpiar el formulario antes de llenarlo o validarlo;
- se puede realizar usando el método <methodname>reset()</methodname>: </para>
- <programlisting language="php"><![CDATA[
- $form->reset();
- ]]></programlisting>
- </sect3>
- <sect3 id="zend.form.forms.elements.global">
- <title>Operaciones Globales</title>
- <para> Ocasionalemnte se necesitarán ciertas operaciones que afecten a todos los
- elementos. Escenarios comunes incluyen la necesidad de determinar rutas de acceso al
- prefijo complemento para todos los elementos, determinando decoradores para todos
- los elementos y determinando filtros para todos los elementos. Como ejemplos: </para>
- <example id="zend.form.forms.elements.global.allpaths">
- <title>Determinando rutas de acceso de prefijos para todos los elementos</title>
- <para> Se puede determinar rutas de acceso para prefijos para todos los elementos
- por tipo, o usando un prefijo global. Como ejemplos: </para>
- <programlisting language="php"><![CDATA[
- // Determinar la ruta de acceso de prefijos global
- // Crear rutas de acceso para los prefijos My_Foo_Filter, My_Foo_Validate,
- // y My_Foo_Decorator
- $form->addElementPrefixPath('My_Foo', 'My/Foo/');
- // Sólo rutas de acceso de filtros:
- $form->addElementPrefixPath('My_Foo_Filter',
- 'My/Foo/Filter',
- 'filter');
- // Sólo rutas de acceso de validadores:
- $form->addElementPrefixPath('My_Foo_Validate',
- 'My/Foo/Validate',
- 'validate');
- // Sólo rutas de acceso de decoradores:
- $form->addElementPrefixPath('My_Foo_Decorator',
- 'My/Foo/Decorator',
- 'decorator');
- ]]></programlisting>
- </example>
- <example id="zend.form.forms.elements.global.decorators">
- <title>Determinando Decoradores para todos los elementos</title>
- <para> Se pueden determinar decoradores para todos los elementos.
- <methodname>setElementDecorators()</methodname> acepta una matriz de
- decoradores, solo como <methodname>setDecorators()</methodname>, y reescribirá
- cualquier decorador previamente determinado en cada elemento. En este ejemplo,
- determinamos los decoradores para simplificar una ViewHelper y una Label: </para>
- <programlisting language="php"><![CDATA[
- $form->setElementDecorators(array(
- 'ViewHelper',
- 'Label'
- ));
- ]]></programlisting>
- </example>
- <example id="zend.form.forms.elements.global.decoratorsFilter">
- <title>Determinando decoradores para algunos elementos</title>
- <para> Pueden determinarse también decoradores para un subconjunto de elementos, ya
- sea por inclusión o exclusión. El segundo argumento
- <methodname>setElementDecorators()</methodname> puede ser un array de
- nombres de elemento; por defecto, especificar un array de ese tipo determinará
- los decoradores especificados en esos elementos solamente. Puede tambien pasar
- un tercer elemento, una bandera indicando si esta lista de elementos es para
- propósitos de inclusión o exclusión; si es falso, decorará todos los elementos
- <emphasis>excepto</emphasis> los pasados en la lista, Como uso estándar del
- método, cualquier decorador pasado reescribirá cualquier decorador previamente
- determinado en cada elemento. </para>
- <para> En el siguiente fragmento, indicamos que queremos los decoradores ViewHelper
- y Label para los elementos 'foo' y 'bar': </para>
- <programlisting language="php"><![CDATA[
- $form->setElementDecorators(
- array(
- 'ViewHelper',
- 'Label'
- ),
- array(
- 'foo',
- 'bar'
- )
- );
- ]]></programlisting>
- <para> Por otro lado, con este fragmento, indicaremos que queremos usar solamente
- los decoradores ViewHelper y Label para cada elemento
- <emphasis>excepto</emphasis> los elementos 'foo' y 'bar': </para>
- <programlisting language="php"><![CDATA[
- $form->setElementDecorators(
- array(
- 'ViewHelper',
- 'Label'
- ),
- array(
- 'foo',
- 'bar'
- ),
- false
- );
- ]]></programlisting>
- </example>
- <note>
- <title>Algunos Decoradores son Inapropiados para algunos Elementos</title>
- <para> Mientras <methodname>setElementDecorators()</methodname> puede parecer una
- buena solución, existen algunos casos donde puede terminar con resultados
- inesperados, Por ejemplo, los muchos elementos botones (Submit, Button, Reset),
- actualmente usan la etiqueta como el valor del botón y sólo usan los decoradores
- ViewHelper y DtDdWrapper -- previniendo una etiqueta adicional, errores, y
- sugerencias de ser generadas; el ejemplo de arriba podría duplicar algún
- contenido (la etiqueta). </para>
- <para> Se puede usar el array de inclusión/exclusión para superar este problema como
- se ha notado en el ejemplo anterior. </para>
- <para> Entonces, use este método sabiamente y dése cuenta de que puede necesitar
- excluir o cambiar manualmente algunos elementos decoradores para prevenir una
- salida no deseada. </para>
- </note>
- <example id="zend.form.forms.elements.global.filters">
- <title>Determinando Filtros para todos los Elementos</title>
- <para> En muchos casos, puede quererse aplicar el mismo filtro a todos los
- elementos; un caso común es <methodname>trim()</methodname> a todos los valores: </para>
- <programlisting language="php"><![CDATA[
- $form->setElementFilters(array('StringTrim'));
- ]]></programlisting>
- </example>
- </sect3>
- <sect3 id="zend.form.forms.elements.methods">
- <title>Métodos para Interactuar con los Elementos</title>
- <para> Los siguientes métodos pueden ser usados para interactuar con los elementos: </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>createElement($element, $name = null, $options =
- null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addElement($element, $name = null, $options = null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addElements(array $elements)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setElements(array $elements)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getElement($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getElements()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeElement($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearElements()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDefaults(array $defaults)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDefault($name, $value)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getValue($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getValues()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getUnfilteredValue($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getUnfilteredValues()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setElementFilters(array $filters)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setElementDecorators(array $decorators)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addElementPrefixPath($prefix, $path, $type = null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addElementPrefixPaths(array $spec)</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- </sect2>
- <sect2 id="zend.form.forms.displaygroups">
- <title>Grupos de visualización (display groups)</title>
- <para> Los grupos de visualización (display groups) son una manera de crear grupos virtuales
- de elementos para propósitos de visualización. Todos los elementos quedan accesibles por
- nombre en el formulario, pero cuando interactúan o se ejecutan sobre el formulario,
- cualquiera de los elementos en un grupos de visualización son generados juntos. El caso
- más común de uso es agrupando los elementos en fieldsets. (TODO) </para>
- <para> La clase base para los grupos de visualización es
- <methodname>Zend_Form_DisplayGroup</methodname>. Mientras puede ser instanciado
- directamente, es mejor usar el método <methodname>addDisplayGroup()</methodname> de la
- clase<classname>Zend_Form</classname>. Este método toma un array de elementos como
- primer argumento y el nombre para el grupo de visualización como segundo argumento.
- Opcionalmente, se puede pasar en una array de opciones o en un objeto
- <methodname>Zend_Config</methodname> como tercer argumento. </para>
- <para> Asumiendo que los elementos 'username' y 'password' has sido determinados en el
- formulario, el siguiente código podría agrupar estos elementos en un grupo de
- visualización 'login': </para>
- <programlisting language="php"><![CDATA[
- $form->addDisplayGroup(array('username', 'password'), 'login');
- ]]></programlisting>
- <para> Puede acceder a los grupos de visualización usando el método
- <methodname>getDisplayGroup()</methodname>, o mediante la sobrecarga usando el
- nombre del grupo de visualización: </para>
- <programlisting language="php"><![CDATA[
- // Usando getDisplayGroup():
- $login = $form->getDisplayGroup('login');
- // Usando sobrecarga:
- $login = $form->login;
- ]]></programlisting>
- <note>
- <title>Decoradores por defecto que no necesitan ser cargados</title>
- <para> Por defecto, los grupos de visualización son cargados durante la inicialización
- del objeto. Se puede deshabilitar pasando la opción 'disableLoadDefaultDecorators'
- cuando se crea un grupo de visualización: </para>
- <programlisting language="php"><![CDATA[
- $form->addDisplayGroup(
- array('foo', 'bar'),
- 'foobar',
- array('disableLoadDefaultDecorators' => true)
- );
- ]]></programlisting>
- <para> Esta opción puede ser una mezcla con otras opciones pasadas, ambas como opciones
- de array o en el objeto <methodname>Zend_Config</methodname>
- </para>
- </note>
- <sect3 id="zend.form.forms.displaygroups.global">
- <title>Operaciones Globales</title>
- <para> Al igual que los elementos, existen algunas operaciones que pueden afectar a
- todos los grupos de visualización; éstas incluyen determinar decoradores y fijar la
- ruta de acceso donde buscar los decoradores. </para>
- <example id="zend.form.forms.displaygroups.global.paths">
- <title>Fijando el Prefijo de Ruta del Decorador para todos los Grupos de
- Visualización</title>
- <para> Por defecto, los grupos de visualización heredan cualquier ruta de decorador
- que use el formulario; sin embargo, si deberían buscar en una ruta alternativa,
- puede usar el método <methodname>addDisplayGroupPrefixPath()</methodname>
- method. </para>
- <programlisting language="php"><![CDATA[
- $form->addDisplayGroupPrefixPath('My_Foo_Decorator', 'My/Foo/Decorator');
- ]]></programlisting>
- </example>
- <example id="zend.form.forms.displaygroups.global.decorators">
- <title>Fijando Decoradores para Todos los Grupos de Visualización</title>
- <para> Pueden determinarse decoradores para todos los grupos de visualización,
- <methodname>setDisplayGroupDecorators()</methodname> admite un array de
- decoradores, al igual que <methodname>setDecorators()</methodname>, y
- sobreescribirá cualquier conjunto de decoradores previo en cada grupo de
- visualización. En este ejemplo, fijamos los decoradores a un fieldset (el
- decorador FormElements es necesario para asegurar que los elementos son
- iterador): </para>
- <programlisting language="php"><![CDATA[
- $form->setDisplayGroupDecorators(array(
- 'FormElements',
- 'Fieldset'
- ));
- ]]></programlisting>
- </example>
- </sect3>
- <sect3 id="zend.form.forms.displaygroups.customClasses">
- <title>Usando Clases de Grupos de Visualización Personalizadas</title>
- <para> Por defecto, <classname>Zend_Form</classname> utiliza la clase
- <methodname>Zend_Form_DisplayGroup</methodname> para grupos de visualización.
- Puede ocurrir que necesite extender esta clase con el fin de obtener una funcionalid
- personalizada. <methodname>addDisplayGroup()</methodname> no permite pasar una
- instancia determinada, pero permite especificar la clase que usar como una de sus
- opciones, usando la clave 'displayGroupClass': </para>
- <programlisting language="php"><![CDATA[
- // Use the 'My_DisplayGroup' class
- $form->addDisplayGroup(
- array('username', 'password'),
- 'user',
- array('displayGroupClass' => 'My_DisplayGroup')
- );
- ]]></programlisting>
- <para> Si la clase no ha sido todavía cargada, <classname>Zend_Form</classname>
- intentará cargarla a través de <methodname>Zend_Loader</methodname>. </para>
- <para> También puede especificar una clase de grupo de visualización por defecto para
- usar con el formulario, de forma que todos los grupos de visualización creados con
- el objeto formulario usen esa clase: </para>
- <programlisting language="php"><![CDATA[
- // Use the 'My_DisplayGroup' class for all display groups:
- $form->setDefaultDisplayGroupClass('My_DisplayGroup');
- ]]></programlisting>
- <para> Esta funcionalidad puede especificarse en configuraciones como
- 'defaultDisplayGroupClass', y será cargada con antelación para asegurar que todos
- los grupos de visualización usen esa clase. </para>
- </sect3>
- <sect3 id="zend.form.forms.displaygroups.interactionmethods">
- <title>Métodos para Interactuar con Grupos de Visualización</title>
- <para> Los siguientes métodos pueden ser usados para interactuar con el grupo de
- visualización: </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>addDisplayGroup(array $elements, $name, $options =
- null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addDisplayGroups(array $groups)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDisplayGroups(array $groups)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getDisplayGroup($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getDisplayGroups()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeDisplayGroup($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearDisplayGroups()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDisplayGroupDecorators(array $decorators)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addDisplayGroupPrefixPath($prefix, $path)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDefaultDisplayGroupClass($class)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getDefaultDisplayGroupClass($class)</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- <sect3 id="zend.form.forms.displaygroups.methods">
- <title>Métodos Zend_Form_DisplayGroup</title>
- <para>
- <methodname>Zend_Form_DisplayGroup</methodname> tiene los siguientes métodos,
- agrupados por tipo: </para>
- <itemizedlist>
- <listitem>
- <para>Configuración:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setOptions(array $options)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setConfig(Zend_Config $config)</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Metadatos:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setAttrib($key, $value)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addAttribs(array $attribs)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setAttribs(array $attribs)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getAttrib($key)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getAttribs()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeAttrib($key)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearAttribs()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setName($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getName()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDescription($value)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getDescription()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setLegend($legend)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getLegend()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setOrder($order)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getOrder()</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Elementos:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>createElement($type, $name, array $options =
- array())</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addElement($typeOrElement, $name, array $options =
- array())</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addElements(array $elements)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setElements(array $elements)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getElement($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getElements()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeElement($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearElements()</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Cargadores Complemento:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setPluginLoader(Zend_Loader_PluginLoader
- $loader)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getPluginLoader()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addPrefixPath($prefix, $path)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addPrefixPaths(array $spec)</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Decoratores:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>addDecorator($decorator, $options = null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addDecorators(array $decorators)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDecorators(array $decorators)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getDecorator($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getDecorators()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeDecorator($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearDecorators()</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Generadores:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setView(Zend_View_Interface $view = null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getView()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>render(Zend_View_Interface $view = null)</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>I18n:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setTranslator(Zend_Translate_Adapter $translator =
- null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getTranslator()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDisableTranslator($flag)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>translatorIsDisabled()</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- </itemizedlist>
- </sect3>
- </sect2>
- <sect2 id="zend.form.forms.subforms">
- <title>Subformularios</title>
- <para> Los Sub formularios sirven para diferentes propósitos: </para>
- <itemizedlist>
- <listitem>
- <para> Crear grupos de elementos lógicos. Dado que los sub formularios son
- simplemente formularios, se pueden validar subformularios como entidades
- individuales. </para>
- </listitem>
- <listitem>
- <para> Crear formularios multi-páginas. Dado que los sub formularios son simplemente
- formularios, se puede deplegar un sub formulario por separado por página,
- incrementando formularios multi-páginas donde cada formulario tiene su propia
- validación lógica. Solo una vez que todos los sub formularios se validen, el
- formulario se consideraría completo. </para>
- </listitem>
- <listitem>
- <para> Agrupaciones de visualización. Como grupos de visualización, los sub
- formularios, cuando son generados como parte de un formulario más grande, pueden
- ser usados para agrupar elementos. Sea consciente, de todas maneras, que el
- objeto formulario principal no tendrá conocimiento de los elementos en un sub
- formulario. </para>
- </listitem>
- </itemizedlist>
- <para> Un sub formulario puede ser un objeto <classname>Zend_Form</classname> o mas
- originalmente, un objeto <methodname>Zend_Form_SubForm</methodname>. éste último
- contiene decoradores apropiados para la inclusión en un formulario extenso (i.e., no se
- generan adicionales formulario etiquetas HTML, pero si grupos de elementos). Para
- adjuntar un sub formulario, simplemente añádalo al formulario y déle un nombre: </para>
- <programlisting language="php"><![CDATA[
- $form->addSubForm($subForm, 'subform');
- ]]></programlisting>
- <para> Se puede recuperar un sub formulario usando ya sea
- <methodname>getSubForm($name)</methodname> o sobrecarga usando el nombre del sub
- formulario: </para>
- <programlisting language="php"><![CDATA[
- // Usando getSubForm():
- $subForm = $form->getSubForm('subform');
- // Usando sobrecarga:
- $subForm = $form->subform;
- ]]></programlisting>
- <para> Los Subformularios son incluidos en la interacción del formulario, sin embargo los
- elementos que lo contienen no lo son </para>
- <sect3 id="zend.form.forms.subforms.global">
- <title>Operaciones Globales</title>
- <para> Como los elementos y los grupos de visualización, existen algunas operaciones que
- pueden afectar a todos los sub formularios. A diferencia de los grupos de
- visualización y los elementos, sin embargo, los sub formularios heredan más
- funcionalidad del objeto formulario principal, y la única operación real que puede
- realizarse globalmente es determinar decoradores para sub formularios. Para este
- propósito, existe el método <methodname>setSubFormDecorators()</methodname>. En el
- siguiente ejemplo, determinaremos el decorador para todos los subformularios que
- sera un simple campo (el decorador FormElements es necesario para asegurar que los
- elementos son iterados): </para>
- <programlisting language="php"><![CDATA[
- $form->setSubFormDecorators(array(
- 'FormElements',
- 'Fieldset'
- ));
- ]]></programlisting>
- </sect3>
- <sect3 id="zend.form.forms.subforms.methods">
- <title>Métodos para interactuar con Sub Formularios</title>
- <para> Los siguientes métodos pueden ser usados para interactuar con sub formularios: </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>addSubForm(Zend_Form $form, $name, $order = null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addSubForms(array $subForms)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setSubForms(array $subForms)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getSubForm($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getSubForms()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeSubForm($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearSubForms()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setSubFormDecorators(array $decorators)</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- </sect2>
- <sect2 id="zend.form.forms.metadata">
- <title>Metadatos y Atributos</title>
- <para> Mientras la utilidad de un formulario primariamente deriva de los elementos que
- contiene, también pueden contener otros metadatos, como un nombre (usado a menudo como
- ID único en el marcado HTML ); la accion y el método del formulario; el número de
- elementos, grupos y sub formularios que lo contienen; y arbitrariamente metadatos
- (usualmente usados para determinar atributos HTML para la etiqueta del propio
- formulario). </para>
- <para> Se puede determinar y recuperar el nombre del formulario usando el accesor nombre: </para>
- <programlisting language="php"><![CDATA[
- // Determinar el nombre:
- $form->setName('registration');
- // Recuperar el nombre:
- $name = $form->getName();
- ]]></programlisting>
- <para> Para determinar la acción (url en el cual se envia el formulario) y método (método
- por el cual debería enviar, ej. 'POST' or 'GET'), use los accesores acción y método: </para>
- <programlisting language="php"><![CDATA[
- // Determinar la acción y método:
- $form->setAction('/user/login')
- ->setMethod('post');
- ]]></programlisting>
- <para> Se puede también especificar el tipo de codificación del fomulario usando el enctype
- accessors. Zend_Form define dos constantes,
- <methodname>Zend_Form::ENCTYPE_URLENCODED</methodname> y
- <methodname>Zend_Form::ENCTYPE_MULTIPART</methodname>, correspondiente a los valores
- 'application/x-www-form-urlencoded' y 'multipart/form-data', respectivamente; sin
- embargo, puede configurarlo con cualquier tipo de codificación. </para>
- <programlisting language="php"><![CDATA[
- // Determinar la acción, método y enctype:
- $form->setAction('/user/login')
- ->setMethod('post')
- ->setEnctype(Zend_Form::ENCTYPE_MULTIPART);
- ]]></programlisting>
- <note>
- <para> El método, acción y enctype son solo usados internamente para generar, y no para
- algún tipo de validación. </para>
- </note>
- <para>
- <classname>Zend_Form</classname> implementa la interfaz
- <methodname>Countable</methodname> permitiéndole pasarlo como un argumento para
- contar: </para>
- <programlisting language="php"><![CDATA[
- $numItems = count($form);
- ]]></programlisting>
- <para> Determinar metadatos arbitrariamente se realiza a través de los accesores 'atribs'.
- Dado que la sobrecarga en <classname>Zend_Form</classname> es usada para acceder
- elementos, grupos de visualización y subformularios, este es el único método para
- acceder a los metadatos. </para>
- <programlisting language="php"><![CDATA[
- // Determinando atributos:
- $form->setAttrib('class', 'zend-form')
- ->addAttribs(array(
- 'id' => 'registration',
- 'onSubmit' => 'validate(this)',
- ));
- // Recuperando atributos:
- $class = $form->getAttrib('class');
- $attribs = $form->getAttribs();
- // Removiendo atributos:
- $form->removeAttrib('onSubmit');
- // Limpiando todos los atributos:
- $form->clearAttribs();
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.form.forms.decorators">
- <title>Decoradores</title>
- <para> Crear el marcado para un formulario es a menudo una tarea que consume mucho tiempo,
- particularmente si se planea reusar el mismo marcado para mostrar acciones tales como
- validación de errores, enviar valores, etc. La respuesta de
- <classname>Zend_Form</classname> a este problema es los
- <emphasis>decoradores</emphasis>. </para>
- <para> Los decoradores para objetos <classname>Zend_Form</classname> pueden ser usados para
- generar un formulario. El decorador FormElements iterará a través de todos los elementos
- en un formulario -- elementos, grupos de visualización y subformularios -- y los
- generará, devolviendo el resultado. Adicionalmente, los decoradores pueden ser usados
- para envolver el contenido o anteponerlo o postponerlo. </para>
- <para> Los decoradores por defecto de <classname>Zend_Form</classname> son FormElements,
- HtmlTag (envuelve una lista de definición) y Form; el código equivalente para crearlos
- es como sigue: </para>
- <programlisting language="php"><![CDATA[
- $form->setDecorators(array(
- 'FormElements',
- array('HtmlTag', array('tag' => 'dl')),
- 'Form'
- ));
- ]]></programlisting>
- <para> Que crea la salida como sigue: </para>
- <programlisting language="html"><![CDATA[
- <form action="/form/action" method="post">
- <dl>
- ...
- </dl>
- </form>
- ]]></programlisting>
- <para> Algunos de los atributos se determinan en el objeto formulario que será usado como
- atributos HTML de la etiqueta <methodname><form></methodname>. </para>
- <note>
- <title>Decoradores por defecto que no necesitan ser cargados</title>
- <para> Por defecto, el decorador por defecto son cargados durante la inicialización del
- objeto. Puede deshabilitarlo pasando la opción 'disableLoadDefaultDecorators' al
- constructor: </para>
- <programlisting language="php"><![CDATA[
- $form = new Zend_Form(array('disableLoadDefaultDecorators' => true));
- ]]></programlisting>
- <para> Esta opción puede ser combinada con alguna otra opción que usted pueda pasar,
- tanto como opciones de array o en un objeto <methodname>Zend_Config</methodname>
- </para>
- </note>
- <note>
- <title>Usando multiples decoradores del mismo tipo</title>
- <para> Internamente, <classname>Zend_Form</classname> usa una clase decorador como un
- mecanismo buscador cuando se recuperan decoradores. Como resultado, no se pueden
- registrar multiples decoradores del mismo tipo; subsecuentemente los decoradores
- simplemente sobrescribirán esos decoradores que existían antes. </para>
- <para> Para conseguir esto, se pueden usar alias. En vez de pasar un decorador o un
- nombre de decorador como primer argumento a <methodname>addDecorator()</methodname>,
- pase un array con un solo elemento, con el alias apuntando al objeto decorador o
- nombre: </para>
- <programlisting language="php"><![CDATA[
- // Alias para 'FooBar':
- $form->addDecorator(array('FooBar' => 'HtmlTag'), array('tag' => 'div'));
- // y recuperarlo después:
- $form = $element->getDecorator('FooBar');
- ]]></programlisting>
- <para> En los métodos <methodname>addDecorators()</methodname> y
- <methodname>setDecorators()</methodname>, se necesitará pasar la opción
- 'decorator' en el array representando el decorador: </para>
- <programlisting language="php"><![CDATA[
- // Añadir dos decoradores 'HtmlTag', poniendo un alias a 'FooBar':
- $form->addDecorators(
- array('HtmlTag', array('tag' => 'div')),
- array(
- 'decorator' => array('FooBar' => 'HtmlTag'),
- 'options' => array('tag' => 'dd')
- ),
- );
- // y recuperándolo después:
- $htmlTag = $form->getDecorator('HtmlTag');
- $fooBar = $form->getDecorator('FooBar');
- ]]></programlisting>
- </note>
- <para> Puede crear su propio decorador para generar el formulario. Un caso de uso común es
- si sabe el HTML exacto que desea usar; su decorador puede crear el mismo HTML y
- simplemente retornarlo, potencialmente usando los decoradores de individuales elementos
- o grupos de visualización. </para>
- <para> Los siguientes métodos puden ser usados para interactuar con decoradores: </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>addDecorator($decorator, $options = null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addDecorators(array $decorators)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDecorators(array $decorators)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getDecorator($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getDecorators()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeDecorator($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearDecorators()</methodname>
- </para>
- </listitem>
- </itemizedlist>
- <para>
- <classname>Zend_Form</classname> también usa sobrecarga que permite generar decoradores
- específicos. <methodname>__call()</methodname> interceptará métodos que lleve con el
- texto 'render' y use el resto del nombre del método para buscar un decorador; si se
- encuentran, serán generados por un <emphasis>solo</emphasis> decorador. Cualquier
- argumento pasado a la llamada del método será usado como contenido que pasar al método
- <methodname>render()</methodname> del decorador. Como ejemplo: </para>
- <programlisting language="php"><![CDATA[
- // Generar solo los decoradores FormElements:
- echo $form->renderFormElements();
- // Generar solo el campo decorador, pasando el contenido:
- echo $form->renderFieldset("<p>This is fieldset content</p>");
- ]]></programlisting>
- <para> Si el decorador no existe, una excepción se creará. </para>
- </sect2>
- <sect2 id="zend.form.forms.validation">
- <title>Validación</title>
- <para> Un caso de uso primario para formularios es validar datos enviados.
- <classname>Zend_Form</classname> le permite validar un formulario entero de una vez,
- o una parte de él, asi como también automatizar las respuestas de validación para
- XmlHttpRequests (AJAX). Si los datos enviados no son válidos, contiene métodos para
- recuperar los distintos códigos errores y los mensajes de elementos y subformularios de
- validaciones fallidas. </para>
- <para> Para validar un formulario entero, use el método <methodname>isValid()</methodname>: </para>
- <programlisting language="php"><![CDATA[
- if (!$form->isValid($_POST)) {
- // validación fallida
- }
- ]]></programlisting>
- <para>
- <methodname>isValid()</methodname> validará cada elemento requerido, y algún elemento no
- requerido contenido en la data sometida. </para>
- <para> Algunas veces se necesitará validar sólo un subset del dato; para esto use
- <methodname>isValidPartial($data)</methodname>: </para>
- <programlisting language="php"><![CDATA[
- if (!$form->isValidPartial($data)) {
- // validación fallida
- }
- ]]></programlisting>
- <para>
- <methodname>isValidPartial()</methodname> sólo intenta validar aquellos elementos en la
- información para los cuales existen similares elementos; si un elemento es no
- representado en la información, es pasado por alto. </para>
- <para> Cuando se validan elementos o grupos de elementos para un requeirimiento AJAX,
- típicamente se validará un subset del formulario, y quiere la respuesta en JSON.
- <methodname>processAjax()</methodname> precisamente realiza eso: </para>
- <programlisting language="php"><![CDATA[
- $json = $form->processAjax($data);
- ]]></programlisting>
- <para> Entonces, puede simplemente enviar la respuesta JSON al cliente. Si el formulario es
- válido, ésta será una respuesta booleana. Si no, será un objeto javascript conteniendo
- pares de clave/mensaje, donde cada 'message' es un array de validación de mensajes de
- error. </para>
- <para> Para los formularios que fallan la validación, se pueden recuperar ambos códigos de
- error y mensajes de error, usando <methodname>getErrors()</methodname> y
- <methodname>getMessages()</methodname>, respectivamente: </para>
- <programlisting language="php"><![CDATA[
- $codes = $form->getErrors();
- $messages = $form->getMessage();
- ]]></programlisting>
- <note>
- <para> Dado que los mensajes devueltos por <methodname>getMessages()</methodname> son un
- array de pares de errores código/mensaje, <methodname>getErrors()</methodname> no es
- necesario. </para>
- </note>
- <para> Puede recuperar códigos y mensajes de error para elementos individuales simplemente
- pasando el nombre del elemento a cada uno: </para>
- <programlisting language="php"><![CDATA[
- $codes = $form->getErrors('username');
- $messages = $form->getMessages('username');
- ]]></programlisting>
- <note>
- <para> Nota: Cuando validamos elementos, <classname>Zend_Form</classname> envía un
- segundo argumento a cada método <methodname>isValid()</methodname> del elemento: el
- array de los datos que se están validando. Esto puede ser usado por validadores
- individuales para permitirles utilizar otros valores enviados al determinar la
- validez de los datos. Un ejemplo sería un formulario de registro que requiere tanto
- una contraseña como una confirmación de la contraseña; el elemento contraseña puede
- usar la confirmación de la contraseña como parte de su validación. </para>
- </note>
- <sect3 id="zend.form.forms.validation.errors">
- <title>Mensajes de error personalizados</title>
- <para> A veces, puede querer especificar uno o más mensajes de error en vez de los
- mensajes de error generados por los validadores adjuntos a los elementos.
- Adicionalmente, a veces puede querer marcar el formulario inválido usted mismo. Como
- 1.6.0, esta funcionalidad es posible siguiendo los métodos. At times, you may want
- to specify one or more specific error messages to use instead of the error messages
- generated by the validators attached to your elements. Additionally, at times you
- may want to mark the form invalid yourself. As of 1.6.0, this functionality is
- possible via the following methods. </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>addErrorMessage($message)</methodname>: añade un mensaje de
- error para desplegar en el formulario los errores de validación. Se debe
- llamar más de una vez, y los nuevos mensajes son adicionados a la pila.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addErrorMessages(array $messages)</methodname>: añade múltiples
- mensajes de error para desplegar en el formulario los errores de validación
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setErrorMessages(array $messages)</methodname>: añade multiples
- mensajes de error para desplegar en el formulario los errores de validación,
- sobrescribiendo todos los mensajes de error previamente determinados.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getErrorMessages()</methodname>: recupera la lista de mensajes
- de error personalizados que han sido definidos. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearErrorMessages()</methodname>: remueve todos los mensajes de
- error personalizados que han sido definidos. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>markAsError()</methodname>: marca el formulario como que la
- validación ha fallado. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addError($message)</methodname>: añade un mensaje a la pila de
- mensajes de error personalizados y señala al formulario como inválido.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addErrors(array $messages)</methodname>: añade muchos mensajes a
- la pila de mensajes de error personalizados y señala al formulario como
- inválido. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setErrors(array $messages)</methodname>: sobrescribe la pila de
- mensajes de error personalizada con los mensajes proporcionados y señala el
- formulario como inválido. </para>
- </listitem>
- </itemizedlist>
- <para> Todos los errores determinados de esta manera pueden ser traducidos. </para>
- </sect3>
- </sect2>
- <sect2 id="zend.form.forms.methods">
- <title>Métodos</title>
- <para> La siguiente lista es la lista completa de métodos disponibles para
- <classname>Zend_Form</classname>, agrupados por tipo: </para>
- <itemizedlist>
- <listitem>
- <para>Configuración y opciones:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setOptions(array $options)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setConfig(Zend_Config $config)</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Cargadores de plugins y rutas:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setPluginLoader(Zend_Loader_PluginLoader_Interface $loader,
- $type = null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getPluginLoader($type = null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addPrefixPath($prefix, $path, $type = null) </methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addPrefixPaths(array $spec)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addElementPrefixPath($prefix, $path, $type =
- null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addElementPrefixPaths(array $spec)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addDisplayGroupPrefixPath($prefix, $path)</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Metadato:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setAttrib($key, $value)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addAttribs(array $attribs)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setAttribs(array $attribs)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getAttrib($key)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getAttribs()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeAttrib($key)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearAttribs()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setAction($action)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getAction()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setMethod($method)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getMethod()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setName($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getName()</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Elementos:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>addElement($element, $name = null, $options =
- null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addElements(array $elements)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setElements(array $elements)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getElement($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getElements()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeElement($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearElements()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDefaults(array $defaults)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDefault($name, $value)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getValue($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getValues()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getUnfilteredValue($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getUnfilteredValues()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setElementFilters(array $filters)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setElementDecorators(array $decorators)</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Subformularios:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>addSubForm(Zend_Form $form, $name, $order =
- null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addSubForms(array $subForms)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setSubForms(array $subForms)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getSubForm($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getSubForms()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeSubForm($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearSubForms()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setSubFormDecorators(array $decorators)</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Grupos de Visualización</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>addDisplayGroup(array $elements, $name, $options =
- null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addDisplayGroups(array $groups)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDisplayGroups(array $groups)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getDisplayGroup($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getDisplayGroups()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeDisplayGroup($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearDisplayGroups()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDisplayGroupDecorators(array $decorators)</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Validación</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>populate(array $values)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>isValid(array $data)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>isValidPartial(array $data)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>processAjax(array $data)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>persistData()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getErrors($name = null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getMessages($name = null)</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>Generadores:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setView(Zend_View_Interface $view = null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getView()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addDecorator($decorator, $options = null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addDecorators(array $decorators)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDecorators(array $decorators)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getDecorator($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getDecorators()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeDecorator($name)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearDecorators()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>render(Zend_View_Interface $view = null)</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>I18n:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setTranslator(Zend_Translate_Adapter $translator =
- null)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getTranslator()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDisableTranslator($flag)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>translatorIsDisabled()</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- </itemizedlist>
- </sect2>
- <sect2 id="zend.form.forms.config">
- <title>Configuración</title>
- <para>
- <classname>Zend_Form</classname> es totalmente configurable mediante
- <methodname>setOptions()</methodname> y <methodname>setConfig()</methodname> (o
- pasando opciones o un objeto <methodname>Zend_Config</methodname> al constructor).
- Usando estos métodos, se pueden especificar elementos formulario, grupos de
- visualización, decoradores, y metadatos. </para>
- <para> Como regla general, si 'set' + la clave de opción (option key) hacen referencia a
- métodos <classname>Zend_Form</classname>, entonces el valor proporcionado será pasado al
- método. Si el accessor no existe, se asume que la clave referencia a un atributo, y será
- pasado a <methodname>setAttrib()</methodname>. </para>
- <para> Excepciones a las reglas incluyen lo siguiente: </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>prefixPaths</methodname> será pasado a
- <methodname>addPrefixPaths()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>elementPrefixPaths</methodname> será pasado a
- <methodname>addElementPrefixPaths()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>displayGroupPrefixPaths</methodname> será pasado a
- <methodname>addDisplayGroupPrefixPaths()</methodname>
- </para>
- </listitem>
- <listitem>
- <para>los siguientes establecedores no pueden ser determinado de ésta manera:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setAttrib (aunque setAttribs *funcionará*)</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setConfig</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setDefault</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setOptions</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setPluginLoader</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setSubForms</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setTranslator</methodname>
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setView</methodname>
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- </itemizedlist>
- <para> Como un ejemplo, aquí esta un archivo de configuración que pasa la configuración por
- cada tipo de datos configurables: </para>
- <programlisting language="ini"><![CDATA[
- [element]
- name = "registration"
- action = "/user/register"
- method = "post"
- attribs.class = "zend_form"
- attribs.onclick = "validate(this)"
- disableTranslator = 0
- prefixPath.element.prefix = "My_Element"
- prefixPath.element.path = "My/Element/"
- elementPrefixPath.validate.prefix = "My_Validate"
- elementPrefixPath.validate.path = "My/Validate/"
- displayGroupPrefixPath.prefix = "My_Group"
- displayGroupPrefixPath.path = "My/Group/"
- elements.username.type = "text"
- elements.username.options.label = "Username"
- elements.username.options.validators.alpha.validator = "Alpha"
- elements.username.options.filters.lcase = "StringToLower"
- ; more elements, of course...
- elementFilters.trim = "StringTrim"
- ;elementDecorators.trim = "StringTrim"
- displayGroups.login.elements.username = "username"
- displayGroups.login.elements.password = "password"
- displayGroupDecorators.elements.decorator = "FormElements"
- displayGroupDecorators.fieldset.decorator = "Fieldset"
- decorators.elements.decorator = "FormElements"
- decorators.fieldset.decorator = "FieldSet"
- decorators.fieldset.decorator.options.class = "zend_form"
- decorators.form.decorator = "Form"
- ]]></programlisting>
- <para> El código de arriba fácilmente puede ser abstraído a un <acronym>XML</acronym> o un
- archivo de configuración basado en arrays <acronym>PHP</acronym>. </para>
- </sect2>
- <sect2 id="zend.form.forms.custom">
- <title>Formularios personalizados</title>
- <para> Una alternativa a usar los formularios basados en configuraciones es realizar una
- subclase de <classname>Zend_Form</classname>. Esto tiene muchos beneficios: </para>
- <itemizedlist>
- <listitem>
- <para> Se puede centrar la prueba de su formulario facilmente para asegurar las
- validaciones y generar la ejecución esperada. </para>
- </listitem>
- <listitem>
- <para> Control preciso sobre los individuales elementos. </para>
- </listitem>
- <listitem>
- <para> Reutilización del objeto formulario, y mejor portabilidad (no se necesita
- seguir los archivos de configuración). </para>
- </listitem>
- <listitem>
- <para> Implementar funcionalidad personalizada. </para>
- </listitem>
- </itemizedlist>
- <para> El caso mas típico de uso sería el método <methodname>init()</methodname> para
- determinar elementos de formulario específicos y de configuración: </para>
- <programlisting language="php"><![CDATA[
- class My_Form_Login extends Zend_Form
- {
- public function init()
- {
- $username = new Zend_Form_Element_Text('username');
- $username->class = 'formtext';
- $username->setLabel('Username:')
- ->setDecorators(array(
- array('ViewHelper',
- array('helper' => 'formText')),
- array('Label',
- array('class' => 'label'))
- ));
- $password = new Zend_Form_Element_Password('password');
- $password->class = 'formtext';
- $password->setLabel('Username:')
- ->setDecorators(array(
- array('ViewHelper',
- array('helper' => 'formPassword')),
- array('Label',
- array('class' => 'label'))
- ));
- $submit = new Zend_Form_Element_Submit('login');
- $submit->class = 'formsubmit';
- $submit->setValue('Login')
- ->setDecorators(array(
- array('ViewHelper',
- array('helper' => 'formSubmit'))
- ));
- $this->addElements(array(
- $username,
- $password,
- $submit
- ));
- $this->setDecorators(array(
- 'FormElements',
- 'Fieldset',
- 'Form'
- ));
- }
- }
- ]]></programlisting>
- <para> Este formulario puede ser instanciado simplemente así: </para>
- <programlisting language="php"><![CDATA[
- $form = new My_Form_Login();
- ]]></programlisting>
- <para> y toda la funcionalidad está instalada y lista; no se necesitan archivos de
- configuración. (Note que este ejemplo esta simplificado, no contiene validadores o
- filtros para los elementos.) </para>
- <para> Otra razón común para la extension es definir un conjunto de decoradores por defecto.
- Puede hacerlo sobreescribiendo el método
- <methodname>loadDefaultDecorators()</methodname>: </para>
- <programlisting language="php"><![CDATA[
- class My_Form_Login extends Zend_Form
- {
- public function loadDefaultDecorators()
- {
- $this->setDecorators(array(
- 'FormElements',
- 'Fieldset',
- 'Form'
- ));
- }
- }
- ]]></programlisting>
- </sect2>
- </sect1>
|