Note

The online documentation is produced by a web publishing technology created by us to read the documents origins in OpenOffice Writer (ODT) and Microsoft Word (docx) formats and produces native web and PDF versions. In this way we maintain Louder project documentation update and in sync on each of its formats.
Select a Language:
ActionHelpers
Introducción
Los ActionHelpers son subcomponentes auxiliares que complementan y auxilian a las implementaciones de controladores algunas veces estableciendo puentes a la presentación y otras veces a la capa de datos.
Mensajes usando Flash
El ActionHelper Flash permite la generación de mensajes contextuales en cualquier parte de la aplicación. Adicional a esto es posible almacenar mensajes para ser mostrados cuando se requiera en otras peticiones.
Generar mensajes contextuales
Los mensajes contextuales permiten aparte del mensaje por medio de colores e iconos informar el carácter del mismo.
Tabla: Tipos de mensajes contextuales con Flash
Método
TipoDescripción
Flash::errorErrorInforma que hay una situación de error. Por defecto se usa fondo rosa, texto en rojo y un icono de adminiración.
Flash::noticeInformaciónDa el contexto de información. Por defecto se usa fondo azul y letra azul oscuro.
Flash::successÉxitoIndica que la operación tuvo éxito ó se ejecutó un proceso satisfactoriamente. Por defecto se usa fondo verde llamativo y letra verde oscura.
Flash::warningAdvertenciaGenera un mensaje con el contexto de advertencia. Por defecto se usa amarillo claro en el fondo, letra en negro y un icono de alerta.

Todos los métodos reciben en su parámetro el mensaje a mostrar.
Cambiar el estilo por defecto de los mensajes
Si se desea cambiar el estilo de los mensajes de texto se puede modificar ó sobreescribir las clases CSS en el archivo public/css/style.css que siempre se inserta en todas las peticiones. Por defecto las clases tienen los siguientes estilos:
Ejemplo: Estilos CSS predefinidos para mensajes del Flash
.kumbiaDisplay {
     font-size: 11px;
     font-weight: bold;
     margin: 0 auto;
     padding: 2px 25px;
     background-repeat: no-repeat;
     background-position: 5px center;
     text-align: left;
}

.errorMessage {
     background-image: url("@path/img/error.gif");
     background-color: #FFDDDD;
     color: #B30000;
     border: 1px solid #FFB7B7;
     margin: 2px;
     text-align: left;
}

.noticeMessage {
     background-image: url("@path/img/user.gif");
     background-color: #CCDEFF;
     color: #004A6F;
     margin: 2px;
     border: 1px solid #004A6F;
     text-align: left;
}

.sucessMessage {
     background-image: url("@path/img/ok.gif");
     background-color: #CCFF99;
     color: #008000;
     border: 1px solid #008000;
}

.warningMessage {
     background-image: url("@path/img/warning.gif");
     background-color:  #FFFFC6;
     color: #000000;
     border: 1px solid #DDDD00;
}
Cambiar el estilo en forma dinámica
Si se requiere cambiar la presentación de un mensaje en forma programacional se puede enviar un listado de clases CSS como segundo parámetro.
Ejemplo: Establecer una clase CSS personalizada para Flash
Flash::notice("Esto es una información personalizada", array("mi_clase_css", "otra_clase_css"));
Enviar múltiples mensajes del mismo tipo en forma simúltanea
Cuando el primer parámetro recibido por un método de mensajes es un vector con mensajes la lista de estos es enviada una tras otra en el orden recibido.
Ejemplo: Enviar varios mensajes simultáneos mediante un array con Flash
Flash::error(array(
     "Este es el primer error",
     "Este es el segundo error",
     "Este es el tercer error",
));
Mostrar mensajes por su tipo
El método de Flash llamado message permite mostrar un mensaje utilizando una constante como segundo parámetro que establece el tipo a mostrar:
Flash::message("Esto es una advertencia", Flash::WARNING);
Flash::message("Esto es un error", Flash::ERROR, array("my_error_css"));
Tabla: Constantes de los tipos de mensajes
Valor
ConstanteDescripción
0Flash::ERRORMensajes de error
1Flash::NOTICEMensajes de información
2Flash::SUCCESSMensajes de éxito
3Flash::WARNINGMensajes de advertencia
Cachear mensajes para mostrarlos en la próxima petición
Si se requiere mostrar mensajes al usuario después de realizar una redirección se puede utilizar el método addMessage que funciona como el método message recibe el mensaje y un código indicando el tipo. Los mensajes que se agregan de esta forma no son visualizados sino hasta que se invoca el método getMessages().

