superjmt Posted April 20, 2011 Share Posted April 20, 2011 bonjourtout 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 exemplesje cherche à overrider la classe Product.php et à rajouter un champ qui disons va s'appeler totocomment redefenir et faut il redefinir la methode getFields()?Idem pour le fieldsValidate?merci Link to comment Share on other sites More sharing options...
superjmt Posted April 20, 2011 Author Share Posted April 20, 2011 bon j'ai trouvé pour le getField il faut bien le redefinir dans la sous classepar 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 More sharing options...
Sparrow Posted June 13, 2011 Share Posted June 13, 2011 Bonjour,Je suis dans le même genre de cas que vous...Avez vous trouvé une solution pour mettre à jour l'attribut protected $fieldsValidate ?En vous remerciant par avance. Link to comment Share on other sites More sharing options...
superjmt Posted June 13, 2011 Author Share Posted June 13, 2011 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 More sharing options...
Broceliande Posted June 13, 2011 Share Posted June 13, 2011 Il reste tout de même un incohérence de taille, Car tu as modifié une classe native en dur pour faire tourner une override , c'est tordu non ? :sDans ce cas autant faire une override pour ObjectModel également ? Link to comment Share on other sites More sharing options...
Broceliande Posted June 13, 2011 Share Posted June 13, 2011 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 More sharing options...
superjmt Posted June 13, 2011 Author Share Posted June 13, 2011 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 More sharing options...
Broceliande Posted June 13, 2011 Share Posted June 13, 2011 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 More sharing options...
superjmt Posted September 20, 2011 Author Share Posted September 20, 2011 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now