Pregunta

Esta podría ser una pregunta estúpida :)Mage_Customer_Model_Convert_Parser_Customer tiene el siguiente método:

protected $_collections;

public function getCollection($storeId)
{
    if (!isset($this->_collections[$storeId])) {
        $this->_collections[$storeId] = Mage::getResourceModel('customer/customer_collection');
        $this->_collections[$storeId]->getEntity()->setStore($storeId);
    }
    return $this->_collections[$storeId];
}

Estoy escribiendo un observador personalizado. Emulo el código anterior de la siguiente manera:

class Jongosi_Module_Model_Observer
{
    protected $_collections;
    public function getCustomerCollection($storeId = 1)
    {
        if (!isset($this->_collections[$storeId])) {
            $this->_collections[$storeId] = Mage::getResourceModel('customer/customer_collection');
            $this->_collections[$storeId]->getEntity()->setStore($storeId);
        }
        return $this->_collections[$storeId];
    }
}

Obviamente, mi clase no extiende nada. Recibo el siguiente error de instancia:

Call to a member function getEntity() on a non-object in ... on line 8

Pero el objeto está instanciado en la línea 7, ¿sí?

¿Qué no estoy haciendo? Gracias.

~ editar ~

El seguimiento lo hace Sin embargo, trabaja, como era de esperar:

class Jongosi_Module_Model_Observer
{
    protected $_collections;
    public function getCustomerCollection($storeId = 1)
    {
        if (!isset($this->_collections[$storeId])) {
            $test = Mage::getResourceModel('customer/customer_collection');
            foreach ($test as $t) {
                var_dump($t->getData());
            }
        }
        return $this->_collections[$storeId];
    }
}

El observador es llamado por el controller_action_predispatch evento en mi config.xml Archivo de la siguiente manera:

...
<frontend>
    <events>
        <controller_action_predispatch>
            <observers>
                <jongosi_module>
                    <class>jongosi_module/observer</class>
                    <method>getCustomerCollection</method>
                </jongosi_module>
            </observers>
        </controller_action_predispatch>
    </events>
</frontend>
...

Obviamente voy a cambiar el método que se llama, pero estaba comenzando con los pasos de bebé :) Este código es parte de un módulo personalizado.

¿Fue útil?

Solución

Ok, tienes varias cosas que van mal aquí.

Primero, un método de observador tiene uno, y solo un argumento, el objeto observador (generalmente representado por un $observer variable). Entonces tus $storeId variable en realidad tiene un Varien_Event_Observer objeto dentro de él al comienzo de su método. Luego, su código intenta usar ese objeto como clave de matriz.

PHP no permite que los objetos se usen como claves de matriz. Si tiene su sitio en modo desarrollador (en index.php buscar setDeveloperMode) Obtendrías una advertencia ilegal de compensación. Dado que no está en modo desarrollador, PHP se mantiene en silencio sobre el error, pero nada se establece en su matriz.

Todo esto significa $this->_collections[$storeId] devoluciones null, lo que significa

$this->_collections[$storeId]->getEntity()

desencadena un error.

Segundo - ese bit de código de Mage_Customer_Model_Convert_Parser_Customer No parece que esté actual. los getEntity El método devolverá un Mage_Customer_Model_Resource_Customer Objeto, que no tiene setStore método. Entonces, incluso si pudiera ignorar lo anterior, su código aún causará un error.

Tercero: tu observador no hace nada. Devuelve una colección, pero Magento no hace nada con los valores de retorno de los observadores.

Esperemos que eso te ayude a señalar en la dirección correcta para resolver cualquier problema que estés tratando de resolver.

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