Jump to content
Olivier CLEMENCE

[resolu] Un override de $definition qui ne fonctionne pas

Recommended Posts

Bonjour,

je met en place actuellement un override sur la class manufacturer sur une version 1.5.6.

Je fait ça de manière classique et tout marche sans problème sauf l'enregistrement.

 

C'est à dire que si je rempli manuellement mes champs en passant par ma bdd je les vois bien correctement remplis dans mon formulaire dans l'admin par contre, lorsque j'ajoute un nouveau manufacturer ou que j'en édite un déjà existant mes deux nouveaux champs ne sont pas prit en compte.

 

Pourtant j'ai déjà employé cette méthode pour d'autre classe sans problème.

 

Voici mon code:

 

Pour la class manufacturer:

class Manufacturer extends ManufacturerCore
{
	public $link_text;
	public $warranty_desc;
	
	public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)
	{
		
		$this->definition['fields']['link_text'] = array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isCatalogName', 'required' => false, 'size' => 256);
		$this->definition['fields']['warranty_desc'] =array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml');
		parent::__construct($id_product, $full, $id_lang, $id_shop, $context);
	}	
}

Et j'ai bien rajouté mes deux champs dans mon adminManufacturerController (sinon je ne les verrai pas).

 

Donc avec le code ci-dessus ça ne marche pas par contre si je ré-ecrit complètement la variable définition là ça marche (en lecture et ecriture).

	public static $definition = array(
			'table' => 'manufacturer',
			'primary' => 'id_manufacturer',
			'multilang' => true,
			'fields' => array(
					'name' => 				array('type' => self::TYPE_STRING, 'validate' => 'isCatalogName', 'required' => true, 'size' => 64),
					'active' => 			array('type' => self::TYPE_BOOL),
					'date_add' => 			array('type' => self::TYPE_DATE),
					'date_upd' => 			array('type' => self::TYPE_DATE),
	
					// Lang fields
					'description' => 		array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'),
					'short_description' => 	array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml', 'size' => 254),
					'meta_title' => 		array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 128),
					'meta_description' => 	array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
					'meta_keywords' => 		array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName'),
					'link_text' => 			array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 256),
					'warranty_desc' => 		array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'),
			),
	);

Est-ce que quelqu'un pourrait m'expliquer pour quoi ça marche en overridans l'intégralité de la variable $definition et pas si je rajoute juste mes deux champs dans le tableau fields ?.

 

 

 

 

 

 

 

 

 

 

Edited by maniT4c (see edit history)

Share this post


Link to post
Share on other sites

Bonjour,

Dans ce que je vois dans le  code, dans la classe Manufacturer la fonction __construct() surchargée n'est pas la bonne ( A vue de nez c'est celle de la classe Product )
Le nombre de paramètres ne correspond pas.

 

Voici la fonction construct de la classe Manufacturer par défaut

public function __construct($id = null, $id_lang = null)
    {
        parent::__construct($id, $id_lang);

        $this->link_rewrite = $this->getLink();
        $this->image_dir = _PS_MANU_IMG_DIR_;
    }

Ceci peut donc expliquer que la surcharge ne fonctionne pas.

Share this post


Link to post
Share on other sites

Merci herve pour ta réponse très judicieuse car en effet j'ai la mauvaise habitude de faire des copié collé pour gagner du temps.

Du coup tu as raison c'est bien un copié collé d'un override de la classe product.

 

Malheureusement en corrigeant ça ne change rien:

Voici mon nouvel override (qui ne marche donc toujours pas, même symptôme):

public function __construct($id = null, $id_lang = null)
	{	
		parent::__construct($id, $id_lang);
		$this->definition['fields']['link_text'] = array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 256);
		$this->definition['fields']['warranty_desc'] =array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml');
	}

Share this post


Link to post
Share on other sites

La variable $definition étant une variable statique, pour l'override j'utiliserais donc le code suivant :

public function __construct($id = null, $id_lang = null)
	{	
		parent::__construct($id, $id_lang);
		self::$definition['fields']['link_text'] = array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 256);
		self::$definition['fields']['warranty_desc'] =array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml');
	}

( De mon côté j'ai déjà surchargé des classes de cette manière avec succès )

Share this post


Link to post
Share on other sites

Merci pour ta réponse, là encore tu as raison... malheureusement ça ne marche toujours pas !!, toujours le même symptome (lecture pas de problème enregistrement ignoré uniquement sur ces deux champs).

Pourtant le code me paraît correcte.

Définition est  initialisé par la classe parent via le parent::_construct puis overridé.

Share this post


Link to post
Share on other sites

Essaye peu-être avec la fonction __construct après la mise à jour des paramètres.

+ supprimer le fichier d'index des classes.
 

public function __construct($id = null, $id_lang = null)
	{		
		self::$definition['fields']['link_text'] = array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 256);
		self::$definition['fields']['warranty_desc'] =array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml');
                parent::__construct($id, $id_lang);
	}
  • Like 1

Share this post


Link to post
Share on other sites

Ah oui c'est ça !!! et c'est logique car la variable definition est sans doute initialisée par le constructeur initial (object) du coup il ne reprend pas les infos que j'ajoute ensuite.

 

Merci, pour ta patience ! 

Share this post


Link to post
Share on other sites

Parfait c'est donc un problème réglé :-) !
Un peu laborieux mais on a fini par trouver

Share this post


Link to post
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...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More