2010-09-07 7 views
6

Jak stwierdzono w temacie, próbuję dodać pole daty z jego selektorem daty w System> Konfiguracja dla niestandardowego modułu (w ten sposób za pomocą etc/system.xml).Dodaj selektora daty do system.xml na niestandardowym module

Starałem się czerpać inspirację z poniższym wątku: Magento - Add a button to system.xml with method attached to it

ale bez powodzenia.

Jestem pewien, że jest to kwestia stworzenia odpowiedniego bloku lub metodę, aby utworzyć pole niestandardowe HTML, ale nie mogę odczytać thru Magento Matrix :)

siedzę na etapie gdzie potrzebne do kodu klasa (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; 
      } 
      }  
      ?> 

Czy masz sztuczkę, jak to zrobić?

Wielkie dzięki. Hervé

Odpowiedz

15

EDIT 19.02.2014: dodano walidację

znalazłem to, co myślę jest bardziej elegancki sposób to zrobić. Właściwie metody satrun77 są w porządku, ale musimy umieścić plik w Varien/Data/Form/Element /, który może zostać nadpisany, jeśli ktoś inny pracujący nad projektem nie korzysta z tej samej nazwy pliku/klasy. Co więcej, ta metoda umieszcza plik w katalogach modułów, co jest, moim zdaniem, lepsze niż dystrybucja plików w całym drzewie katalogów.

W 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> 

utworzyć nowy plik:

app/code/[lokalnej,]/Namespace/Moduł/blok/Adminhtml/system/config/Data

z poniższej treści:

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

Czy konieczne było zarejestrowanie tego bloku w pliku config.xml? – Ryre

+0

Tak.Gdy tylko użyjesz niestandardowego bloku dla modułu, klasa Block musi zostać zadeklarowana w pliku config.xml –

+0

. Dziękujemy za odpowiedź. Odkryłem, że konieczne jest zarejestrowanie "nadrzędnego" w pliku config.xml (Namespace_Module), ale nie jest konieczne, aby konkretnie zarejestrować datę. – Ryre

2

Utwórz plik klasy w app/code/local/Varien/Data/Form/Element/. Upewnij się, że nazwa pliku jest prefiksem coś, identyfikacji modułu (jest to po prostu odróżnić swój własny kod z podstawowych plików 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(); 
    } 
} 

Wewnątrz modułu System.Xml

<?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> 

Umieszczenie kodu niestandardowego wewnątrz katalogu lib/folder lub app/Mage/Core/nie jest najlepszym sposobem na stworzenie własnego kodu dla Magento. Te foldery są przeznaczone dla kodu podstawowego, a nie niestandardowego.

To podejście tworzy najmniejszą ilość kodu i nie powoduje zmiany żadnego z plików podstawowych. Tak więc nie ma nic złego w posiadaniu dodatkowego pliku wewnątrz katalogu lib /. Ale musisz pamiętać, że masz dodatkowy plik do swojego modułu w lib /.

Nadzieja to pomaga

+2

utworzyć plik w 'app/code/local/Varien/Dane/Forma/Element /' zamiast, to będzie działać tak samo dobrze i nie zbliża się do folderów podstawowych. – clockworkgeek

+0

@clockworkgeek dziękuję to działa – satrun77

Powiązane problemy