El siguiente ejemplo ilustra el funcionamiento de este tipo de mensajes:
Ejemplo: Enviar mensajes Flash usando la cola de mensajes de próxima petición
<?php

class LoginController extends ApplicationController {

     public function indexAction(){
          Flash::addMessage("Bienvenido usuario", Flash::SUCCESS);
          $this->redirect("login/menu");
     }

     public function menuAction(){
          foreach(Flash::getMessages() as $message){
               Flash::message($message['message'], $message['type']);
          }
     }

}

Los mensajes agregados con addMessage se almacenan en un buffer del contexto de sesión. Cuando los mensajes se obtienen con getMessages el buffer interno se resetea.
Condiciones SQL con FormCriteria
El actionhelper FormCriteria permite crear condiciones SQL a partir de los parámetros recibidos por un formulario de entrada de usuario. De acuerdo a los parámetros recibidos, solo los que tengan valores no nulos se incluyen en las condiciones generadas.

En el siguiente ejemplo se muestra como crear la condición de búsqueda para diversos tipos de datos obtenidos desde un formulario.

Los datos capturados son:

  • Código: Corresponde al código del producto y es de tipo numérico.
  • Nombre: El nombre del producto y es de tipo texto.
  • Categoría: Campo de tipo entero de la entidad Products que es relación a la tabla ProductCategories. Se usa Tag::select para cargar los datos de esta tabla y se indica el parámetro useDummy para agregar la opción 'Seleccione…'.
  • Tipo: Combo creado apartir de un array con valores estáticos que corresponde al campo type de la entidad Products.

El formulario en la vista views/products/index.phtml es el siguiente:
<h1>Buscar Productos</h1>

<?php echo Tag::form('products/search'); ?>
<table>
     <tr>
          <td align="right">Código:</td>
          <td><?php echo Tag::numericField('code') ?></td>
     </tr>
     <tr>
          <td align="right">Nombre:</td>
          <td><?php echo Tag::textField('name') ?></td>
     </tr>
     <tr>
          <td align="right">Categoría:</td>
          <td><?php echo Tag::select('product_category_id', $ProductsCategories->find(), 'using: id,name', 'useDummy: yes') ?></td>
     </tr>
     <tr>
          <td align="right">Tipo:</td>
          <td><?php echo Tag::selectStatic('type', array(
               'A' => 'ALIMIMENTOS',
               'B' => 'BEBIDAS',
               'O' => 'OTRO'
          ), 'useDummy: yes') ?></td>
     </tr>
     <tr>
          <td></td>
          <td><?php echo Tag::submitButton('Enviar') ?></td>
     </tr>
</table>
<?php echo Tag::endForm() ?>

En el controlador se define la búsqueda según se envie los parámetros a la acción search:
Ejemplo: Crear un criterio de búsqueda SQL usando FormCriteria
<?php

class ProductsController extends ApplicationController {

     public function indexAction(){
          
     } 

     public function searchAction(){
          $criteria = new FormCriteria($_POST, array(
               'code' => array(
                    'type' => 'integer',
                    'fieldName' => 'id'
               ),
               'name' => array(
                    'type' => 'string'
               ),
               'product_categories_id' => array(
                    'type' => 'integer',
                    'operator' => '=',
                    'nullValue' => '@'
               ),               
               'type' => array(
                    'type' => 'string',
                    'operator' => '=',
                    'nullValue' => '@'
               )
          ));
          $this->Products->find($criteria->getConditions());
     }

}

El constructor recibe 2 parámetros, el primero corresponde al origen de los datos de los cuales se construira el criterio de búsqueda. El segundo es un descriptor con los campos que se reciben del formulario y la forma en que debe construirse la condición para cada uno. Las llaves del descriptor son los nombres de las variables que vienen del formulario y que son parte del origen de datos. En el ejemplo el origen de datos es la superglobal $_POST.

