Jump to content

Problema en el cambio de estado de pedido (PrestashopException)


Recommended Posts

Buenas tardes a todos,

 

Hace unos días estoy teniendo unos problemas un tanto pesados con prestashop. El caso es que al hacerme pruebas a mi misma sobre los pedidos, una vez compro, desde el BO cambio el estado del pedido y me sale este error interno:

 

 

[PrestaShopException]

object can't be loaded

at line 1228 in file controllers/admin/AdminOrdersController.php

 

1222.

1223. public function renderView()

1224. {

1225. $order = new Order(Tools::getValue('id_order'));

1226. if (!Validate::isLoadedObject($order))

1227. throw new PrestaShopException('object can\'t be loaded');

1228.

1229. $customer = new Customer($order->id_customer);

1230. $carrier = new Carrier($order->id_carrier);

1231. $products = $this->getProducts($order);

1232. $currency = new Currency((int)$order->id_currency);

  • AdminOrdersControllerCore->renderView - [line 1409 - classes/controller/AdminController.php] - [0 Argument]
     
    1403. elseif ($this->display == 'view')
    1404. {
    1405. // Some controllers use the view action without an object
    1406. if ($this->className)
    1407. $this->loadObject(true);
    1408. $this->content .= $this->renderView();
    1409. }
    1410. elseif (!$this->ajax)
    1411. {
    1412.
    1413. $this->content .= $this->renderList();

  • AdminControllerCore->initContent - [line 167 - classes/controller/Controller.php] - [0 Argument]
     
    161.
    162. if (!$this->content_only && ($this->display_header || (isset($this->className) && $this->className)))
    163. $this->initHeader();
    164.
    165. if ($this->viewAccess())
    166. $this->initContent();
    167. else
    168. $this->errors[] = Tools::displayError('Access denied.');
    169.
    170. if (!$this->content_only && ($this->display_footer || (isset($this->className) && $this->className)))
    171. $this->initFooter();

  • ControllerCore->run - [line 348 - classes/Dispatcher.php] - [0 Argument]
     
    342. // Execute hook dispatcher
    343. if (isset($params_hook_action_dispatcher))
    344. Hook::exec('actionDispatcher', $params_hook_action_dispatcher);
    345.
    346. // Running controller
    347. $controller->run();
    348. }
    349. catch (PrestaShopException $e)
    350. {
    351. $e->displayMessage();
    352. }

  • DispatcherCore->dispatch - [line 50 - admin07091967/index.php] - [0 Argument]
     
    44. $_POST['controller'] = strtolower($_POST['tab']);
    45. if (!isset($_REQUEST['controller']) && isset($_REQUEST['tab']))
    46. $_REQUEST['controller'] = strtolower($_REQUEST['tab']);
    47.
    48. // Prepare and trigger admin dispatcher
    49. Dispatcher::getInstance()->dispatch();

 

 

Y mi segunda duda es que antes de que me saliera esto, conseguí hacer algunos pedidos pero (mi tienda es de productos descargables) al enviarse el mail al cliente con el enlace del producto me sale aquello de [nbproducts]...[virtualproducts].

Ya he visto que en el foro hay la solución aquélla de cambiar una línea de la plantilla download_product y ya lo he hecho, me funcionó una vez y ya no vuelve a funcionar.

 

¿ Alguien me puede dar una solución para estos dos problemas :( ? Estaría muy agradecida :wub:

 

Saludos!

Link to comment
Share on other sites

  • 4 weeks later...

Hola Melanie, conseguiste arreglarlo?.

 

A mi me está pasando exactamente lo mismo, con productos descargables porque con los productos físicos es curioso porque lo acabo de probar y no pasa.

 

Gracias y un saludo.

 

 

 

Hola! sí! conseguí "medio" solucionarlo. Cambié la línea del archivo download_product, y luego sólo puse esta plantilla en el estado de pedido "enviado" es decir, cuando tu le des la orden de "enviado" el cliente curiosamente sí recibe el enlace del producto. De otra forma, si pones esta plantilla en otro estado sigue saliendo aquello de virtualproducts... Prueba a ver qué tal.

 

Luego por otra parte, todo el mensaje de error ya descubrí porqué salía, y era que estaba llamando a un archivo que NO existía. Resultaba que un archivo se había modificado el nombre y cambiado los permisos. Seguro que lo cambié yo trasteando y luego no me acordé de volver a dejarlo como estaba.

 

Ya me contarás a ver qué tal.

 

Saludos!

Link to comment
Share on other sites

Hola! sí! conseguí "medio" solucionarlo. Cambié la línea del archivo download_product, y luego sólo puse esta plantilla en el estado de pedido "enviado" es decir, cuando tu le des la orden de "enviado" el cliente curiosamente sí recibe el enlace del producto. De otra forma, si pones esta plantilla en otro estado sigue saliendo aquello de virtualproducts... Prueba a ver qué tal.

 

Luego por otra parte, todo el mensaje de error ya descubrí porqué salía, y era que estaba llamando a un archivo que NO existía. Resultaba que un archivo se había modificado el nombre y cambiado los permisos. Seguro que lo cambié yo trasteando y luego no me acordé de volver a dejarlo como estaba.

 

Ya me contarás a ver qué tal.

 

Saludos!

 

Hola Melanie,

 

al final desinstalé la versión 1.5.4 e instalé la anterior 1.5.3.1 y funciona perfectamente, así que no le doy más vueltas.

 

Gracias de todas formas. Un saludo.

Link to comment
Share on other sites

  • 2 weeks later...

/**
* @deprecated : these defines are going to be deleted on 1.6 version of Prestashop
* USE : Configuration::get() method in order to getting the id of order state
*/
define('_PS_OS_PREPARATION_', Configuration::get('PS_OS_PREPARATION'));
define('_PS_OS_CHEQUE_',	  Configuration::get('PS_OS_CHEQUE'));
define('_PS_OS_PAYMENT_',	 Configuration::get('PS_OS_PAYMENT'));
define('_PS_OS_SHIPPING_',	Configuration::get('PS_OS_SHIPPING'));
define('_PS_OS_DELIVERED_',   Configuration::get('PS_OS_DELIVERED'));
define('_PS_OS_CANCELED_',	Configuration::get('PS_OS_CANCELED'));
define('_PS_OS_REFUND_',	  Configuration::get('PS_OS_REFUND'));
define('_PS_OS_ERROR_',	   Configuration::get('PS_OS_ERROR'));
define('_PS_OS_OUTOFSTOCK_',  Configuration::get('PS_OS_OUTOFSTOCK'));
define('_PS_OS_BANKWIRE_',	Configuration::get('PS_OS_BANKWIRE'));
define('_PS_OS_PAYPAL_',	  Configuration::get('PS_OS_PAYPAL'));
define('_PS_OS_WS_PAYMENT_', Configuration::get('PS_OS_WS_PAYMENT'));
/* Get smarty */
require_once(dirname(__FILE__).'/smarty.config.inc.php');
$context->smarty = $smarty;

 

Esto es lo que sale en mi caso, si uso el "vendedor de la tienda sale" PREPARATION (el primero que está arriba)

 

Ahora en el Controlador de la órdenes sale esto

/**
 * Assign template vars related to page content
 * @see FrontController::initContent()
 */
public function initContent()
{
 parent::initContent();
 $this->context->smarty->assign(array(
  'is_guest' => $this->context->customer->is_guest,
  'HOOK_ORDER_CONFIRMATION' => $this->displayOrderConfirmation(),
  'HOOK_PAYMENT_RETURN' => $this->displayPaymentReturn()
 ));
 if ($this->context->customer->is_guest)
 {
  $this->context->smarty->assign(array(
'id_order' => $this->id_order,
'reference_order' => $this->reference,
'id_order_formatted' => sprintf('#%06d', $this->id_order),
'email' => $this->context->customer->email
  ));
  /* If guest we clear the cookie for security reason */
  $this->context->customer->mylogout();
 }
 $this->setTemplate(_PS_THEME_DIR_.'order-confirmation.tpl');
}

 

Y en el tpl lo siguiente:

{capture name=path}{l s='Confirmación de su Pedido'}{/capture}
{include file="$tpl_dir./breadcrumb.tpl"}
<h1>{l s='Confirmación de su Pedido'}</h1>
{assign var='current_step' value='payment'}
{include file="$tpl_dir./order-steps.tpl"}
{include file="$tpl_dir./errors.tpl"}
{$HOOK_ORDER_CONFIRMATION}
{$HOOK_PAYMENT_RETURN}
<br />
{if $is_guest}
<p>{l s='Número de Pedido:'} <span class="bold">{$id_order_formatted}</span> . {l s='El Número de su pedido se envió mediante e-mail.'}</p>
<a href="{$link->getPageLink('guest-tracking', true, NULL, "id_order={$reference_order}&email={$email}")}" title="{l s='Follow my order'}"><img src="{$img_dir}icon/order.gif" alt="{l s='Follow my order'}" class="icon" /></a>
<a href="{$link->getPageLink('guest-tracking', true, NULL, "id_order={$reference_order}&email={$email}")}" title="{l s='Follow my order'}">{l s='Follow my order'}</a>
{else}
<a href="{$link->getPageLink('history', true)}" title="{l s='Back to orders'}"><img src="{$img_dir}icon/order.gif" alt="{l s='Back to orders'}" class="icon" /></a>
<a href="{$link->getPageLink('history', true)}" title="{l s='Back to orders'}">{l s='Back to orders'}</a>
{/if}

 

No se me ocurre como hacer siempre que sea cliente o el cliente interno salga el mismo estado, y que cmabia cada vez que eligen CASH ON DELIVERY o BANKWIRE, necesito que siempre sea el mismo estado.

 

Me fui buscando ahora en Vlidation de CashonDelivery

// Check that this payment option is still available in case the customer changed his address just before the end of the checkout process
 $authorized = false;
 foreach (Module::getPaymentModules() as $module)
  if ($module['name'] == 'cashondelivery')
  {
$authorized = true;
break;
  }
 if (!$authorized)
  die(Tools::displayError('This payment method is not available.'));
 $customer = new Customer($this->context->cart->id_customer);
 if (!Validate::isLoadedObject($customer))
  Tools::redirectLink(__PS_BASE_URI__.'order.php?step=1');
 if (Tools::getValue('confirm'))
 {
  $customer = new Customer((int)$this->context->cart->id_customer);
  $total = $this->context->cart->getOrderTotal(true, Cart::BOTH);
  $this->module->validateOrder((int)$this->context->cart->id, Configuration::get('PS_OS_PREPARATION'), $total, $this->module->displayName, null, array(), null, false, $customer->secure_key);
  Tools::redirectLink(__PS_BASE_URI__.'order-confirmation.php?key='.$customer->secure_key.'&id_cart='.(int)$this->context->cart->id.'&id_module='.(int)$this->module->id.'&id_order='.(int)$this->module->currentOrder);
 }
}

 

Según ese código está set el template de PREPARATION, para CASH ON DELIVERY Y está bien, ahora veré el de BANK WIRE. Pero el que creé yo como estado no sale la definición, así que iré a la BD a Verla....

 

Me di cuenta que LOS ID que aparecen están asociados en el caso a MóDulos, en mi caso el ID 10 se asocia a bankWire, por lo que cambié el modulo al ID que necesitaba como BANK WIRE. Ahora eso tampoco sirvió. Eso quiere decir que uno de los archivos está usando el template de Bank Wire como referencia.

 

Encontré en esta línea:

 $this->module->validateOrder($cart->id, Configuration::get('PS_OS_BANKWIRE'), $total, $this->module->displayName, NULL, $mailVars, (int)$currency->id, false, $customer->secure_key);

Edited by Xzelot (see edit history)
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...