Pregunta

Esto realmente me confunde !!

Llegué a una situación en la que necesito para crear un nuevo bloque (core/template bloque) mediante programación, si no se CMS de Bloques presentes en un diseño de página.En el caso general, de acuerdo a mi conocimiento, hay dos trabajo alrededor de este.

1.Añadir un bloque a través del diseño

En la mayoría de los casos, esta sería la mejor idea para hacer esta tarea.Podemos añadir un bloque a una página si una disposición adecuada de manejar está disponible.Pero, por desgracia, en mi caso, yo no tengo ningún bloque estático de diseño específicos de mango disponible (para páginas de cms, sabemos que hay cms_page el asa).Así que no se puede confiar en este método

2.El uso de un observador

El segundo método sería escuchar a una adecuada calidad de observador.De nuevo, no puedo encontrar un bloque estático basado en observador que activar durante la presentación/bloque de tiempo de carga.Sin embargo, hay algunos observadores de que puedo confiar en.Creo controller_action_layout_generate_blocks_before se puede usar en mi caso.Pero aquí estoy frente a mi verdadero problema

Mi Problema real

Así que cuando yo uso controller_action_layout_generate_blocks_before en mi caso, el problema es que no puedo acceder a los bloques en función de su tipo.Puedo filtrar bloques según su name, pero no se basa en sus type.es decir

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

De los que no puedo confiar en los nombres de hecho. Porque quiero llegar a todos cms/block tipo de bloques y añadir una nueva plantilla después de la comprobación de algunas de sus propiedades personalizadas que he puesto con bloque estático

Así que ¿cómo puedo obtener todos los cms/block a través de un observador ?Es incluso posible.Por favor comparta sus pensamientos.

¿Fue útil?

Solución

El uso de este:

           <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>

Observador:

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

Consulte protected function _toHtml() de la Mage_Cms_Block_Block si usted quiere hacer algunos cambios.

Actualización (otra solución)

    <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);
            }
        }
    }

Otros consejos

¿No podría simplemente escuchar el evento core_block_abstract_to_html_before a continuación, compruebe el tipo de bloque en el evento y actualización de la plantilla en función de esto?Algo similar a lo siguiente debería hacerlo.

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

Esto funciona para todos los bloques, pero si usted sabe decir que esto sólo ocurre en algunos casos, entonces yo sugeriría cambiar la plantilla a través de layout xml.

O si quieres agregar algo a un bloque, pero dejar a la original ya que se podría utilizar el core_block_abstract_to_html_after obtener la transport pasa al evento.A continuación, obtener el código html set en contra de este y anexar lo que usted necesita.De nuevo este evento le da el bloque, por lo que puede limitar su código, así que simplemente 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);
}

Que yo recuerde, usted puede conseguir todos los bloques como una colección o como una matriz desde el diseño de un bucle a través de la comprobación de su tipo de uso de "instancia" del operador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top