Czy można zmienić typ bloku w układzie XML?

13

Czy można zmienić typ bloku w układzie XML układu?

Wiem, jak zmienić szablon przy użyciu setTemplatemetody, ale próbuję zmienić typ bloku. czy to możliwe?

Marty Wallace
źródło
wyjaśnij szczegółowo, co musisz zmienić
Keyul Shah

Odpowiedzi:

7

Zmiana typu bloku oznacza zmianę klasy bloku, więc nie, ale ...

... możesz po prostu zastąpić blok:

  1. Znajdź uchwyt układu, który jest wywoływany później LUB upewnij się, że twój layout.xmljest przetwarzany po utworzeniu bloku, np. Z <depends>inCompany_Module.xml
  2. Po prostu utwórz nowy blok innego typu o tej samej nazwie

Problem polega na tym, że to zastępuje blok i nie zmienia typu. Oznacza to, że wszystko, co zostało zrobione w tym bloku między stworzeniem a twoją zmianą, zostało utracone.

Na przykład do zmiany catalog.navigation:

<layout version="0.1.0">
    <catalog_category_default translate="label">
        <reference name="left">
            <block type="myModule/navigation" name="catalog.leftnav" after="currency" template="myModule/catalog/navigation/left.phtml"/>
        </reference>
    </catalog_category_default>
</layout>
Fabian Blechschmidt
źródło
1
Możesz także utworzyć nową klasę bloków, która „odziedziczy” klasę bloków, którą chcesz zastąpić. Musisz dodać wpis w pliku config.xml niestandardowego rozszerzenia, aby zamienić klasę bloku na własną. Ma to sens, jeśli planujesz rozszerzyć lub zmodyfikować funkcjonalność bloku.
Biagio Arobba
3

Nie można tego zmienić w plikach układu afaik. Możesz je jednak rozszerzyć i zastąpić w plikach konfiguracyjnych.

Przykład:

<config>
    <global>
        <blocks>
            <catalog>
                <rewrite><product_view>My_Custom_Block_Product_View</product_view></rewrite>
            </catalog>
        </blocks>
    </global>
</config>

Pamiętaj, aby przedłużyć oryginalny blok.

smdev
źródło
1

Miałem podobny problem, że muszę zaktualizować konkretny blok dla określonego układu.

Skończyło się to i wydaje się, że działa (w pliku układu)

<controller_x_y>
    <reference name="block_name_reference">
        <block type="mymodule/customblock" name="block_name_reference" />
    </reference>
</controller_x_y>

Mam nadzieję że to pomoże.

Alvin Nguyen
źródło