Zrozumienie Magento Block and Block Type

105

Chcę tylko zrozumieć znaczenie

 <block type="page/html" name="root" output="toHtml" template="example/view.phtml">

Mam wiele referencji od Google i zrozumiałem wiele rzeczy na ten temat, ale nadal nie jestem w stanie zrozumieć, type="page/html"jak utworzyć typ dla mojego niestandardowego modułu.

Proszę wytłumacz

type="A/B"

Daj mi znać, skąd pochodzą te A i B?

Anup_Tripathi
źródło

Odpowiedzi:

126

ATo moduł jest alias . W tym przypadku pagejest to skrót od Mage_Page_Block(jest zdefiniowany w, app/code/core/Mage/Page/etc/config.xmljeśli chcesz zobaczyć).

Jest Bto nazwa klasy w stosunku do aliasu, początkowe litery każdego słowa są pisane wielką literą. W tym przypadku htmlstaje się Htmli jest dołączane do rozwiązanego aliasu, więc tak jest Mage_Page_Block_Html. Prawdopodobnie znajduje się to w pliku, app/code/core/Mage/Page/Block/Html.phpponieważ nazwy klas są tłumaczone bezpośrednio na lokalizacje w Magento.

Gdybyś używał aliasu modelu zamiast aliasu blokowego page, Mage_Page_Modelzamiast tego byłby . To samo dzieje się z modelami zasobów i pomocnikami. Twój własny moduł będzie musiał zdefiniować je w swojej konfiguracji, jeśli ma mieć bloki, modele i pomocniki.

clockworkgeek
źródło
@ clockworkgeek bardzo dziękuję. Twoja odpowiedź jest dla mnie bardzo pomocna.
Anup_Tripathi,
Uratowałeś mi tonę. Dzięki.
Sumit Malik
Nice Explaination
Jalpesh Patel
Co jeśli jest to przepisany / nadpisany blok, jak mogę wtedy zdefiniować i używać typu bloku?
Vicky Dev
@VickyDev nie musisz robić nic innego, ponieważ nowy blok będzie potomkiem starego bloku, a więc jest kompatybilny. Możesz i powinieneś udawać, że w ogóle nie istnieje.
clockworkgeek
158

Aby dowiedzieć się więcej o typach bloków Magento, poniżej przedstawiono kilka wbudowanych typów bloków, które są szeroko stosowane w układzie.

  1. core/template: Ten blok renderuje szablon zdefiniowany przez jego  template atrybut. Większość bloków zdefiniowanych w układzie jest typu lub podtypu  core/template.
  2. page/html: Jest to podtyp  core/template i definiuje blok główny. Wszystkie inne bloki są blokami potomnymi tego bloku.
  3. page/html_head: Definiuje sekcję nagłówka HTML strony, która zawiera elementy obejmujące JavaScript, CSS itp.
  4. page/html_header: Definiuje część nagłówkową strony, która zawiera logo witryny, górne linki itp.
  5. page/template_links: Ten blok służy do tworzenia listy linków. Linki widoczne w stopce i obszarze nagłówka używają tego typu bloku.
  6. core/text_list: Niektóre bloki, takie jak  contentleftright itp są typu  core/text_list. Gdy te bloki są renderowane, wszystkie ich bloki podrzędne są renderowane automatycznie bez konieczności wywoływania getChildHtml() metody.
  7. page/html_wrapper: Ten blok jest używany do tworzenia bloku opakowującego, który renderuje swoje bloki potomne wewnątrz znacznika HTML ustawionego przez akcję  setHtmlTagName. Domyślnym znacznikiem jest to,  <div> że żaden element nie jest ustawiony.
  8. page/html_breadcrumbs: Ten blok definiuje bułkę tartą na stronie.
  9. page/html_footer: Definiuje obszar stopki strony, który zawiera linki w stopce, informacje o prawach autorskich itp.
  10. core/messages: Ten blok wyświetla komunikaty o błędach / sukcesach / powiadomieniach.
  11. page/switch: Ten blok może być używany do przełączania języka lub sklepu.