La descripción de las opciones para cada campo es:
Tabla: Opciones de los campos para crear el criterio de búsqueda con FormCriteria
Opción
Descripción
typeEs el tipo de dato que se espera recibir del formulario. Puede ser integer, float, double, date y string. Dependiendo del tipo de dato es posible que se apliquen filtros.
operadorUn operador compatible con el gestor relacional utilizado. Cuando la opción "type" es integer, float, double y date se utiliza el operador '=' cuando es string se usa el operador 'LIKE'.
missOnNullUn valor booleano que determina si se debe omitir la condición caso de que el valor recibido sea nulo ó el valor establecido para nulo mediante 'nullValue'. Por defecto su valor es true.
nullValueEl valor que debe entenderse como valor nulo para saber si se debe omitir al generar la condición.
fieldNameEl nombre del atributo en la entidad. Si no se indica se usa el nombre de la llave en el descriptor.


Si se envia el valor code=10 se produce la condición:
id = 10
Si se envian los valores code=10 y nombre="cheese cake" se produce la condición:
id = 10 OR name LIKE '%cheese%cake%'

Si se envian los valores product_categories_id = 2 y type='A' (type es el nombre del campo) se produce la condición:
product_categories_id = 2 OR type = 'A'

Por defecto el operador para unir las condiciones es OR, con lo que si cualquiera de las opciones se cumple entonces se obtiene el resultado. Si se desea lo contrario entonces se puede enviar el operador como parámetro de getConditions así.
$this->Products->find($criteria->getConditions('AND'));
Criterios de Rangos
Con FormCriteria también es posible crear criterios de rangos cuyos valores sean obtenidos de un formulario de entrada de usuario.

Si lo que se requiere es que apartir de campos obtenidos del formulario se cree la condición entonces debe definir de la siguiente forma:
Ejemplo: Crear un criterio basado en un rango de fechas con FormCriteria
$criteria = new FormCriteria($_POST, array(
     'fechaInicial:fechaFinal' => array(
          'type' => 'date',
          'fieldName' => 'fecha'
     )
));

Si se envian los valores fechaInicial="2008-10-20" y fechaFinal="2008-11-22" se produciría la siguiente condición:
fecha >= '2008-10-20' AND fecha <= '2008-11-22'

Y si lo que se requiere es que el valor de la entrada de usuario se encuentre entre 2 campos de la tabla entonces se define así:
//La tabla es de registro de vuelos
$criteria = new FormCriteria($_POST, array(
     'fecha' => array(
          'type' => 'date',
          'fieldName' => 'fechaLlegada:fechaSalida'
     )
));
Si se envian el valor fecha="2008-10-20" se produciría la siguiente condición:
fechaLlegada >= '2008-10-20' AND fechaSalida <= '2008-10-20'
Unir varias condiciones
Varias criterios pueden ser unidos utilizando operadores diferentes para de esta forma construir condiciones más complejas:
Ejemplo: Crear condiciones de búsqueda compuestas con FormCriteria::form
$criteria1 = new FormCriteria($_POST, array(
     'code' => array(
          'type' => 'integer',
          'fieldName' => 'id'
     ),
     'product_categories_id' => array(
          'type' => 'integer',
          'operator' => '=',
          'nullValue' => '@'
     ),
));

$criteria2 = new FormCriteria($_POST, array(
     'code' => array(
          'type' => 'integer',
          'fieldName' => 'id'
     ),
     'name' => array(
          'type' => 'string'
     ),
));

$conditions = FormCriteria::join('OR', array(
     $criteria1->getConditions('AND'), 
     $criteria2->getConditions('AND')
));

El método estático FormCriteria::join puede unir 2 ó más objetos FormCriteria con un operador diferente.
Información del Navegador con Browser
Este ActionHelper permite obtener información del explorador del cliente desde el cuál se está accediendo a la aplicación.
API de Browser
El API es la siguiente:

public static boolean isFirefox()
Devuelve true si el explorador utilizado es Mozilla Firefox.

public static boolean isSafari()
Devuelve true si el explorador utilizado es Apple Safari.

