Zend Framework proporciona los siguientes ayudantes de vista específicos de Dojo:
dojo(): configura el entorno Dojo de su página, incluyendo valores de configuración de dojo, rutas de módulos personalizados, sentencias require de módulos, hojas de estilo de temas, uso de CDN, y más.
Ejemplo 29.6. Uso de los ayudantes de vista de Dojo
Para usar los ayudantes de vista de Dojo, necesitará indicarle a su objeto vista
dónde encontrarlos. Puede hacer esto llamando a
addHelperPath():
$view->addHelperPath('Zend/Dojo/View/Helper/', 'Zend_Dojo_View_Helper');
Alternativamente, puede usar el método enableView()
de Zend_Dojo para que haga el trabajo por usted:
Zend_Dojo::enableView($view);
El ayudante de vista dojo() está pensado para simplificar
la configuración del entorno Dojo, incluyendo las siguientes responsabilidades:
Especificar ya sea un CDN o una ruta local a una instalación de Dojo.
Especificar rutas a módulos Dojo personalizados.
Especificar sentencias dojo.require.
Especificar temas de hoja de estilo dijit a usar.
Especificar eventos dojo.addOnLoad().
La implementación del ayudante de vista dojo() es un ejemplo
de una implementación de tipo placeholder. Los datos establecidos en ella persisten
entre objetos de vista y pueden ser mostrados directamente desde su script de layout.
Ejemplo 29.7. Ejemplo de uso del ayudante de vista dojo()
Para este ejemplo, supongamos que el desarrollador utilizará Dojo desde una ruta local, requerirá varios dijits, y utilizará el tema dijit Tundra.
En muchas páginas, el desarrollador puede no utilizar Dojo en absoluto. Así, primero nos centraremos en un script de vista donde Dojo es necesario y luego en el script de layout, donde configuraremos parte del entorno Dojo y luego lo renderizaremos.
Primero, necesitamos indicar a nuestro objeto vista que use las rutas del ayudante de vista de Dojo. Esto se puede hacer en su bootstrap o en un plugin de ejecución temprana; simplemente tome su objeto vista y ejecute lo siguiente:
$view->addHelperPath('Zend/Dojo/View/Helper/', 'Zend_Dojo_View_Helper');
A continuación, el script de vista. En este caso, vamos a especificar que utilizaremos un FilteringSelect -- que consumirá un almacén personalizado basado en QueryReadStore, al que llamaremos 'PairedStore' y almacenaremos en nuestro módulo 'custom'.
<?php // setup data store for FilteringSelect ?>
<div dojoType="custom.PairedStore" jsId="stateStore"
url="/data/autocomplete/type/state/format/ajax"
requestMethod="get"></div>
<?php // Input element: ?>
State: <input id="state" dojoType="dijit.form.FilteringSelect"
store="stateStore" pageSize="5" />
<?php // setup required dojo elements:
$this->dojo()->enable()
->setDjConfigOption('parseOnLoad', true)
->registerModulePath('custom', '../custom/')
->requireModule('dijit.form.FilteringSelect')
->requireModule('custom.PairedStore'); ?>
En nuestro script de layout, comprobaremos entonces si Dojo está habilitado, y, si lo está, haremos alguna configuración más general y lo ensamblaremos:
<?php echo $this->doctype() ?>
<html>
<head>
<?php echo $this->headTitle() ?>
<?php echo $this->headMeta() ?>
<?php echo $this->headLink() ?>
<?php echo $this->headStyle() ?>
<?php if ($this->dojo()->isEnabled()){
$this->dojo()->setLocalPath('/js/dojo/dojo.js')
->addStyleSheetModule('dijit.themes.tundra');
echo $this->dojo();
}
?>
<?php echo $this->headScript() ?>
</head>
<body class="tundra">
<?php echo $this->layout()->content ?>
<?php echo $this->inlineScript() ?>
</body>
</html>
En este punto, solo necesita asegurarse de que sus archivos estén en las ubicaciones correctas y que haya creado la acción del punto final para su FilteringSelect.
![]() |
Se usa codificación UTF-8 por defecto |
|---|---|
|
Por defecto, Zend Framework utiliza UTF-8 como su codificación
predeterminada, y, específicamente en este caso,
Si no desea utilizar UTF-8 en tal situación, necesitará
implementar un método |
Dojo permite tanto el uso declarativo como el programático de muchas de sus características. El uso declarativo utiliza elementos HTML estándar con atributos no estándar que se procesan cuando la página es cargada. Aunque esta es una sintaxis potente y sencilla de utilizar, para muchos desarrolladores esto puede causar problemas con la validación de páginas.
El uso programático permite al desarrollador decorar elementos existentes obteniéndolos por ID o selectores CSS y pasándolos a los constructores de objeto apropiados en Dojo. Dado que no se utilizan atributos HTML no estándar, las páginas siguen siendo válidas.
En la práctica, ambos casos de uso permiten una degradación elegante cuando
javascript está deshabilitado o los diversos recursos de script de Dojo son
inalcanzables. Para promover los estándares y la validación de documentos,
Zend Framework usa el uso programático por defecto; los diversos ayudantes de vista
generarán javascript y lo enviarán al ayudante de vista
dojo() para su inclusión al renderizar.
Los desarrolladores que usen esta técnica también pueden querer explorar la opción de escribir su propia decoración programática de la página. Un beneficio sería la capacidad de especificar manejadores para eventos de dijit.
Para permitir esto, así como la capacidad de usar sintaxis declarativa, hay una serie de métodos estáticos disponibles para establecer este comportamiento de forma global.
Ejemplo 29.8. Especificando uso declarativo y programático de Dojo
Para especificar el uso declarativo, simplemente llame al método estático
setUseDeclarative():
Zend_Dojo_View_Helper_Dojo::setUseDeclarative();
Si en cambio decide usar el uso programático, llame al método estático
setUseProgrammatic():
Zend_Dojo_View_Helper_Dojo::setUseProgrammatic();
Finalmente, si desea crear sus propias reglas programáticas, debería especificar el uso programático, pero pasando el valor '-1'; en esta situación, no se creará ningún javascript para decorar ningún dijit utilizado.
Zend_Dojo_View_Helper_Dojo::setUseProgrammatic(-1);
Dojo permite la creación de temas para sus dijits (widgets). Puede seleccionar uno pasando una ruta de módulo:
$view->dojo()->addStylesheetModule('dijit.themes.tundra');
La ruta del módulo se descubre usando el carácter '.' como
separador de directorio y usando el último valor de la lista como el nombre
del archivo CSS en ese directorio de tema a usar; en el ejemplo
anterior, Dojo buscará el tema en
'dijit/themes/tundra/tundra.css'.
Al usar un tema, es importante recordar pasar la clase del tema a, al menos, un contenedor que rodee cualquier dijit que esté utilizando; el caso de uso más común es pasarla en el body:
<body class="tundra">
Por defecto, cuando usa una sentencia dojo.require, dojo hará una petición de vuelta al servidor para obtener el archivo javascript apropiado. Si tiene muchos dijits en su lugar, esto resulta en muchas peticiones al servidor -- lo cual no es óptimo.
La respuesta de Dojo a esto es proporcionar la capacidad de crear builds personalizados. Los builds hacen varias cosas:
Agrupan los archivos requeridos en capas; una capa junta todos los archivos requeridos en un único archivo JS. (De ahí el nombre de esta sección.)
"Internaliza" archivos no javascript usados por dijits (típicamente, archivos de plantilla). Estos también se agrupan en el mismo archivo JS que la capa.
Pasa el archivo a través de ShrinkSafe, que elimina espacios en blanco y comentarios, así como acorta los nombres de variables.
Algunos archivos no pueden agruparse en capas, pero el proceso de build creará un directorio de release especial con el archivo de capa y todos los demás archivos. Esto le permite tener una distribución reducida personalizada para las necesidades de su sitio o aplicación.
Para usar una capa, el ayudante de vista dojo() tiene un
método addLayer() para agregar rutas a las capas requeridas:
$view->dojo()->addLayer('/js/foo/foo.js');
Para más información sobre la creación de builds personalizados, por favor consulte la documentación de build de Dojo.
El ayudante de vista dojo() siempre devuelve una instancia de
el contenedor placeholder de dojo. Ese objeto contenedor tiene los
siguientes métodos disponibles:
setView(Zend_View_Interface $view): establece una instancia de vista en el contenedor.enable(): habilita explícitamente la integración con Dojo.disable(): deshabilita la integración con Dojo.isEnabled(): determina si la integración con Dojo está habilitada o no.requireModule($module): configura una sentencia dojo.require.getModules(): determina qué módulos han sido requeridos.registerModulePath($module, $path): registra una ruta de módulo Dojo personalizada.getModulePaths(): obtiene la lista de rutas de módulos registradas.addLayer($path): agrega una ruta de capa (build personalizado) a usar.getLayers(): obtiene una lista de todas las rutas de capa registradas (builds personalizados).removeLayer($path): elimina la capa que coincide con$pathde la lista de capas registradas (builds personalizados).setCdnBase($url): establece la URL base para un CDN; típicamente, una deZend_Dojo::CDN_BASE_AOLoZend_Dojo::CDN_BASE_GOOGLE, pero solo necesita ser la cadena URL anterior al número de versión.getCdnBase(): recupera la CDN url base a utilizar.setCdnVersion($version = null): establece qué versión de Dojo utilizar desde el CDN.getCdnVersion(): recupera qué versión de Dojo desde el CDN se utilizará.setCdnDojoPath($path): establece la ruta relativa al archivodojo.jsodojo.xd.jsen un CDN; típicamente, una deZend_Dojo::CDN_DOJO_PATH_AOLoZend_Dojo::CDN_DOJO_PATH_GOOGLE, pero solo necesita ser la cadena de ruta que sigue al número de versión.getCdnDojoPath(): recupera el último segmento de ruta de la url del CDN que apunta al archivodojo.js.useCdn(): indica al contenedor que utilice el CDN; habilita implícitamente la integración.setLocalPath($path): indica al contenedor la ruta a una instalación local de Dojo (debería ser una ruta relativa al servidor, y contener el propio archivodojo.js); habilita implícitamente la integración.getLocalPath(): determina qué ruta local de Dojo se está utilizando.useLocalPath(): ¿está la integración utilizando una ruta local de Dojo?setDjConfig(array $config): establece valores de configuración de dojo o dijit (espera un array asociativo).setDjConfigOption($option, $value): establece un único valor de configuración de dojo o dijit.getDjConfig(): obtiene todos los valores de configuración de dojo o dijit.getDjConfigOption($option, $default = null): obtiene un único valor de configuración de dojo o dijit.addStylesheetModule($module): agrega una hoja de estilo basada en un tema de módulo.getStylesheetModules(): obtiene las hojas de estilo registradas como temas de módulo.addStylesheet($path): agrega una hoja de estilo local para usar con Dojo.getStylesheets(): obtiene las hojas de estilo locales de Dojo.addOnLoad($spec, $function = null): agrega una lambda para que dojo.onLoad la llame. Si se pasa un argumento, se asume que es o bien el nombre de una función o un closure de javascript. Si se pasan dos argumentos, se asume que el primero es el nombre de una variable de instancia de objeto y el segundo o bien un nombre de método en ese objeto o un closure a utilizar con ese objeto.prependOnLoad($spec, $function = null): exactamente igual queaddOnLoad(), excepto que antepone al inicio de la pila de onLoad.getOnLoadActions(): recupera todas las acciones dojo.onLoad registradas con el contenedor. Esto será un array de arrays.onLoadCaptureStart($obj = null): captura datos para usar como una lambda para dojo.onLoad(). Si se proporciona$obj, el código JS capturado se considerará un closure para usar con ese objeto Javascript.onLoadCaptureEnd($obj = null): finaliza la captura de datos para usar con dojo.onLoad().javascriptCaptureStart(): captura javascript arbitrario para incluir con el JS de Dojo (sentencias onLoad, require, etc.).javascriptCaptureEnd(): finaliza la captura de javascript.__toString(): convierte el contenedor a una cadena; renderiza todos los elementos HTML de estilo y script.
Del manual de Dojo: "Dijit es un sistema de widgets construido sobre dojo." Dijit incluye una variedad de widgets de layout y de formulario diseñados para proporcionar características de accesibilidad, localización, y una apariencia estandarizada (y personalizable con temas).
Zend Framework distribuye una variedad de ayudantes de vista que le permiten renderizar y utilizar dijits dentro de sus scripts de vista. Hay tres tipos básicos:
-
Contenedores de layout: estos están diseñados para ser usados dentro de sus scripts de vista o consumidos por decoradores de formulario para formularios, subformularios, y grupos de visualización. Envuelven las diversas clases ofrecidas en dijit.layout. Cada ayudante de vista de layout dijit espera los siguientes argumentos:
$id: el nombre del contenedor o ID de DOM.$content: el contenido a envolver en el contenedor de layout.$params(opcional): parámetros específicos de dijit. Básicamente, cualquier atributo no HTML que pueda usarse para configurar el contenedor de layout dijit.$attribs(opcional): cualquier atributo HTML adicional que deba usarse para renderizar el div contenedor. Si se pasa la clave 'id' en este array, se usará como el id de DOM del elemento de formulario, y$idse usará como su nombre.
Si no pasa ningún argumento a un ayudante de vista de layout dijit, el ayudante mismo será devuelto. Esto le permite capturar contenido, lo cual es a menudo una forma más fácil de pasar contenido al contenedor de layout. Ejemplos de esta funcionalidad se mostrarán más adelante en esta sección.
-
Dijit de formulario: el dijit dijit.form.Form, aunque no es completamente necesario para su uso con elementos de formulario dijit, garantizará que si se intenta enviar un formulario que no valida contra las validaciones del lado del cliente, el envío se detenga y se generen mensajes de error de validación. El ayudante de vista del dijit de formulario espera los siguientes argumentos:
$id: el nombre del contenedor o ID de DOM.$attribs(opcional): cualquier atributo HTML adicional que deba usarse para renderizar el div contenedor.$content(opcional): el contenido a envolver en el formulario. Si no se pasa ninguno, se usará una cadena vacía.
El orden de los argumentos varía respecto a los demás dijits para mantener la compatibilidad con el ayudante de vista estándar
form(). -
Elementos de formulario: estos están diseñados para ser consumidos con
Zend_Form, pero pueden usarse de forma independiente dentro de scripts de vista también. Cada ayudante de vista de elemento dijit espera los siguientes argumentos:$id: el nombre del elemento o ID de DOM.$value(opcional): el valor actual del elemento.$params(opcional): parámetros específicos de dijit. Básicamente, cualquier atributo no HTML que pueda usarse para configurar un dijit.$attribs(opcional): cualquier atributo HTML adicional que deba usarse para renderizar el dijit. Si se pasa la clave 'id' en este array, se usará para el id de DOM del elemento de formulario, y$idse usará como su nombre.
Algunos elementos requieren más argumentos; estos se indicarán con las descripciones de los ayudantes de elemento individuales.
Para utilizar estos ayudantes de vista, necesita registrar la ruta a los ayudantes de vista de dojo con su objeto vista.
Ejemplo 29.9. Registro de la ruta de prefijo del ayudante de vista de Dojo
$view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper');
La familia de elementos dijit.layout es para crear layouts personalizados y predecibles para su sitio. Para cualquier pregunta sobre uso general, lea más sobre ellos en el manual de Dojo.
Todos los elementos de layout dijit tienen la firma string ($id = null, $content = '',
array $params = array(), array $attribs = array()).
En todos los casos, si no pasa argumentos, se devolverá el propio objeto ayudante. Esto
le da acceso a los métodos captureStart() y
captureEnd(), que le permiten capturar
contenido en lugar de pasarlo al contenedor de layout.
-
AccordionContainer: dijit.layout.AccordionContainer. Apila todos los paneles juntos verticalmente; hacer clic en el título de un panel expandirá y mostrará ese panel en particular.
<?php echo $view->accordionContainer( 'foo', $content, array( 'duration' => 200, ), array( 'style' => 'width: 200px; height: 300px;', ), ); ?> -
AccordionPane: dijit.layout.AccordionPane. Para usar dentro de AccordionContainer.
<?php echo $view->accordionPane( 'foo', $content, array( 'title' => 'Pane Title', ), array( 'style' => 'background-color: lightgray;', ), ); ?> -
BorderContainer: dijit.layout.BorderContainer. Logre layouts con paneles opcionalmente redimensionables como los que podría ver en una aplicación tradicional.
<?php echo $view->borderContainer( 'foo', $content, array( 'design' => 'headline', ), array( 'style' => 'width: 100%; height: 100%', ), ); ?> -
ContentPane: dijit.layout.ContentPane. Úselo dentro de cualquier contenedor excepto AccordionContainer.
<?php echo $view->contentPane( 'foo', $content, array( 'title' => 'Pane Title', 'region' => 'left', ), array( 'style' => 'width: 120px; background-color: lightgray;', ), ); ?> -
SplitContainer: dijit.layout.SplitContainer. Permite paneles de contenido redimensionables; obsoleto en Dojo a favor de BorderContainer.
<?php echo $view->splitContainer( 'foo', $content, array( 'orientation' => 'horizontal', 'sizerWidth' => 7, 'activeSizing' => true, ), array( 'style' => 'width: 400px; height: 500px;', ), ); ?> -
StackContainer: dijit.layout.StackContainer. Todos los paneles dentro de un StackContainer se colocan en una pila; construya botones o funcionalidad para mostrar uno a la vez.
<?php echo $view->stackContainer( 'foo', $content, array(), array( 'style' => 'width: 400px; height: 500px; border: 1px;', ), ); ?> -
TabContainer: dijit.layout.TabContainer. Todos los paneles dentro de un TabContainer se colocan en una pila, con pestañas posicionadas en un lado para cambiar entre ellos.
<?php echo $view->tabContainer( 'foo', $content, array(), array( 'style' => 'width: 400px; height: 500px; border: 1px;', ), ); ?>
Los siguientes métodos de captura están disponibles para todos los contenedores de layout:
-
captureStart($id, array $params = array(), array $attribs = array());: comienza a capturar contenido para incluir en un contenedor.
$paramsse refiere a los parámetros dijit a usar con el contenedor, mientras que$attribsse refiere a cualquier atributo HTML general a usar.Los contenedores pueden anidarse al capturar, siempre que no se dupliquen ids.
captureEnd($id): finaliza la captura de contenido para incluir en un contenedor.$iddebería referirse a un id usado previamente con una llamada acaptureStart(). Devuelve una cadena que representa el contenedor y su contenido, tal como si simplemente hubiera pasado contenido al ayudante mismo.
Ejemplo 29.10. Ejemplo del dijit de layout BorderContainer
Los BorderContainers, particularmente cuando se combinan con la capacidad de capturar contenido, son especialmente útiles para lograr efectos de layout complejos.
$view->borderContainer()->captureStart('masterLayout',
array('design' => 'headline'));
echo $view->contentPane(
'menuPane',
'This is the menu pane',
array('region' => 'top'),
array('style' => 'background-color: darkblue;')
);
echo $view->contentPane(
'navPane',
'This is the navigation pane',
array('region' => 'left'),
array('style' => 'width: 200px; background-color: lightblue;')
);
echo $view->contentPane(
'mainPane',
'This is the main content pane area',
array('region' => 'center'),
array('style' => 'background-color: white;')
);
echo $view->contentPane(
'statusPane',
'Status area',
array('region' => 'bottom'),
array('style' => 'background-color: lightgray;')
);
echo $view->borderContainer()->captureEnd('masterLayout');
Los dijits de validación de formulario y de entrada de Dojo están en el árbol dijit.form. Para más información sobre el uso general de estos elementos, así como los parámetros aceptados, por favor visite la documentación de dijit.form.
Los siguientes elementos de formulario dijit están disponibles en Zend Framework. Excepto donde se indique, todos tienen la firma string ($id, $value = '', array $params = array(), array $attribs = array()).
-
Button: dijit.form.Button. Muestra un botón de formulario.
<?php echo $view->button( 'foo', 'Show Me!', array('iconClass' => 'myButtons'), ); ?> -
CheckBox: dijit.form.CheckBox. Muestra una casilla de verificación. Acepta un quinto argumento opcional, el array
$checkedOptions, que puede contener ya sea:un array indexado con dos valores, un valor marcado y un valor desmarcado, en ese orden; o
un array asociativo con las claves 'checkedValue' y 'unCheckedValue'.
Si no se proporciona
$checkedOptions, se asumen 1 y 0.<?php echo $view->checkBox( 'foo', 'bar', array(), array(), array('checkedValue' => 'foo', 'unCheckedValue' => 'bar') ); ?> -
ComboBox: dijit.layout.ComboBox. Los ComboBox son un híbrido entre un select y un cuadro de texto con autocompletado. La diferencia clave es que puede escribir una opción que no esté en la lista de opciones disponibles, y aun así se considerará una entrada válida. Acepta un quinto argumento opcional, un array asociativo
$options; si se proporciona, ComboBox se renderizará como un select. Note también que los valores de etiqueta del array$optionsse devolverán en el formulario -- no los valores mismos.Alternativamente, puede pasar información sobre un almacén de datos dojo.data para usar con el elemento. Si se proporciona, el ComboBox se renderizará como un input de texto, y obtendrá sus opciones a través de ese almacén de datos.
Para especificar un almacén de datos, proporcione una de las siguientes combinaciones de claves de
$params:-
La clave 'store', con un valor de array; el array debe contener las claves:
store: el nombre de la variable javascript que representa el almacén de datos (podría ser el nombre que le gustaría que usara).
type: el tipo de almacén de datos a usar; por ejemplo, 'dojo.data.ItemFileReadStore'.
params (opcional): un array asociativo de pares clave y valor para usar en la configuración del almacén de datos. El parámetro 'url' es un ejemplo típico.
-
Las claves:
store: una cadena que indica el nombre del almacén de datos a usar.
storeType: una cadena que indica el tipo dojo.data del almacén de datos a usar (por ejemplo, 'dojo.data.ItemFileReadStore').
storeParams: un array asociativo de pares clave y valor con los que configurar el almacén de datos.
// As a select element: echo $view->comboBox( 'foo', 'bar', array( 'autocomplete' => false, ), array(), array( 'foo' => 'Foo', 'bar' => 'Bar', 'baz' => 'Baz', ) ); // As a dojo.data-enabled element: echo $view->comboBox( 'foo', 'bar', array( 'autocomplete' => false, 'store' => 'stateStore', 'storeType' => 'dojo.data.ItemFileReadStore', 'storeParams' => array('url' => '/js/states.json'), ), ); -
-
CurrencyTextBox: dijit.form.CurrencyTextBox. Hereda de ValidationTextBox, y proporciona validación del lado del cliente de moneda. Espera que se proporcione el parámetro dijit 'currency' con un código de moneda apropiado de 3 caracteres. También puede especificar cualquier parámetro dijit válido para ValidationTextBox y TextBox.
echo $view->currencyTextBox( 'foo', '$25.00', array('currency' => 'USD'), array('maxlength' => 20) );![[Note]](images/note.png)
Problemas con los builds Actualmente hay problemas conocidos con el uso de CurrencyTextBox con capas de build. Una solución alternativa conocida es asegurarse de que la meta etiqueta http-equiv Content-Type de su documento establezca el conjunto de caracteres a utf-8, lo que puede hacer llamando a:
$view->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=utf-8');Esto significará, por supuesto, que necesitará asegurarse de que el placeholder
headMeta()se muestre en su script de layout. -
DateTextBox: dijit.form.DateTextBox. Hereda de ValidationTextBox, y proporciona tanto validación del lado del cliente de fechas, como un calendario desplegable desde el cual seleccionar una fecha. Puede especificar cualquier parámetro dijit disponible para ValidationTextBox o TextBox.
echo $view->dateTextBox( 'foo', '2008-07-11', array('required' => true) ); -
Editor: dijit.Editor. Proporciona un editor WYSIWYG mediante el cual los usuarios pueden crear o editar contenido. dijit.Editor es un editor conectable y extensible con una variedad de parámetros que puede utilizar para personalización; vea la documentación de dijit.Editor para más detalles.
echo $view->editor('foo');![[Note]](images/note.png)
El dijit Editor usa div por defecto El dijit Editor usa un DIV HTML por defecto. La documentación de dijit._editor.RichText indica que construirlo sobre un TEXTAREA HTML puede potencialmente tener implicaciones de seguridad.
Para permitir una degradación elegante en entornos donde Javascript no está disponible,
Zend_Dojo_View_Helper_Editortambién envuelve un TEXTAREA dentro de una etiqueta NOSCRIPT; el contenido de este TEXTAREA será escapado correctamente para evitar vectores de vulnerabilidad de seguridad. -
FilteringSelect: dijit.form.FilteringSelect. Similar a ComboBox, este es un híbrido de select y texto que puede renderizar ya sea una lista proporcionada de opciones o las obtenidas a través de un almacén de datos dojo.data. A diferencia de ComboBox, sin embargo, FilteringSelect no permite escribir una opción que no esté en su lista. Además, opera como un select estándar en el sentido de que se devuelven los valores de las opciones, no las etiquetas, cuando se envía el formulario.
Por favor vea la información anterior sobre ComboBox para ejemplos y opciones disponibles para definir almacenes de datos.
-
HorizontalSlider y VerticalSlider: dijit.form.HorizontalSlider y dijit.form.VerticalSlider. Los sliders son widgets de interfaz para seleccionar números en un rango dado; estas son las variantes horizontal y vertical.
En su forma más básica, requieren los parámetros dijit 'minimum', 'maximum', y 'discreteValues'. Estos definen el rango de valores. Otras opciones comunes son:
'intermediateChanges' se puede establecer para indicar si se deben disparar eventos onChange mientras se arrastra el control.
'clickSelect' se puede establecer para permitir hacer clic en una ubicación del slider para establecer el valor.
'pageIncrement' puede especificar el valor por el cual aumentar o disminuir cuando se usan pageUp y pageDown.
'showButtons' se puede establecer para permitir mostrar botones en cada extremo del slider para manipular el valor.
La implementación de Zend Framework crea un elemento oculto para almacenar el valor del slider.
Opcionalmente puede querer mostrar una regla o etiquetas para el slider. Para hacerlo, asignará uno o más de los parámetros dijit 'topDecoration' y/o 'bottomDecoration' (HorizontalSlider) o 'leftDecoration' y/o 'rightDecoration' (VerticalSlider). Cada uno de estos espera las siguientes opciones:
container: nombre del contenedor.
labels (opcional): un array de etiquetas a utilizar. Use cadenas vacías en cualquier extremo para proporcionar etiquetas solo para valores internos. Requerido al especificar una de las variantes dijit 'Labels'.
dijit (opcional): uno de HorizontalRule, HorizontalRuleLabels, VerticalRule, o VerticalRuleLabels. Por defecto uno de los dijits Rule.
-
params (opcional): parámetros dijit para configurar el dijit Rule en uso. Los parámetros específicos de estos dijits incluyen:
container (opcional): array de parámetros y atributos para el contenedor de la regla.
labels (opcional): array de parámetros y atributos para el contenedor de la lista de etiquetas.
attribs (opcional): atributos HTML a usar con las reglas y etiquetas. Esto debería seguir el formato de la opción params y ser un array asociativo con las claves 'container' y 'labels'.
echo $view->horizontalSlider( 'foo', 1, array( 'minimum' => -10, 'maximum' => 10, 'discreteValues' => 11, 'intermediateChanges' => true, 'showButtons' => true, 'topDecoration' => array( 'container' => 'topContainer' 'dijit' => 'HorizontalRuleLabels', 'labels' => array( ' ', '20%', '40%', '60%', '80%', ' ', ), 'params' => array( 'container' => array( 'style' => 'height:1.2em; font-size=75%;color:gray;', ), 'labels' => array( 'style' => 'height:1em; font-size=75%;color:gray;', ), ), ), 'bottomDecoration' => array( 'container' => 'bottomContainer' 'labels' => array( '0%', '50%', '100%', ), 'params' => array( 'container' => array( 'style' => 'height:1.2em; font-size=75%;color:gray;', ), 'labels' => array( 'style' => 'height:1em; font-size=75%;color:gray;', ), ), ), ) ); -
NumberSpinner: dijit.form.NumberSpinner. Cuadro de texto para entrada numérica, con botones para incrementar y decrementar.
Espera ya sea un array asociativo para el parámetro dijit 'constraints', o simplemente las claves 'min', 'max', y 'places' (estas serían las entradas esperadas del parámetro constraints también). 'places' se puede usar para indicar cuánto incrementará y decrementará el number spinner.
echo $view->numberSpinner( 'foo', 5, array( 'min' => -10, 'max' => 10, 'places' => 2, ), array( 'maxlenth' => 3, ) ); -
NumberTextBox: dijit.form.NumberTextBox. NumberTextBox proporciona la capacidad de formatear y mostrar entradas numéricas de forma localizada, así como validar entradas numéricas, opcionalmente contra restricciones dadas.
echo $view->numberTextBox( 'foo', 5, array( 'places' => 4, 'type' => 'percent', ), array( 'maxlength' => 20, ) ); -
PasswordTextBox: dijit.form.ValidationTextBox vinculado a una entrada de contraseña. PasswordTextBox proporciona la capacidad de crear una entrada de contraseña que se adhiere al tema dijit actual, así como permitir validación del lado del cliente.
echo $view->passwordTextBox( 'foo', '', array( 'required' => true, ), array( 'maxlength' => 20, ) ); -
RadioButton: dijit.form.RadioButton. Un conjunto de opciones del cual solo una puede seleccionarse. Esto se comporta en todo como un radio normal, pero tiene una apariencia consistente con otros dijits.
RadioButton acepta un quinto argumento opcional,
$options, un array asociativo de pares de valor y etiqueta usados como opciones del radio. También puede pasar estos como la clave options de$attribs.echo $view->radioButton( 'foo', 'bar', array(), array(), array( 'foo' => 'Foo', 'bar' => 'Bar', 'baz' => 'Baz', ) ); -
SimpleTextarea: dijit.form.SimpleTextarea. Estos actúan como textareas normales, pero se estilizan usando el tema dijit actual. No necesita especificar ni los atributos rows ni columns; use ems o porcentajes para el ancho y alto, en su lugar.
echo $view->simpleTextarea( 'foo', 'Start writing here...', array(), array('style' => 'width: 90%; height: 5ems;') ); SubmitButton: un dijit.form.Button vinculado a un elemento de entrada submit. Vea el ayudante de vista Button para más detalles; la diferencia clave es que este botón puede enviar un formulario.
-
Textarea: dijit.form.Textarea. Estos actúan como textareas normales, excepto que en lugar de tener un número fijo de filas, se expanden a medida que el usuario escribe. El ancho debe especificarse mediante un ajuste de estilo.
echo $view->textarea( 'foo', 'Start writing here...', array(), array('style' => 'width: 300px;') ); -
TextBox: dijit.form.TextBox. Este elemento está presente principalmente para proporcionar una apariencia común entre varios elementos dijit, y para proporcionar funcionalidad base para las demás clases derivadas de TextBox (ValidationTextBox, NumberTextBox, CurrencyTextBox, DateTextBox, y TimeTextBox).
Las banderas de parámetro dijit comunes incluyen 'lowercase' (convertir a minúsculas), 'uppercase' (convertir a MAYÚSCULAS), 'propercase' (convertir a Case Apropiado), y trim (recortar espacios en blanco iniciales y finales); todos aceptan valores booleanos. Además, puede especificar los parámetros 'size' y 'maxLength'.
echo $view->textBox( 'foo', 'some text', array( 'trim' => true, 'propercase' => true, 'maxLength' => 20, ), array( 'size' => 20, ) ); -
TimeTextBox: dijit.form.TimeTextBox. También en la familia TextBox, TimeTextBox proporciona una selección desplegable desplazable de horas de la que un usuario puede seleccionar. Los parámetros dijit le permiten especificar los incrementos de tiempo disponibles en el select así como el rango visible de horas disponibles.
echo $view->timeTextBox( 'foo', '', array( 'am.pm' => true, 'visibleIncrement' => 'T00:05:00', // 5-minute increments 'visibleRange' => 'T02:00:00', // show 2 hours of increments ), array( 'size' => 20, ) ); -
ValidationTextBox: dijit.form.ValidateTextBox. Proporciona validaciones del lado del cliente para un elemento de texto. Hereda de TextBox.
Los parámetros dijit comunes incluyen:
invalidMessage: un mensaje a mostrar cuando se detecta una entrada inválida.
promptMessage: un mensaje de ayuda emergente a usar.
regExp: una expresión regular a usar para validar el texto. La expresión regular no requiere marcadores de límite.
required: si el elemento es requerido o no. Si lo es, y el elemento está embebido en un dijit.form.Form, se marcará como inválido e impedirá el envío.
echo $view->validationTextBox( 'foo', '', array( 'required' => true, 'regExp' => '[\w]+', 'invalidMessage' => 'No spaces or non-word characters allowed', 'promptMessage' => 'Single word consisting of alphanumeric ' . 'characters and underscores only', ), array( 'maxlength' => 20, ) );
Si profundiza en Dojo con cierta frecuencia, se encontrará escribiendo
dijits personalizados, o usando dijits experimentales de Dojox. Aunque Zend
Framework no puede dar soporte a cada dijit directamente, sí proporciona algún
soporte rudimentario para tipos de dijit arbitrarios mediante el
ayudante de vista CustomDijit.
La API del ayudante de vista CustomDijit es exactamente
la de cualquier otro dijit, con una diferencia importante: el tercer argumento
"params" debe contener el atributo "dojotype".
El valor de este atributo debe ser la clase Dijit que planea
usar.
CustomDijit extiende el ayudante de vista base
DijitContainer, lo que también le permite
capturar contenido (usando el par de métodos
captureStart()/captureEnd()). captureStart()
también espera que pase el atributo "dojoType" a su argumento
"params".
Ejemplo 29.11. Uso de CustomDijit para renderizar un dojox.layout.ContentPane
dojox.layout.ContentPane es una iteración de
nueva generación de dijit.layout.ContentPane, y proporciona
un superconjunto de las capacidades de esa clase. Hasta que su
funcionalidad se estabilice, continuará viviendo en Dojox.
Sin embargo, si desea usarlo hoy en Zend Framework, puede hacerlo,
usando el ayudante de vista CustomDijit.
En su forma más básica, puede hacer lo siguiente:
<?php echo $this->customDijit(
'foo',
$content,
array(
'dojoType' => 'dojox.layout.ContentPane',
'title' => 'Custom pane',
'region' => 'center'
)
); ?>
Si en cambio quisiera capturar contenido, simplemente use el
método captureStart(), y pase el "dojoType" al
argumento "params":
<?php $this->customDijit()->captureStart(
'foo',
array(
'dojoType' => 'dojox.layout.ContentPane',
'title' => 'Custom pane',
'region' => 'center'
)
); ?>
This is the content of the pane
<?php echo $this->customDijit()->captureEnd('foo'); ?>
También puede extender CustomDijit fácilmente para crear
soporte para sus propios dijits personalizados. Como ejemplo, si
extendiera dijit.layout.ContentPane para crear su
propia clase foo.ContentPane, podría crear el
siguiente ayudante para darle soporte:
class My_View_Helper_FooContentPane
extends Zend_Dojo_View_Helper_CustomDijit
{
protected $_defaultDojoType = 'foo.ContentPane';
public function fooContentPane(
$id = null, $value = null,
array $params = array(), array $attribs = array()
) {
return $this->customDijit($id, $value, $params, $attribs);
}
}
Mientras su dijit personalizado siga la misma API básica que
los dijits oficiales, usar o extender CustomDijit
debería funcionar correctamente.