To jest lista tylko powszechnie używanych typów bloków. Istnieje wiele innych typów bloków, które są używane w zaawansowanych implementacjach motywów.

Kamesh Jungi
źródło
A co z: {{block type = "cms / block" block_id = "terms"}}
daslicht
5
@daslicht Już wspomniano w odpowiedzi, że: To jest lista tylko powszechnie używanych typów bloków. Istnieje wiele innych typów bloków, które są używane w zaawansowanych implementacjach motywów.
Kamesh Jungi
Dzięki. Był naprawdę pomocny.
arqam,
8
<block type="page/html" name="root" output="toHtml" template="example/view.phtml">

strona to nazwa frontendu zdefiniowana w etc/config.xmlpliku. html to nazwa klasy bloku

więcej szczegółów:

w tej linii type(type="page/html")zdefiniuj nazwę klasy bloku związaną z twoim, template(template="example/view.phtml">)a nazwa jest unikalna dla każdego bloku.

najpierw zobacz strukturę folderów

app> local> namespace> modulename> etc> config.xml

ustawiliśmy FrontendName = 'mymodule'

app> local> namespace> modulename> Block > hello.php

w hello.php utworzyłeś funkcję

   class namespace_modulename_Block_Data extends Mage_Core_Block_Template
   {
    public function mydata()
        {
            $data = "Block is called";
            return $data;
         }     
}   

a teraz przejdź do strony XML układu:

<block type="mymodule/data" name="xyz" template="example/view.phtml"> tutaj moje dane to nazwa frontendu

a teraz przejdź do szablonu

template / example / view.phtml strona

tutaj możesz bezpośrednio wywołać funkcję mydata ()

lubić

<div>
<?php echo $this->mydata(); ?>
</div>

teraz możesz uzyskać wynik w przeglądarce „Nazywa się blok”

Devendra Kumar Gupta
źródło
Nazwałeś blok hello.php, ale nazwa klasy bloku to „namespace_modulename_Block_Data”, czy na końcu nazwy nie powinno być Hello?
Rai Ehtisham
5

nie wiem o typie „B”, ale „A” odnosi się do tagu nazwy modułu w przykładzie config.xml w pliku config.xml:

<A><!-- script --></A>

Nie, nie mylisz się. Ale "<!-- script -->"może to być mylące. Wyjaśnijmy: zgodnie z powyższymi odpowiedziami jest to alias, który składał się z dwóch części, pierwsza część („A”) jest aliasem, który definiujesz dla klas swojego modułu w swoim module config.xml, druga to ścieżka względna wartość węzła. Te razem („A” + wielkie litery „B”) zostaną przetłumaczone na nazwę klasy, używając pierwszej części (wartość węzła „A”) dokładnie tak, jak ją zdefiniujesz (uważaj na duże / małe litery, jeśli nie chcesz godzin cierpienia), a druga część jest zapisywana wielką literą po każdym podkreśleniu. Więc zacznij od przykładu A / B z blokiem i tą konfiguracją:

<config>
  ...
  <global>
    <blocks>
      <A>Vendor_Module_Block</A>
    </blocks>
  </global>
  ...
</config>

W czasie wykonywania A/Bbyłoby rozwiązane przez config Magento na Vendor_Module_Block_Bktóre następnie zawarte przez autoload z następującej ścieżce: public/app/local/Vendor/Module/Block/B.php. Aby lepiej zrozumieć, radzę przyjrzeć się Mage_Core_Model_Config::getGroupedClassName(), Mage_Core_Model_Config::getModelInstance()i Varien_Autoload::autoload().

ZeNC
źródło
3

Nie wiem o typie „B”, ale „A” odnosi się do tagu nazwy modułu w pliku config.xml

Przykład w pliku config.xml:

<A><!-- script --></A>

uwaga: mam nadzieję, że się nie mylę ..

Rully
źródło