public static boolean isCamino()
Devuelve true si el explorador utilizado es Camino.

public static boolean isInternetExplorer()
Devuelve true si el explorador utilizado es Microsoft Internet Explorer.

public static boolean isMobileSafari()
Devuelve true si el explorador utilizado es Apple Mobile Safari, el que usa el SO del iPhone y iPod Touch.

public static boolean isIEMobile()
Devuelve true si el explorador utilizado es Microsoft Internet Explorer Mobile usado en el sistema operativo Windows Mobile.

public static boolean isOperaMobile()
Devuelve true si el explorador utilizado es Opera Mobile si el explorador utilizado es Opera para Windows Mobile.

public static string getVersion()
Devuelve la versión del explorador utilizado.

public static string getUserAgent()
Devuelve el User Agent del explorador cliente.

public static boolean isGecko()
Devuelve true si el motor de renderizado del explorador es Gecko.

public static boolean isWebKit()
Devuelve true si el motor de renderizado del explorador es WebKit.

public static string getAcceptEncoding()
Indica los tipo de codificación soportador por el explorador.

public static string getAcceptLanguage()
Obtiene el idioma utilizado por el explorador usando el estándar RFC.

public static boolean acceptCompressedOutput()
Indica si el explorador acepta salida comprimida ya sea usando gzip ó deflate.

public static string getBrowserAbrev()
Devuelve una abreviatura del User Agent del explorador.

public static boolean isMobile()
Indica si el explorador usado se encuentra en una plataforma móvil.

public static boolean isMacOSX()
Devuelve true si el sistema operativo del cliente es Apple Mac OS X.

public static boolean isWindows()
Devuelve true si el sistema operativo del cliente es Microsoft Windows

public static boolean isLinux()
Devuelve true si el sistema operativo del cliente es Linux.
Autocompletar con Scriptaculous
El helper Scriptaculous permite convertir un conjunto de datos en el formato compatible al componente visual de autocompletar que proporciona el framework script.aculo.us. En el siguiente ejemplo se muestra el uso de este:

En la vista se usa el helper de la vista Tag::textWithAutocomplete para crear un campo con autocompletar:
<?php echo Tag::textFieldWithAutocomplete('pais', 'action: paises/consultar') ?>

Según su definición cuando el usuario escriba algunos carácteres se obtendrán los datos del resultado de la acción consultar en el controlador paises.

Si los datos de paises se obtienen de un array estático entonces el controlador paises es el siguiente:
Ejemplo: Obtener los datos de auto-completado desde una array usando Scriptaculous::autocomplete
<?php

class PaisesController extends ApplicationController {

     public function consultarAction(){

          //Se indica que la respuesta es AJAX
          $this->setResponse('ajax');

          //Se obtiene lo que digitó el usuario en la caja de texto
          $pais = $this->getPostParam('pais');

          //Obtener los datos de un array estatico
          $paises = array(
               'C' => 'COLOMBIA',
               'E' => 'ECUADOR',
               'M' => 'MEXICO',
               'A' => 'ARGENTINA',
               'U' => 'URUGUAY',
               'B' => 'BOLIVIA'
          );

          //Se filtran los que coincida con la busqueda
          $paisesBusqueda = Scriptaculous::filter($pais, $paises);

          //Se genera el HTML a devolver al usuario
          $htmlCode = Scriptaculous::autocomplete($paisesBusqueda);

          $this->renderText($htmlCode);

     }
}

Si los datos de paises se obtienen de una tabla entonces el controlador paises es el siguiente:
Ejemplo: Obtener los datos de auto-completado desde una tabla usando Scriptaculous::autocomplete
<?php

class PaisesController extends ApplicationController {

     public function consultarAction(){

          //Se indica que la respuesta es AJAX
          $this->setResponse('ajax');

          //Campos del modelo utilizados para crear el resultado
          $fields = array('cod_pais', 'nombre');

          //Obtener los paises requeridos
          $paises = Scriptaculous::querySource('paises', $fields, $pais);

          //Se genera el HTML a devolver al usuario
          $htmlCode = Scriptaculous::autocomplete($paises, $fields);

          $this->renderText($htmlCode);

     }

}