Compreendendo o Bloco Magento e o Tipo de Bloco

105

Eu só quero entender o significado de

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

Recebi muitas referências do Google e entendi muitas coisas sobre isso, mas ainda não consigo entender a formação de type="page/html"como formar um tipo para meu módulo personalizado.

Por favor explique

type="A/B"

Deixe-me saber de onde vêm esses A e B?

Anup_Tripathi
fonte

Respostas:

126

O Aé o alias de um módulo . Neste caso, pageé a abreviação de Mage_Page_Block(é definido em app/code/core/Mage/Page/etc/config.xmlse você quiser ver).

O Bé o nome da classe relativo ao alias, as letras iniciais de cada palavra são maiúsculas. Nesse caso, htmltorna Html- se e é anexado ao alias resolvido, de modo que é Mage_Page_Block_Html. Isso provavelmente é encontrado no arquivo app/code/core/Mage/Page/Block/Html.phpporque os nomes das classes traduzem diretamente para as localizações no Magento.

Se você estivesse usando um alias de modelo em vez de um alias de bloco, pageestaria Mage_Page_Model. O mesmo acontece com modelos de recursos e auxiliares. Seu próprio módulo precisará defini-los em sua configuração se quiser ter blocos, modelos e auxiliares.

clockworkgeek
fonte
@ clockworkgeek muito obrigado. sua resposta é muito útil para mim.
Anup_Tripathi
Você me salvou uma tonelada. Obrigado.
Sumit Malik
Explicação agradável
Jalpesh Patel
E se for um bloco reescrito / substituído, como posso definir e usar o tipo de bloco?
Vicky Dev
@VickyDev você não precisa fazer nada diferente, pois o novo bloco será um descendente do bloco antigo e, portanto, é compatível. Você pode, e deve, fingir que nem existe.
clockworkgeek
158

Para entender mais sobre os tipos de blocos magento, a seguir estão alguns tipos de blocos integrados que são amplamente usados ​​no layout.

  1. core/template: Este bloco renderiza um template definido por seu  template atributo. A maioria dos blocos definidos no layout são do tipo ou subtipo de  core/template.
  2. page/html: Este é um subtipo de  core/template e define o bloco raiz. Todos os outros blocos são blocos filhos deste bloco.
  3. page/html_head: Define a seção do cabeçalho HTML da página que contém elementos para incluir JavaScript, CSS etc.
  4. page/html_header: Define a parte do cabeçalho da página que contém o logotipo do site, links principais, etc.
  5. page/template_links: Este bloco é usado para criar uma lista de links. Os links visíveis na área do rodapé e do cabeçalho usam este tipo de bloco.
  6. core/text_list: Alguns blocos content,  como  left, right etc. ,  são do tipo  core/text_list. Quando esses blocos são renderizados, todos os seus blocos filhos são renderizados automaticamente, sem a necessidade de chamar o getChildHtml() método.
  7. page/html_wrapper: Este bloco é usado para criar um bloco wrapper que renderiza seus blocos filhos dentro de uma tag HTML definida pela ação  setHtmlTagName. A tag padrão é  <div> se nenhum elemento for definido.
  8. page/html_breadcrumbs: Este bloco define a localização atual da página.
  9. page/html_footer: Define a área de rodapé da página que contém links de rodapé, mensagem de direitos autorais etc.
  10. core/messages: Este bloco renderiza mensagens de erro / sucesso / aviso.
  11. page/switch: Este bloco pode ser usado para o alternador de idioma ou loja.

Esta é uma lista apenas dos tipos de blocos comumente usados. Existem muitos outros tipos de bloco que são usados ​​em implementações de tema avançadas.

Kamesh Jungi
fonte
E sobre: ​​{{block type = "cms / block" block_id = "terms"}}
daslicht
5
@daslicht Já mencionei na resposta que: Esta é uma lista apenas dos tipos de bloco comumente usados. Existem muitos outros tipos de bloco que são usados ​​em implementações de tema avançadas.
Kamesh Jungi
Obrigado. Foi realmente útil.
arqam de
8
<block type="page/html" name="root" output="toHtml" template="example/view.phtml">

page é um FrontendName definido no etc/config.xmlarquivo html é um nome de classe de bloco

mais detalhes:

nesta linha, type(type="page/html")defina o nome da classe do bloco relacionado ao seu template(template="example/view.phtml">)e o nome é o único para cada bloco.

primeiro veja a estrutura da pasta

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

montamos FrontendName = 'mymodule'

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

em hello.php você criou uma função

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

e agora vá para a sua página xml de layout:

<block type="mymodule/data" name="xyz" template="example/view.phtml"> aqui mydata é o nome do frontend

e agora venha para o seu modelo

página template / example / view.phtml

aqui você pode chamar diretamente a função mydata ()

gostar

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

agora você pode obter sua saída no navegador "Bloco é chamado"

Devendra Kumar Gupta
fonte
Você chamou o bloco de hello.php, mas o nome da classe de bloco é 'namespace_modulename_Block_Data', não deveria ser Hello no final do nome?
Rai Ehtisham de
5

não sei sobre o tipo "B", mas "A" se refere à tag do nome do módulo no exemplo config.xml em config.xml:

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

Não, você não está errado. Mas "<!-- script -->"pode ser confuso. Vamos esclarecer: como as respostas acima indicadas, este é um alias, que consistia em duas partes, a primeira parte ("A") em si é o alias que você define para as classes do seu módulo em seu módulo config.xml, o segundo é um caminho relativo ao valor do nó. Juntos ("A" + "B" maiúsculo) serão traduzidos para um nome de classe, usando a primeira parte (o valor do nó "A") exatamente como você o definiu (observe as letras maiúsculas / minúsculas se não quiser horas de sofrimento) e a segunda parte é maiúscula após cada sublinhado. Portanto, comece com o exemplo A / B com um bloco e esta configuração:

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

Em tempo de execução A/Bseria resolvido pela configuração Magento para Vendor_Module_Block_Bque então incluído pelo autoload do seguinte caminho: public/app/local/Vendor/Module/Block/B.php. Para obter uma melhor compreensão, aconselho você a consultar o Mage_Core_Model_Config::getGroupedClassName(), Mage_Core_Model_Config::getModelInstance()e Varien_Autoload::autoload().

ZeNC
fonte
3

Não sei sobre o tipo "B", mas "A" se refere à tag de nome do módulo em config.xml

Um exemplo no arquivo config.xml:

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

nb: espero não estar errado ..

Rully
fonte