Jump to content

Override


Recommended Posts

bonjour
tout d'abord y a t'il une documentation claire sur le mécanisme de l'override?
ca serait un peu bête d'avoir mis cet outil puissant à la destination des développeurs sans le documenter un tant soi peu avec 2 ou 3 exemples

je cherche à overrider la classe Product.php et à rajouter un champ qui disons va s'appeler toto
comment redefenir et faut il redefinir la methode getFields()?
Idem pour le fieldsValidate?

merci

Link to comment
Share on other sites

bon j'ai trouvé pour le getField il faut bien le redefinir dans la sous classe
par contre comment modifier les attributs protected de la classe parent pour les compléter?
donc dans mon cas comment mettre à jour l'attribut $fieldsValidate ?

Link to comment
Share on other sites

  • 1 month later...

oui j'ai trouvé une solution mais c'est chaud

<?php
class Product extends ProductCore
{

/*** paiement à afficher (true) ou pas (false) ***/
   /** par défaut à afficher ***/
   public $paiementafficher=true;

   //**franco de port**/
   //*par défaut non **//
   public $francodeport=false;


   protected function getFieldsValidate()
   {
       return array_merge($this->fieldsValidate,array('paiementafficher' => 'isBool',
       'francodeport' => 'isBool'));
   }

   public function getFields()
   {
       //print_r($this->getFieldsValidate());
       $fields=parent::getFields();
       $fields['paiementafficher'] = $this->paiementafficher;

       $fields['francodeport'] = $this->francodeport;

       return $fields;
   }



}
?>


et j'ai modifié la classe ObjectModel.php j'ai rajouté

if (method_exists($this, 'getFieldsValidate'))
           $this->fieldsValidate=$this->getFieldsValidate();



vers la ligne 142

Link to comment
Share on other sites

En fait, j'ai pris le temps de te faire un exemple tout con avec tes deux champs, en me disant que ça servira peut être à d'autres.

dans le principe de la classe étendue , il te suffit de redéfinir entièrement la variable que tu veux altérer (à moins qu'elle ne soit private) . Dans ton cas c'est $fieldsValidate .


Dans ton cas , ceci suffisait , et il n'était pas nécessaire de modifier ObjectModel :



class Product extends ProductCore{

   /*** paiement à afficher (true) ou pas (false) ***/
   /** par défaut à afficher ***/
   public $paiementafficher=true;

   //**franco de port**/
   //*par défaut non **//
   public $francodeport=false;

   protected $fieldsValidate = array(
           'id_tax_rules_group' => 'isUnsignedId',
           'id_manufacturer' => 'isUnsignedId',
           'id_supplier' => 'isUnsignedId',
           'id_category_default' => 'isUnsignedId',
           'id_color_default' => 'isUnsignedInt', /* unsigned integer because its value could be 0 if the feature is disabled */
           'minimal_quantity' => 'isUnsignedInt',
           'price' => 'isPrice',
           'additional_shipping_cost' => 'isPrice',
           'wholesale_price' => 'isPrice',
           'on_sale' => 'isBool',
           'online_only' => 'isBool',
           'ecotax' => 'isPrice',
           'unit_price' => 'isPrice',
           'unity' => 'isString',
           'reference' => 'isReference',
           'supplier_reference' => 'isReference',
           'location' => 'isReference',
           'width' => 'isUnsignedFloat',
           'height' => 'isUnsignedFloat',
           'depth' => 'isUnsignedFloat',
           'weight' => 'isUnsignedFloat',
           'out_of_stock' => 'isUnsignedInt',
           'quantity_discount' => 'isBool',
           'customizable' => 'isUnsignedInt',
           'uploadable_files' => 'isUnsignedInt',
           'text_fields' => 'isUnsignedInt',
           'active' => 'isBool',
           'available_for_order' => 'isBool',
           'condition' => 'isGenericName',
           'show_price' => 'isBool',
           'ean13' => 'isEan13',
           'upc' => 'isUpc',
           'indexed' => 'isBool',
           'cache_is_pack' => 'isBool',
           'cache_has_attachments' => 'isBool',
           'paiementafficher'  => 'isBool',
           'francodeport'  => 'isBool'
   );
   public function getFields()
   {
       $fields=parent::getFields();

       $fields['paiementafficher'] = $this->paiementafficher;
       $fields['francodeport'] = $this->francodeport;

       return $fields;
   }
}

?>

Link to comment
Share on other sites

autant pour moi....oui c'est vrai autant faire un override pour modifier la classe... mais j'ai pas cherché midi à 14h00 j'etais pressé

ta solution est plus simple mais il faut reprendre tous les champs copier coller etc etc la mienne permet de s'affranchir de çà et marchera pour tous les objets lol

Link to comment
Share on other sites

autant pour moi....oui c'est vrai autant faire un override pour modifier la classe... mais j'ai pas cherché midi à 14h00 j'etais pressé

ta solution est plus simple mais il faut reprendre tous les champs copier coller etc etc la mienne permet de s'affranchir de çà et marchera pour tous les objets lol


J'entends bien , ce que tu as fais est applicable à n'importe quelle classe étendue de ObjectModel.

Mais ce faisant , tu as omis le fait que à la base , l'override est faite pour ne pas toucher aux classes natives...

Donc pour le coup , pour que ton post soit complet , il faudrait aussi faire l'override de ObjectModel . Mais j'ai posté pour répondre a plusieurs , puisque toi , tu as trouvé ta solution... et sauront ils aller jusqu'à faire l'override d' ObjectModel ?

Donc ok c'est pratique, mais ça n'explique pas qu'une classe héritée ne peut accèder à la propriété de la classe parente , et que si on veut changer cette propriété , alors il faut la redéfinir entièrement , et j'ai vu passer trop souvent l'erreur.

En prime , la classe overriden que j'ai collé se suffit à elle même ,
Ca vaut bien un copier/coller non ;)
Link to comment
Share on other sites

  • 3 months later...

voilà après avoir encore cherché j'ai trouvé la solution suivante :

on ne touche à rien dans le coeur de prestashop et le code reste entièrement compatible avec les futures évolutions

 

<?php

class Product extends ProductCore

{

 

/*** paiement à afficher (true) ou pas (false) ***/

/** par défaut à afficher ***/

public $paiementafficher=true;

 

//**franco de port**/

//*par défaut non **//

public $francodeport=false;

 

 

public function getFields()

{

//print_r($this->getFieldsValidate());

$fields=parent::getFields();

$fields['paiementafficher'] = $this->paiementafficher;

 

$fields['francodeport'] = $this->francodeport;

 

return $fields;

}

 

public function __construct($id_product = NULL, $full = false, $id_lang = NULL)

{

parent::__construct($id_product, $full, $id_lang);

$this->fieldsValidate=array_merge($this->fieldsValidate,array('paiementafficher' => 'isBool',

'francodeport' => 'isBool'));

 

}

 

 

 

 

}

?>

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