Tworzenie własnych pól w konfiguracji Magento

Tworzenie własnych pól w konfiguracji Magento 4.50/5 / 4

Każdy szanujący się moduł powinno dać się skonfigurować z poziomu admina :) . Temat z pozoru wydaje się prosty, bo niby wystarczy dodać tylko parę pól w SYSTEM->KONFIGURACJA. Ale trochę roboty jest. Fakt jest taki, że Magento dostarcza dużo rodzajów pól, które są automatycznie zapisywane w tabli core_config_data. Warto poświęcić trochę energii aby przebrnąć przez początkowe trudności.

Zaczynamy od stworzenia pliku:

app/code/local/Magentos/Tutorial/etc/system.xml

Będzie on zawierał definicje zakładek, sekcji, grup oraz pól w konfiguracji Magento. Przykładowa zawartość pliku może wyglądać mniej więcej tak:

<?xml version="1.0"?>
<config>
  <tabs>
        <magentos translate="label" module="magentos">
            <label>Magentos - zakładka</label>
            <sort_order>1</sort_order>
        </magentos>
  </tabs>
  <sections>
    <magentos_sekcja translate="label">
      <label>Magentos - sekcja</label>
      <tab>magentos</tab>
      <frontend_type>text</frontend_type>
      <sort_order>10</sort_order>
      <show_in_default>1</show_in_default>
      <show_in_website>1</show_in_website>
      <show_in_store>1</show_in_store>
	  <groups>
        
        <magentos_grupa translate="label">
          <label>Magentos - grupa</label>
          <frontend_type>text</frontend_type>
          <sort_order>100</sort_order>
          <show_in_default>1</show_in_default>
          <show_in_website>1</show_in_website>
          <show_in_store>1</show_in_store>
          <fields>
            
            <taknie translate="label comment">
              <label>Tak czy nie?</label>
              <frontend_type>select</frontend_type>
              <source_model>adminhtml/system_config_source_yesno</source_model>
              <sort_order>10</sort_order>
              <show_in_default>1</show_in_default>
              <show_in_website>1</show_in_website>
              <show_in_store>1</show_in_store>
            </taknie>
            <text translate="label comment">
              <label>Tekst</label>
              <frontend_type>text</frontend_type>
              <sort_order>10</sort_order>
              <show_in_default>1</show_in_default>
              <show_in_website>1</show_in_website>
              <show_in_store>1</show_in_store>
            </text>
            <textarea translate="label comment">
              <label>Pole tekstowe</label>
              <frontend_type>textarea</frontend_type>
              <sort_order>10</sort_order>
              <show_in_default>1</show_in_default>
              <show_in_website>1</show_in_website>
              <show_in_store>1</show_in_store>
            </textarea>
            <multiselect translate="label comment">
              <label>Multiselect</label>
              <frontend_type>multiselect</frontend_type>
              <source_model>adminhtml/system_config_source_enabledisable</source_model>
              
              <sort_order>10</sort_order>
              <show_in_default>1</show_in_default>
              <show_in_website>1</show_in_website>
              <show_in_store>1</show_in_store>
            </multiselect>
            <czas translate="label comment">
              <label>Czas</label>
              <frontend_type>time</frontend_type>
              <sort_order>10</sort_order>
              <show_in_default>1</show_in_default>
              <show_in_website>1</show_in_website>
              <show_in_store>1</show_in_store>
            </czas>
            <imagefile translate="label comment">
              <label>Zdjęcie</label>
              <frontend_type>imagefile</frontend_type>
              <sort_order>10</sort_order>
              <show_in_default>1</show_in_default>
              <show_in_website>1</show_in_website>
              <show_in_store>1</show_in_store>
            </imagefile>
            <file translate="label comment">
              <label>Plik</label>
              <frontend_type>file</frontend_type>
              <sort_order>10</sort_order>
              <show_in_default>1</show_in_default>
              <show_in_website>1</show_in_website>
              <show_in_store>1</show_in_store>
            </file>
          </fields>
        </magentos_grupa>
      </groups>	
    </magentos_sekcja>
  </sections>
</config>

Plik może wydawać się skomplikowany na pierwszy rzut oka. Przeanalizuj dokładnie ten kawałek xmla. Starałem się nazywać tagi w taki sposób aby łatwo dało się porównać, który kawałek kodu odpowiada elementom w konfiguracji Magento.

Nie jest to jeszcze niestety koniec. Ponieważ kliknięcie w sekcję w konfiguracji Magento otwiera de facto nową stroną, trzeba zdefiniować jeszcze odpowiednie uprawnienia. W tym celu tworzymy plik:

app/code/local/Magentos/Tutorial/etc/adminhtml.xml

Jego zawartość powinna wyglądać następująco:

<?xml version="1.0"?>
<config>
  <acl>
    <resources>
      <all>
        <title>Allow Everything</title>
      </all>
      <admin>
        <children>
          <system>
            <children>
              <config>
                <children>
                  <magentos_sekcja translate="title">
                    <title>Magentos Tutorial</title>
                    <sort_order>100</sort_order>
                  </magentos_sekcja>
                </children>
              </config>
            </children>
          </system>
        </children>
      </admin>
    </resources>
  </acl>
</config>

O uprawnieniach w Magento będzie jeszcze w następnych postach, więc poprzestańmy na przekopiowaniu tego pliku bez zrozumienia :)

Ponieważ chcemy aby nasze sekcje w konfiguracji Magento podlegały mechanizmom tłumaczenia musimy stworzyć w naszym module standardowy helper:

app/code/local/Magentos/Tutorial/Helper/Data.php

który tak na prawdę zawiera niewiele, ale zapewnia nam mechanizm tłumaczenia:

<?php 

class Magentos_Tutorial_Helper_Data extends Mage_Core_Helper_Abstract{}

I jeszcze drobna zmiana w pliku:

app/code/local/Magentos/Tutorial/etc/config.xml

W tagu global dodajemy definicję helperów w naszym module:


        <helpers>
            <magentos><class>Magentos_Tutorial_Helper</class></magentos>
        </helpers>

Po tych zabiegach powinniśmy znaleźć nasze nowe pola w adminie:

SYSTEM->KONFIGURACJA

No i teraz jasną sprawą jest, że chcemy użyć tych zmiennych konfiguracyjnych gdzieś indziej w kodzie Magento. Tak to się robi:


Mage::getStoreConfig('magentos_sekcja/magentos_grupa/taknie');

Dla przykładu użyłem odwołania do pola tak/nie w bloku, który już wcześniej stworzyliśmy:

app/code/local/Magentos/Tutorial/Block/Hello.php
<?php

class Magentos_Tutorial_Block_Hello extends Mage_Core_Block_Template
{
	public function isLoggedIn(){
		return Mage::getStoreConfig('magentos_sekcja/magentos_grupa/taknie');    
		return Mage::getSingleton('customer/session')->isLoggedIn();
	}
}


https://github.com/magentos-pl/nauka.git