2010-09-07 6 views
6

Como se indica en el asunto, estoy tratando de agregar un campo de fecha con su selector de fecha en el área Sistema> Configuración para un módulo personalizado (utilizando así etc/system.xml)Agregue un selector de fecha a system.xml en el módulo personalizado

Me trataron de conseguir la inspiración de la rosca a continuación: Magento - Add a button to system.xml with method attached to it

pero sin éxito.

Estoy seguro de que esto es una cuestión de crear el bloque o método correcto para crear un campo personalizado HTML, pero no puedo leer a través de la matriz de Magento :)

estoy atascado en el paso donde necesito código la clase (Datefield.php):

<?php 
      class Namespace_Module_Block_Datefield extends Mage_Adminhtml_Block_System_Config_Form_Field { 

      protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) { 
    // ----> Am I wrong in calling ..._Abstract? Should I call Varien_Data_Form_Element_Date? I've tried but no success either... 

$this->setElement($element); 

       $html = // ------------------> what to put here? Call a block or some other method? 
         ->setFormat('d-m-Y') 
         ->setLabel($this->__('Choose date')) 
         ->toHtml(); 

       return $html; 
      } 
      }  
      ?> 

¿Tiene un truco sobre cómo hacerlo?

Muchas gracias. Hervé

Respuesta

15

EDITAR 19/02/2014: validación añadido

encontré lo que creo que es una forma más elegante de hacer esto. En realidad, los métodos de satrun77 están bien, pero debemos colocar un archivo en Varien/Data/Form/Element/que se puede sobrescribir si otra persona que trabaja en el proyecto utiliza el mismo nombre de archivo/clase. Además, este método coloca el archivo en los directorios del módulo que, creo, es mejor que distribuir archivos por todo el árbol de directorios.

En system.xml:

<?xml version="1.0" encoding="UTF-8"?> 
    <config> 
    .... 
     <fields> 
     ... 
      <run translate="label"> 
      <label>Date</label> 
      <frontend_type>text</frontend_type> <!-- Use text instead of "myDateSelection" --> 
      <frontend_model>module/adminhtml_system_config_date</frontend_model> <!-- Call a module specific renderer model --> 
      <sort_order>20</sort_order> 
      <show_in_default>1</show_in_default> 
      <show_in_website>1</show_in_website> 
      <validate>required-entry</validate> <!-- Optional --> 
      <show_in_store>1</show_in_store> 
      </run> 
     </fields> 
    ... 
    </config> 

Crear un nuevo archivo:

app/código/[local, comunitario]/Espacio de nombres/módulo/Bloquear/Adminhtml/Sistema/Configuración/Fecha

con el contenido a continuación:

class Namespace_Module_Block_Adminhtml_System_Config_Date extends Mage_Adminhtml_Block_System_Config_Form_Field 
{ 
    protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) 
    { 
     $date = new Varien_Data_Form_Element_Date; 
     $format = Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT); 

     $data = array(
      'name'  => $element->getName(), 
      'html_id' => $element->getId(), 
      'image'  => $this->getSkinUrl('images/grid-cal.gif'), 
     ); 
     $date->setData($data); 
     $date->setValue($element->getValue(), $format); 
     $date->setFormat(Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT)); 
     $date->setClass($element->getFieldConfig()->validate->asArray()); 
     $date->setForm($element->getForm()); 

     return $date->getElementHtml(); 
    } 
} 
+0

¿Fue necesario registrar este bloque en config.xml? – Ryre

+0

Sí.Tan pronto como utilice un Bloque personalizado para un módulo, la clase Bloque debe declararse en su config.xml –

+0

Gracias por la respuesta. Descubrí que es necesario registrar el "padre" en config.xml (Namespace_Module), pero no es necesario registrar específicamente la Fecha. – Ryre

2

Crear archivo de clase en app/code/local/Varien/Data/Form/Element/. Asegúrese de que el nombre de archivo va precedido de algo que identificar su módulo (esto es sólo para diferenciar el código personalizado de archivos del núcleo Magneto)

class Varien_Data_Form_Element_MyDateSelection extends Varien_Data_Form_Element_Date 
{ 
    public function getElementHtml() 
    { 
     // define image url 
     $this->setImage(Mage::getDesign()->getSkinUrl('images/grid-cal.gif')); 
     // define date format 
     $this->setFormat('yyyy-MM-dd'); 

     return parent::getElementHtml(); 
    } 
} 

Dentro de su system.xml módulo

<?xml version="1.0" encoding="UTF-8"?> 
    <config> 
    .... 
     <fields> 
     ... 
      <run translate="label"> 
      <label>Run now</label> 
      <frontend_type>myDateSelection</frontend_type> 
      <sort_order>20</sort_order> 
      <show_in_default>1</show_in_default> 
      <show_in_website>1</show_in_website> 
      <show_in_store>1</show_in_store> 
      </run> 
     </fields> 
    ... 
    </config> 

La colocación de código personalizado dentro de lib/carpeta o aplicación/Mage/Core/carpeta no es la mejor manera de crear código personalizado para Magento. Estas carpetas son para código central y no código personalizado.

Este enfoque crea la menor cantidad de código y no cambia ninguno de los archivos principales. Por lo tanto, no hay ningún daño al tener un archivo adicional dentro de la carpeta lib /. Pero debe recordar que tiene un archivo adicional para su módulo en lib /.

Esperanza esto ayuda

+2

crea el archivo en 'app/código/local/Varien/datos/Formulario/Elemento /' en lugar, que funcionará igual de bien y no va a ninguna parte cerca de las carpetas principales. – clockworkgeek

+0

@clockworkgeek gracias, funciona – satrun77

Cuestiones relacionadas