Jump to content

[résolu] override bug ?


Recommended Posts

Salut,

 

Après avoir pas mal galérer pour faire un override sur le fichier AuthController.php.

J'ai fait tout ce qui est ecrit dans le manuel et ensuite tout ce que j'ai pus trouver sur le net.

Bref, après pas mal d'essais je me suis aperçus que l'ecriture dans le fichier:

Prestashop/cache/class_index.php etait inversé.

pour être plus clair le systeme ecrit:

 

'AuthController' => 'override/controllers/front/AuthController.php',
'AuthControllerCore' => 'controllers/front/AuthController.php',

 

Et dans ce cas mon override ne fonctionne pas :(

 

Si je modifie à la main:

 

  
'AuthControllerCore' => 'controllers/front/AuthController.php',
'AuthController' => 'override/controllers/front/AuthController.php',

 

Dans ce cas mon override fonctionne !

 

Ma question est la suivante, c'est normal comme comportement ou c'est un bug ?

Merci de m'eclairer.

@+

pdriss

 

Ps: j'oubliais je suis sur prestashop 1.5.4.1

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

Pas de problème :)

class AuthController extends AuthControllerCore
{
/**
 * Start forms process
 * @see FrontController::postProcess()
 */
public function postProcess()
{
 if (Tools::isSubmit('SubmitCreate'))
  $this->processSubmitCreate();
 if (Tools::isSubmit('submitAccount') || Tools::isSubmit('submitGuestAccount'))
  $this->processSubmitAccount();
 if (Tools::isSubmit('SubmitLogin'))
  $this->processSubmitLogin();

 if (Tools::isSubmit('SubmitLoginVip'))
  $this->processSubmitLoginVip();
}
/**
 * Process login vip
 */
protected function processSubmitLoginVip()
{
 Hook::exec('actionBeforeAuthentication');
 $passwd = trim(Tools::getValue('passwd'));
 $email = trim(Tools::getValue('email'));
 if (empty($email))
  $this->errors[] = Tools::displayError('An email address required.');
 elseif (!Validate::isEmail($email))
  $this->errors[] = Tools::displayError('Invalid email address.');
 elseif (empty($passwd))
  $this->errors[] = Tools::displayError('Password is required.');
 elseif (!Validate::isPasswd($passwd))
  $this->errors[] = Tools::displayError('Invalid password.');
 else
 {
  $customer = new Customer();
  $authentication = $customer->getByEmail(trim($email), trim($passwd));
  if (!$authentication || !$customer->id)
   $this->errors[] = Tools::displayError('Authentication failed.');
  else
  {
   $this->context->cookie->id_compare = isset($this->context->cookie->id_compare) ? $this->context->cookie->id_compare: CompareProduct::getIdCompareByIdCustomer($customer->id);
   $this->context->cookie->id_customer = (int)($customer->id);
   $this->context->cookie->customer_lastname = $customer->lastname;
   $this->context->cookie->customer_firstname = $customer->firstname;
   $this->context->cookie->logged = 1;
   $customer->logged = 1;
   $this->context->cookie->is_guest = $customer->isGuest();
   $this->context->cookie->passwd = $customer->passwd;
   $this->context->cookie->email = $customer->email;

   // Add customer to the context
   $this->context->customer = $customer;

   if (Configuration::get('PS_CART_FOLLOWING') && (empty($this->context->cookie->id_cart) || Cart::getNbProducts($this->context->cookie->id_cart) == 0) && $id_cart = (int)Cart::lastNoneOrderedCart($this->context->customer->id))
 $this->context->cart = new Cart($id_cart);
   else
   {
 $this->context->cart->id_carrier = 0;
 $this->context->cart->setDeliveryOption(null);
 $this->context->cart->id_address_delivery = Address::getFirstCustomerAddressId((int)($customer->id));
 $this->context->cart->id_address_invoice = Address::getFirstCustomerAddressId((int)($customer->id));
   }
   $this->context->cart->id_customer = (int)$customer->id;
   $this->context->cart->secure_key = $customer->secure_key;
   $this->context->cart->save();
   $this->context->cookie->id_cart = (int)$this->context->cart->id;
   $this->context->cookie->write();
   $this->context->cart->autosetProductAddress();
   Hook::exec('actionAuthentication');
   // Login information have changed, so we check if the cart rules still apply
   CartRule::autoRemoveFromCart($this->context);
   CartRule::autoAddToCart($this->context);
   if (!$this->ajax)
   {
 if ($back = Tools::getValue('back'))
 Tools::redirect(html_entity_decode($back));
 Tools::redirect('index.php?id_category=10&controller='.(($this->authRedirection !== false) ? url_encode($this->authRedirection) : 'category'));
   }
  }
 }
 if ($this->ajax)
 {
  $return = array(
   'hasError' => !empty($this->errors),
   'errors' => $this->errors,
   'token' => Tools::getToken(false)
  );
  die(Tools::jsonEncode($return));
 }
 else
  $this->context->smarty->assign('authentification_error', $this->errors);
}
}

