2015-09-20 8 views
0

Я новичок в Magento и в настоящее время проблема с кнопкой «Заказ места», не работает. Проблема возникает только при входе в мою учетную запись, но если я сделаю покупку, поскольку гость отправит меня на страницу успеха. Я исследовал эту проблему и не отправить мне ответить на этот вопрос, потому что я сделал модуль, который посылает мне следующее сообщение:Место Заказ кнопки не работает Magento

Fatal error: Call to a member function getStreet() on a non-object in cellairis/app/code/local/Cellairis/Ciudades/Model/Observer.php on line 28 

Это моя Observer.php. Это выглядит хорошо, и я действительно не знаю, где проблема.

<?php 
class Cellairis_Ciudades_Model_Observer { 

    public function __construct() { 

    } 

    public function editAccount(Varien_Event_Observer $observer) { 
     try { 
      $result = Mage::getModel('customer/customer') -> getCollection() -> getLastItem(); 
      $customer = Mage::getModel('customer/customer') -> load($result -> getId()); 

      // API METHOD 
      $method = 'client'; 

      // GET THE EMAIL PARAM 
      $email = $customer -> getEmail(); 

      // PARAMETER TO API 
      $data = array('email' => $email); 

      // CALL HELPER TO CONNECT WITH API 
      $response = Mage::helper('ciudades/connection') -> connectApi($method, 'POST', $data); 
      if (empty($response -> client)) { 
       try { 
        $cliente = 'M' . $result -> getId(); 
        $nombre = $customer -> getFirstname() . ' ' . $customer -> getLastname(); 
        $direccion = $customer -> getDefaultBillingAddress() -> getStreet(1); 
        $delegacion = $customer -> getDefaultBillingAddress() -> getCity(); 
        $colonia = $customer-> getDefaultBillingAddress() -> getStreet(2); 
        $estado = $customer -> getDefaultBillingAddress() -> getRegion(); 
        $pais = $customer -> getDefaultBillingAddress() -> getCountry(); 
        $cp = $customer -> getDefaultBillingAddress() -> getPostcode(); 
        $rfc = $customer -> getDefaultBillingAddress() -> getVatId(); 
        $telefono = $customer -> getDefaultBillingAddress() -> getTelephone(); 

        // IF RESPONSE DOESN'T EXISTS CONNECT WITH WS TO CREATE CUSTOMER IN CELLAIRIS ERP 
        // API METHOD 
        $method = 'createCustomer'; 

        // CREATE ARRAY TO SEND TO WS 
        $data = array(
         'Cliente' => $cliente, 
         'Nombre' => $nombre, 
         'Direccion' => $direccion, 
         'Delegacion' => $delegacion, 
         'Colonia' => $colonia, 
         'Estado' => $estado, 
         'Pais' => $pais, 
         'CodigoPostal' => $cp, 
         'RFC' => $rfc, 
         'Telefonos' => $telefono, 
         'Email' => $email, 
         'Descripcion1' => 'Ecommerce' 
        ); 

        // CALL HELPER TO CONNECT WITH API 
        $createCustomer = Mage::helper('ciudades/connection') -> connectApi($method, 'POST', $data); 
        $customer -> setNoCliente($cliente); 
        $customer -> save(); 
       } catch (Exception $ex) { 
        Mage::log(Mage::app() -> getRequest() -> getRouteName() . "/" . Mage::app() -> getRequest() -> getControllerName() . "/" . Mage::app() -> getRequest() -> getActionName() . " -> Ocurrio un error con el Cliente " . $email . ". ERROR=" . $ex -> getMessage(), Zend_Log::ERR); 
        return false; 
       } 
      } 
     } catch (Exception $e) { 

      Mage::log(Mage::app() -> getRequest() -> getRouteName() . "." . Mage::app() -> getRequest() -> getControllerName() . "." . Mage::app() -> getRequest() -> getActionName() . " > " . $e -> getMessage(), Zend_Log::ERR); 

     } 
    }} 

Я ценю вашу быструю помощь. Благодарю.

+0

исправить код форматирования –

ответ

1

Попробуйте загрузить адрес непосредственно из модели customer/address. Я отредактировал ваш код

Я также отформатировал и отформатировал ваш код.

<?php 

