Cambiar formato a un valor de tipo Fecha en Magento

Este post trata de unos pequeños tips o unos pequeños snippets que nos va a permitir manipular correctamente el formato de una fecha cuando estemos armando nuestros módulos en Magento.

Es muy probable que la forma en que quieran mostrar una fecha en un formulario, nada tenga que ver con el formato en que se almacena en la base de datos.

Tenemos tres instancias en las cuales trabajamos con la fecha: el formulario del módulo que nos permite ingresar los valores, el controlador que recibe los valores y los graba, y por último, la impresión directa en un phtml.

Para formatear correctamente el valor en el formulario que usamos para la carga, tenemos que agregarle algunas propiedades adicionales al campo.

$fieldset->addField('event_date', 'date', array(
    'label'     => Mage::helper('module')->__('My Date'),
    'name'      => 'event_date',
    'image'     => $this->getSkinUrl('images/grid-cal.gif'),
    'format'    => '%d/%m/%Y',
));

Inicialmente sólo tendrían los atributos «label» y «name».

Con el uso de «image» (más la definición del tipo de campo) vamos a lograr que aparezca un calendario (un icono) a la derecha de nuestro campo, el cual nos permitirá seleccionar de forma visual el valor a ingresar.

Al aplicar «format», especificamos (si, ya se que se imaginan lo que sigue) el formato que queremos aplicarle, en el formulario, a nuestra fecha.

Con esto tendríamos resuelta la primera parte del proceso. El ingreso de datos.

Si pensamos en un módulo genérico, por lo general, el proceso de grabación de nuestro formulario se da a través del método saveAction(). Veamos el código de ésta acción.

if ($data = $this->getRequest()->getPost()) {
    $model = Mage::getModel('module/model');
    $model->setData($data)
        ->setId($this->getRequest()->getParam('id'));
    try {
        if ($model->getCreatedTime == NULL || $model->getUpdateTime() == NULL) {
            $model->setCreatedTime(now())
                ->setUpdateTime(now());
        } else {
            $model->setUpdateTime(now());
        }
        $model->save();
        Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('logs')->__('Item was successfully saved'));
        Mage::getSingleton('adminhtml/session')->setFormData(false);
        if ($this->getRequest()->getParam('back')) {
            $this->_redirect('*/*/edit', array('id' => $model->getId()));
            return;
        }
        $this->_redirect('*/*/');
        return;
    } catch (Exception $e) {
        Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
        Mage::getSingleton('adminhtml/session')->setFormData($data);
        $this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
        return;
    }
}
Mage::getSingleton('adminhtml/session')->addError(Mage::helper('logs')->__('Unable to find item to save'));
$this->_redirect('*/*/');

Para que esto no sea un problema, vamos a hacerle una pequeña modificación a saveAction() para que nos garantice que va a manejar la fecha correctamente.

Dentro del código, van las explicaciones.

if ($data = $this->getRequest()->getPost()) {
    $model = Mage::getModel('module/model');
    $model->setData($data)
        ->setId($this->getRequest()->getParam('id'));
    try {
        if ($model->getCreatedTime == NULL || $model->getUpdateTime() == NULL) {
            $model->setCreatedTime(now())
                ->setUpdateTime(now());
        } else {
            $model->setUpdateTime(now());
        }
        //Antes de intentar manipular el formato de la fecha, vamos a asegurarnos de que haya un valor.
        //Los valores pasados a través del post, quedan en un array.
        if (!empty($data['my_date'])) {
            //Buscamos el formato de fecha que deberá usarse basado en el locale de la configuración
            $date_format = Mage::app()->getLocale()->getDateFormat(
                    Mage_Core_Model_Locale::FORMAT_TYPE_SHORT
                );
            //Convertimos nuestra fecha según el formato que se definió por el locale
            $date = Mage::app()->getLocale()->date($data['my_date'], $date_format);
            $time = $date->getTimestamp();
            //Grabamos nuestro valor en el modelo de datos
            $model->setMyDate(
                    Mage::getSingleton('core/date')->gmtDate(null, $time)
                );
        }
 
//...
 
}

Ahora sólo nos resta mostrar nuestro valor en uno de los phtml de nuestro skin.

Si bien ésta parte del ejemplo puede quedar algo inclusa (ya que para obtener el valor que voy a mostrar se necesitan unas cuantas líneas de código previas que hacen que lleguemos a esa instancia), vamos a ver como lograr que la impresión salga con el formato buscado.

Dicho ésto, una vez que estemos con el valor listo para imprimir, ya sea que venga como propiedad de un objeto o en un array, debemos usar la siguiente función (para el ejemplo, voy a considerar que el valor viene en un array):

<?php echo $this->formatDate($array["my_date"]); ?>

Este tipo de ayudas me hubieran venido bastante bien hace un año cuando hice mi primera implementación de la plataforma. En ese momento no había nada de documentación, por suerte ahora ya… no, ahora tampoco hay. Je.