Link to comment
Share on other sites

1- et ce fichier est bien www.ta_boutique/override/controllers/front/AuthController.php ?

 

2- si tu reprends toute un fonction parent, met par exemple:

public function postProcess()
{
 parent::postProcess();

 if (Tools::isSubmit('SubmitLoginVip'))
  $this->processSubmitLoginVip();
}

 

3- pour moi ceci me semble bon:

'AuthController' => 'override/controllers/front/AuthController.php',
 'AuthControllerCore' => 'controllers/front/AuthController.php',

  • Like 1
Link to comment
Share on other sites

Alors, pour commencer merci de t'interesser au problème.

 

1- et ce fichier est bien www.ta_boutique/override/controllers/front/AuthController.php ?

 

Oui, bien sur :)

 

2- si tu reprends toute un fonction parent, met par exemple:

public function postProcess()
{
 parent::postProcess();

 if (Tools::isSubmit('SubmitLoginVip'))
  $this->processSubmitLoginVip();
}

 

Cool, merci pour l'astuce, je pensais qu'il fallait reprendre la totalité de la fonction à modifié...

 

3- pour moi ceci me semble bon:

'AuthController' => 'override/controllers/front/AuthController.php',
 'AuthControllerCore' => 'controllers/front/AuthController.php',

 

Pour moi, c'est pas qu'il me semble mauvais c'est qu'il ne fonctionne pas :)

 

Vu le nombre de post ou il y a des problèmes avec l'override sur la derniere version, je me disais aussi que si le fichier est lu dans "l'ordre", alors les modifs de l'override sont lu avant le fichier "core", non ?

 

Si tu test avec un fichier .tpl qui contient le formulaire suivant:

<form action="{$link->getPageLink('authentication', true)}" method="post" id="login_form" class="std">
 <fieldset>
  <div class="form_content clearfix">
<p class="text">
 <label for="email">{l s='Email address'}</label>
 <span><input type="text" id="email" name="email" value="[email protected]" class="account_input" /></span>
</p>
<p class="text">
 <label for="passwd">{l s='Password'}</label>
 <span><input type="password" id="passwd" name="passwd" value="[email protected]" class="account_input" /></span>
</p>
<p class="submit">
 {if isset($back)}<input type="hidden" class="hidden" name="back" value="{$back|escape:'htmlall':'UTF-8'}" />{/if}
 {if isset($return) && $return != ''}<input type="hidden" name="return" value="{$return}" />{/if}
 <input type="submit" id="SubmitLoginVip" name="SubmitLoginVip" class="button" value="{l s='Log in'}" />
</p>
  </div>
 </fieldset>
</form>

 

Qui appel la fonction processSubmitLoginVip de l'override, tu verras que ca ne fonctionne pas :(

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

Vu le nombre de post ou il y a des problèmes avec l'override sur la derniere version, je me disais aussi que si le fichier est lu dans "l'ordre", alors les modifs de l'override sont lu avant le fichier "core", non ?

 

 

non par ce que tu as : class AuthController extends AuthControllerCore

je ne suis pas au courant de problème avec l'override, au contraire ça fonctionne très bien, comparé à la 1.4 il n'y a pas photo

Edited by coeos.pro (see edit history)
Link to comment
Share on other sites

As tu supprimer le fichier class_index.php pour qu'il soit à nouveau généré ?

 

Comme le dit coeos.pro l'ordre ne semble pas faux, tu fait un override d'une classe donc dans tous les cas c'est ton override qui sera considéré en premier (quelque soit l'ordre dans le class_index.php).

  • Like 1
Link to comment
Share on other sites

As tu supprimer le fichier class_index.php pour qu'il soit à nouveau généré ?

 

Oui, mais ca n'as rien changer :(

Je viens de le refaire et MIRACLE, ca marche !!

Serais ce parce que j'ai modifier la fonction postProcess(), comme preconiser par coeos.pro ?

 

 

Comme le dit coeos.pro l'ordre ne semble pas faux, tu fait un override d'une classe donc dans tous les cas c'est ton override qui sera considéré en premier (quelque soit l'ordre dans le class_index.php).

 

Ok je ne dis pas le contraire, je cherche juste à comprendre...

Comme je l'ai dis je ne m'y connait pas assez pour contredire qui que ce soit, je suis juste un marchand qui "Bidouille".

En tout cas merci de votre aide

@+

pdriss

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

A moins que ce soit la memoire du navigateur (bien que je teste sur I.E et FF), je vide systematiquement tout les caches de PS, mais j'etais tomber sur un post ou il avait un prob similaire, c'est d'ailleur celui-ci qui mavait donner l'idée de "farfouiller" dans le fichier class_index.php.

Bref, l'important c'est que ca marche.

Merci de votre aide.

@+

Pdriss

Ps: je ne suis pas la pendant 4 jours, donc vous inquietez pas si je ne repond pas de suite :)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...