public function editAccount(Varien_Event_Observer $observer) 
{ 

    try { 

     $result = Mage::getModel('customer/customer')->getCollection()->getLastItem(); 
     $customer = Mage::getModel('customer/customer')->load($result->getId()); 

     $customerBillingAddressId = $customer->getDefaultBilling(); 
     $customerBillingAddress = Mage::getModel('customer/address')->load($customerBillingAddressId); //address as object 

     // API METHOD 
     $method = 'client'; 

     // GET THE EMAIL PARAM 
     $email = $customer->getEmail(); 

     // PARAMETER TO API 
     $data = array('email' => $email); 

     // CALL HELPER TO CONNECT WITH API 
     $response = Mage::helper('ciudades/connection')->connectApi($method, 'POST', $data); 
     if (empty($response->client)) { 
      try { 

       $cliente = 'M' . $result->getId(); 
       $nombre = $customer->getFirstname() . ' ' . $customer->getLastname(); 
       $direccion = $customerBillingAddress->getStreet(1); 
       $delegacion = $customerBillingAdress->getCity(); 
       $colonia = $customerBillingAddress->getStreet(2); 
       $estado = $customerBillingAddress->getRegion(); 
       $pais = $customerBillingAddress->getCountry(); 
       $cp = $customerBillingAddress->getPostcode(); 
       $rfc = $customerBillingAddress->getVatId(); 
       $telefono = $customerBillingAddress->getTelephone(); 

       // IF RESPONSE DOESN'T EXISTS CONNECT WITH WS TO CREATE CUSTOMER IN CELLAIRIS ERP 
       // API METHOD 
       $method = 'createCustomer'; 

       // CREATE ARRAY TO SEND TO WS 
       $data = array(
        'Cliente' => $cliente, 
        'Nombre' => $nombre, 
        'Direccion' => $direccion, 
        'Delegacion' => $delegacion, 
        'Colonia' => $colonia, 
        'Estado' => $estado, 
        'Pais' => $pais, 
        'CodigoPostal' => $cp, 
        'RFC' => $rfc, 
        'Telefonos' => $telefono, 
        'Email' => $email, 
        'Descripcion1' => 'Ecommerce' 
       ); 

       // CALL HELPER TO CONNECT WITH API 
       $createCustomer = Mage::helper('ciudades/connection')->connectApi($method, 'POST', $data); 
       $customer->setNoCliente($cliente); 
       $customer->save(); 

      } catch (Exception $ex) { 
       Mage::log(Mage::app()->getRequest()->getRouteName() . "/" . Mage::app()->getRequest()->getControllerName() . "/" . Mage::app()->getRequest()->getActionName() . " -> Ocurrio un error con el Cliente " . $email . ". ERROR=" . $ex->getMessage(), 
        Zend_Log::ERR); 
       return false; 
      } 
     } 
    } catch (Exception $e) { 

     Mage::log(Mage::app()->getRequest()->getRouteName() . "." . Mage::app()->getRequest()->getControllerName() . "." . Mage::app()->getRequest()->getActionName() . " > " . $e->getMessage(), 
      Zend_Log::ERR); 

    } 
} 
+0

'getStreet (1)' действительно действителен: https://github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/core/Mage/Customer/Model /Address/Abstract.php#L106 –

+0

Обновленный ответ. – verheesj

-1

Эта линия, как представляется, проблема:

$customer -> getDefaultBillingAddress() -> getStreet(1) 

Некоторые клиенты не имеют адреса фактуры по умолчанию. Например, новые клиенты, которые еще ничего не заказали, или клиенты, которые удалили все свои адреса в своем аккаунте.

Я предполагаю, что ваш наблюдатель не вызывается для гостевых заказов, потому что он будет ломаться каждый раз, независимо от того, кто вошел в систему. Я не знаю, что должен делать код, но это, вероятно, не то, что вы хотите:

$result = Mage::getModel('customer/customer') -> getCollection() -> getLastItem(); 
    $customer = Mage::getModel('customer/customer') -> load($result -> getId()); 

он загружает всех клиентов в памяти (это означает, что приведет к сбою сервера с большой клиентской базой данных), а затем снова загружает последнюю. Хотя «последний», скорее всего, будет последним зарегистрированным, он не гарантирует конкретного заказа, потому что в коллекции не указан порядок.

+0

'getCollection() -> getLastItem()' не загружает всех клиентов в память? – verheesj

+1

Он делает: https://github.com/OpenMage/magento-mirror/blob/magento-1.9/lib/Varien/Data/Collection.php#L285-L289 –

+1

Вместо этого вы должны использовать 'setOrder()' и 'setPageSize (1)' –

Смежные вопросы