Question

Cela me rend vraiment confus !!

Je suis arrivé à une situation où je dois créer un nouveau bloc (core/template block) par programmation, si un bloc CMS est présent dans une mise en page.Dans le cas général, à ma connaissance, il existe deux solutions pour cela.

1.Ajouter un bloc via la mise en page

Dans la plupart des cas, ce serait la meilleure idée pour effectuer cette tâche.Nous pouvons ajouter un bloc à une page si un handle de mise en page approprié est disponible.Mais malheureusement, dans mon cas, je n'ai pas de gestionnaire de mise en page spécifique à un bloc statique disponible (pour les pages cms, nous savons qu'il existe cms_page poignée).Je ne peux donc pas compter sur cette méthode

2.Utiliser un observateur

La deuxième méthode consisterait à écouter un observateur approprié.Encore une fois, je ne trouve pas d'observateur basé sur un bloc statique qui se déclenche pendant le temps de chargement de la mise en page/du bloc.Il existe cependant quelques observateurs généraux sur lesquels je peux compter.Je pense controller_action_layout_generate_blocks_before peut utiliser dans mon cas.Mais là, je suis confronté à mon vrai problème

Mon vrai problème

Alors quand j'utilise controller_action_layout_generate_blocks_before événement dans mon cas, le problème est que je ne peux pas récupérer les blocs en fonction de leur type.Je peux filtrer les blocs en fonction de leur name, mais pas en fonction de leur type.c'est à dire

$observer->getEvent()->getLayout()->getBlock('block_name'); //this work; Used name
$observer->getEvent()->getLayout()->getBlock('cms/block'); //this wont; use type

En fait, je ne peux pas me fier aux noms. Parce que je veux tout avoir cms/block tapez des blocs et ajoutez un nouveau modèle après avoir vérifié certaines de leurs propriétés personnalisées que j'ai définies avec un bloc statique

Alors, comment puis-je tout obtenir cms/block par l'intermédiaire d'un observateur ?Est-ce même possible.Veuillez partager vos réflexions.

Était-ce utile?

La solution

Utilisez ceci:

           <core_block_abstract_prepare_layout_before>
                <observers>
                    <ssd_test>
                        <class>ssd_test/observer</class>
                        <method>generateBlocks</method>
                        <type>singleton</type>
                    </ssd_test>
                </observers>
            </core_block_abstract_prepare_layout_before>

Observateur:

public function generateBlocks($observer)
    {
        /**
         * @var $block Mage_Core_Block_Abstract
         */
        $block = $observer->getEvent()->getBlock();
        if ($block->getType() == 'cms/block') {
            //do something
        }
    }

Faire référence à protected function _toHtml() de la Mage_Cms_Block_Block si vous souhaitez apporter des modifications.

Mettre à jour (une autre solution)

    <controller_action_layout_generate_blocks_after>
        <observers>
            <ssd_test>
                <class>ssd_test/observer</class>
                <method>generateBlocks</method>
                <type>singleton</type>
            </ssd_test>
        </observers>
    </controller_action_layout_generate_blocks_after>

Observer.php :

public function generateBlocks($observer)
    {
        /**
         * @var $l Mage_Core_Model_Layout
         */
        $l = $observer->getEvent()->getLayout();

        $newBlock = $l->createBlock(
            'Mage_Core_Block_Template',
            'new_block_name_here',
            array('template' => 'some_template.phtml')
        );

        foreach ($l->getAllBlocks() as $block) {
            if ($block->getType() == 'cms/block') {
                $l->getBlock('some_block_name')->append($newBlock);
            }
        }
    }

Autres conseils

Ne pourriez-vous pas simplement écouter l'événement core_block_abstract_to_html_before puis vérifiez le type de bloc sur l'événement et mettez à jour le modèle en fonction de cela ?Quelque chose comme ce qui suit devrait le faire.

$block = $observer->getBlock();
if ($block instanceof Mage_Cms_Block_Block) {
    // Make your changes here
}

Cela fonctionnerait pour tous les blocs, mais si vous savez que cela ne se produit que dans quelques cas, je suggérerais de modifier le modèle via la mise en page XML.

Ou si vous souhaitez ajouter quelque chose à un bloc mais laisser l'original tel quel, vous pouvez utiliser le core_block_abstract_to_html_after obtenir le transport transmis à l'événement.Ensuite, récupérez le code HTML et ajoutez ce dont vous avez besoin.Encore une fois, cet événement vous donne le blocage afin que vous puissiez limiter votre code si simplement Mage_Cms_Block_Block

$block = $observer->getBlock();
if ($block instanceof Mage_Cms_Block_Block) {
    $transport = $observer->getTransport();
    $html = $transport->getHtml();
    $html .= 'We need to append something here';
    $transport->setHtml($html);
}

Pour autant que je me souvienne, vous pouvez obtenir tous les blocs sous forme de collection ou sous forme de tableau à partir de la mise en page, puis effectuer une boucle en vérifiant leur type à l'aide de l'opérateur " instance de ".

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top