Dojo proporciona abstracciones de datos para widgets habilitados para datos mediante su componente dojo.data. Este componente ofrece la capacidad de adjuntar un almacén de datos, proporcionar algunos metadatos relativos al campo de identidad y, opcionalmente, un campo de etiqueta, y una API para consultar, ordenar y recuperar registros y conjuntos de registros del almacén de datos.
dojo.data se usa a menudo con XmlHttpRequest para obtener datos dinámicos del servidor. El mecanismo principal para esto es extender el QueryReadStore para apuntar a una URL y especificar la información de consulta. El lado del servidor entonces devuelve datos en el siguiente formato JSON:
{
identifier: '<name>',
<label: '<label>',>
items: [
{ name: '...', label: '...', someKey: '...' },
...
]
}
Zend_Dojo_Data proporciona una interfaz sencilla para construir
dichas estructuras de forma programática, interactuar con ellas y serializarlas
a un array o a JSON.
En su forma más simple, dojo.data requiere que se proporcione el nombre del campo identificador en cada elemento, y un conjunto de elementos (datos). Puede pasarlos mediante el constructor, o mediante mutadores:
Ejemplo 29.1. Inicialización de Zend_Dojo_Data mediante el constructor
$data = new Zend_Dojo_Data('id', $items);
Ejemplo 29.2. Inicialización de Zend_Dojo_Data mediante mutadores
$data = new Zend_Dojo_Data();
$data->setIdentifier('id')
->addItems($items);
También puede añadir un elemento a la vez, o agregar elementos, usando
addItem() y addItems().
Ejemplo 29.3. Añadir datos a Zend_Dojo_Data
$data = new Zend_Dojo_Data($identifier, $items); $data->addItem($someItem); $data->addItems($someMoreItems);
![]() |
¡Use siempre un identificador! |
|---|---|
Todo almacén de datos dojo.data requiere que la columna
identificadora se proporcione como metadato, incluyendo |
Cada elemento individual puede ser uno de los siguientes:
Arrays asociativos
Objetos que implementan un método
toArray()Cualquier otro objeto (se serializará mediante
get_object_vars())
Puede adjuntar colecciones de los elementos anteriores mediante
addItems() o setItems() (sobrescribe
todos los elementos establecidos previamente); al hacerlo, puede pasar un único argumento:
Arrays
Objetos que implementan la interfaz
Traversable, lo que incluye las interfacesIteratoryArrayAccess.
Si desea especificar un campo que actúe como etiqueta para el
elemento, llame a setLabel():
Finalmente, también puede cargar un elemento Zend_Dojo_Data desde un
array JSON de dojo.data, usando el
método fromJson().
Algunos componentes de Dojo requieren metadatos adicionales junto con la carga útil de dojo.data. Como ejemplo, dojox.grid.Grid puede obtener datos dinámicamente de un dojox.data.QueryReadStore. Para que la paginación funcione correctamente, cada carga útil de retorno debe contener una clave numRows con el número total de filas que podría devolver la consulta. Con estos datos, la cuadrícula sabe cuándo continuar haciendo pequeñas peticiones al servidor para subconjuntos de datos y cuándo dejar de hacer más peticiones (es decir, ha llegado a la última página de datos). Esta técnica es útil para servir grandes conjuntos de datos en sus cuadrículas sin cargar el conjunto completo de una sola vez.
Zend_Dojo_Data permite asignar propiedades de metadatos
al objeto. A continuación se ilustra su uso:
// Set the "numRows" to 100
$data->setMetadata('numRows', 100);
// Set several items at once:
$data->setMetadata(array(
'numRows' => 100,
'sort' => 'name',
));
// Inspect a single metadata value:
$numRows = $data->getMetadata('numRows');
// Inspect all metadata:
$metadata = $data->getMetadata();
// Remove a metadata item:
$data->clearMetadata('numRows');
// Remove all metadata:
$data->clearMetadata();
Además de actuar como un contenedor de datos serializable,
Zend_Dojo_Data también proporciona la capacidad de manipular
y recorrer los datos de diversas formas.
Zend_Dojo_Data implementa las interfaces
ArrayAccess, Iterator y
Countable. Por lo tanto, puede usar la colección de
datos casi como si fuera un array.
Todos los elementos se referencian mediante el campo identificador. Dado que los
identificadores deben ser únicos, puede usar los valores de este campo para obtener
registros individuales. Hay dos formas de hacerlo: con el
método getItem(), o mediante notación de array.
// Using getItem():
$item = $data->getItem('foo');
// Or use array notation:
$item = $data['foo'];
Si conoce el identificador, puede usarlo para recuperar un elemento, actualizarlo, eliminarlo, crearlo o comprobar su existencia:
// Update or create an item:
$data['foo'] = array('title' => 'Foo', 'email' => 'foo@foo.com');
// Delete an item:
unset($data['foo']);
// Test for an item:
if (isset($data[foo])) {
}
También puede recorrer todos los elementos en un bucle. Internamente, todos los elementos se almacenan como arrays.
foreach ($data as $item) {
echo $item['title'] . ': ' . $item['description'] . "\n";
}
O incluso contar cuántos elementos tiene:
echo count($data), " items found!";
Finalmente, como la clase implementa __toString(), también puede
convertirla a JSON simplemente mostrándola o convirtiéndola a cadena:
echo $data; // echo as JSON string $json = (string) $data; // cast to string == cast to JSON
Además de los métodos necesarios para implementar las interfaces mencionadas anteriormente, están disponibles los siguientes métodos.
setItems($items): establece varios elementos a la vez, sobrescribiendo cualquier elemento establecido previamente en el objeto.$itemsdebe ser un array o un objetoTraversable.setItem($item, $id = null): establece un elemento individual, pasando opcionalmente un identificador explícito. Sobrescribe el elemento si ya está en la colección. Los elementos válidos incluyen arrays asociativos, objetos que implementantoArray(), o cualquier objeto con propiedades públicas.addItem($item, $id = null): añade un elemento individual, pasando opcionalmente un identificador explícito. Lanzará una excepción si el elemento ya existe en la colección. Los elementos válidos incluyen arrays asociativos, objetos que implementantoArray(), o cualquier objeto con propiedades públicas.addItems($items): añade varios elementos a la vez, agregándolos a los elementos actuales. Lanzará una excepción si alguno de los nuevos elementos tiene un identificador que coincide con un identificador ya presente en la colección.$itemsdebe ser un array o un objetoTraversable.getItems(): recupera todos los elementos como un array de arrays.hasItem($id): determina si existe un elemento con el identificador dado en la colección.getItem($id): recupera un elemento con el identificador dado de la colección; el elemento devuelto será un array asociativo. Si ningún elemento coincide, se devuelve un valorNULL.removeItem($id): elimina un elemento con el identificador dado de la colección.clearItems(): elimina todos los elementos de la colección.setIdentifier($identifier): establece el nombre del campo que representa el identificador único de cada elemento en la colección.getIdentifier(): recupera el nombre del campo identificador.setLabel($label): establece el nombre de un campo que se usará como etiqueta de visualización para un elemento.getLabel(): recupera el nombre del campo de etiqueta.toArray(): convierte el objeto a un array. Como mínimo, el array contendrá las claves 'identifier', 'items' y 'label' si se ha establecido un campo de etiqueta en el objeto.toJson(): convierte el objeto a una representación JSON.
![[Note]](images/note.png)