Jump to content

Ajout d'un champ BO pour les produits sur Prestashop 1.5.3


Recommended Posts

Bonjour à tous,

 

Je cherche, depuis un bout de temps maintenant, à ajouter un textarea dans le back-office de mes produits, sur Prestashop 1.5.3.

 

J'avais donc assidûment suivi ce topic : http://www.prestasho...minproductsphp/ mais la manip de Zulian et Paco112 n'a jamais fonctionné pour ma part.

Ce topic étant deserté, j'en crée donc un nouveau.

 

Je souhaite donc rajouter un textarea 'pointsforts', et voici le code que j'ai modifié pour arriver à mes fins :

 

Informations.tpl


<tr>
<td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="pointsforts" type="tinymce" multilang="true"}
<label>{l s='Points forts :'}<br /></label>
<p class="product_description">({l s='Points forts du produit'})</p>
</td>
<td style="padding-bottom:5px;">
{include file="controllers/products/textarea_lang.tpl"
languages=$languages
input_name='pointsforts'
input_value=$product->pointsforts}
<p class="clear"></p>
</td>
</tr>

 

 

Classe Product.php

class Product extends ProductCore
{
public $pointsforts;

public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)
{
  Product::$definition['fields']['pointsforts'] = array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isString');
  parent::__construct($id_product, $full, $id_lang, $id_shop, $context);
}
}

 

 

AdminProductsController.php

Fonction copyFromPost :

$object->available_for_order = (int)Tools::getValue('available_for_order');
$object->pointsforts = Tools::getValue('pointsforts');
$object->show_price = $object->available_for_order ? 1 : (int)Tools::getValue('show_price');

 

Fonction renderForm :

$default_product = new Product();
  $fields_to_copy = array('minimal_quantity',
	   'price',
	   'additional_shipping_cost',
	   'wholesale_price',
	   'on_sale',
	   'online_only',
	   'unity',
	   'unit_price_ratio',
	   'ecotax',
	   'active',
	   'available_for_order',
	   'pointsforts',
	   'available_date',
	   'show_price',
	   'indexed',
	   'id_tax_rules_group',
	   'advanced_stock_management');
  foreach ($fields_to_copy as $field)
$product->$field = $default_product->$field;

 

Fonction initFormInformations :

$product_props = array();
 // global informations
 array_push($product_props, 'reference', 'ean13', 'upc',
 'available_for_order', 'pointsforts', 'show_price', 'online_only',
 'id_manufacturer'
 );

 

Lors de l'enregistrement, j'ai l'erreur suivante :

Une erreur s'est produite pendant la mise à jour de l'objet. product ().

 

Ainsi, même si j'écris en dur dans la base du texte dans ce champ, si je repasse par le BO et que j'enregistre, il est directement effacé.

 

Je précise que j'ai créé mon champ 'pointsforts' dans la table 'PREFIX_product_lang', ce qui est probablement une cause à mon problème. J'ai cependant essayé de créer ce champ dans 'PREFIX_product' mais je n'ai constaté aucune amélioration.

 

Quelqu'un aurait-il des pistes (ou encore mieux, des réponses), pour m'aider à faire fonctionner ceci ?

 

Merci d'avance,

Pauline.

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

Si le champs ajouté est de type " lang = true " alors le tpl doit etre construit de manière à avoir 1 champs par langue :

 

<tr>
<td class="col-left">
	{include file="controllers/products/multishop/checkbox.tpl" field="pointsforts" type="tinymce" multilang="true"}
	<label>{l s='Points forts :'}<br /></label>
	<p class="product_description">({l s='Points forts du produit'})</p>
</td>
<td style="padding-bottom:5px;" class="translatable">
	{foreach from=$languages item=language}
		<div class="lang_{$language.id_lang}" style="{if !$language.is_default}display: none;{/if} float: left;">
			<input size="100" type="text" id="pointsforts_{$language.id_lang}" name="pointsforts_{$language.id_lang}" value="{$product->pointsforts[$language.id_lang]|htmlentitiesUTF8}" style="width: 538px;" />
		</div>
	{/foreach}
	<p class="clear"></p>
</td>
</tr>

 

De plus il n'y a aucune modification à apporter au fichier : AdminProductsController.php

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

J'ai cette erreur

Une erreur s'est produite pendant la mise à jour de l'objet. product ().

pourtant je n'ai rien modifié

Pareil... je travaille sur le sujet ce jour, car ça me prend la tête.

Pour ma part j'essaie d'ajouter une checkbox "store_only" sous la checkbox "online_only". Je reproduit donc partout le comportement de "online_only", mais ça clop pas...

 

Remarque/question :

- lors de la sauvegarde d'un produit, on passe 3x dans copyFromPost.

J'ai déjà eu ce genre de souci avec un module newsletter. Ce module était activé en colonne de droite et désactivé en footer. Malgré le fait qu'il ne soit pas en front, la soumission du form se faisait 2x ! Donc bug, car la première soumission était ok, et la suivante me renvoyait... déjà inscrit... Même souci ici ?

 

SOLUTION ici

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

  • 4 weeks later...

Bonjour,

J'ai lu et tester les tutos mais j'avoue que je sèche !! L'enregistrement ne se fait pas pour un champ descriptionsupp.

Je ai crée le champ dans la table ps_product_lang après description_short.

J'ai mis les informations dans informations.tpl et cela s'affiche correctement.

J'ai mis ceci dans products.php en override

public static $definition = array
...
  /* Lang fields */
...
  'descriptionsupp' =>    array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isString'),

public $var_descriptionsupp
public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)
{
  Product::$definition['fields']['var_descriptionsupp'] = array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isString');
 parent::__construct($id_product, $full, $id_lang, $id_shop, $context);
}

et pour AdminProductsController.php je n'arrive pas à faire l'insertion correcte des données.

Link to comment
Share on other sites

  • 2 weeks later...

Bonjour Webdigit !!!

Une fois de plus, avoir du recul permet d'avancer.

J'ai supprimé la 2ème méthode. Et je n'ai rien modifié dans AdminProductController. J'ai bien le champ descriptionsupp qui s'affiche dans la page de mon produit et le texte ajouté s'enregistre bien dans la table et le champ adéquat.

Merci de m'avoir mis le doigt sur l'erreur.

Link to comment
Share on other sites

Bonjour Webdigit !!!

Une fois de plus, avoir du recul permet d'avancer.

J'ai supprimé la 2ème méthode. Et je n'ai rien modifié dans AdminProductController. J'ai bien le champ descriptionsupp qui s'affiche dans la page de mon produit et le texte ajouté s'enregistre bien dans la table et le champ adéquat.

Merci de m'avoir mis le doigt sur l'erreur.

You're welcome :) Moi aussi je rencontre cela parfois, car quand on est trop dedans, on ne vois plus l'essentiel :) Content d'avoir pu aider :)

Link to comment
Share on other sites

  • 2 weeks later...

Bonjour,

J'ajoute un petit plus :-)

En ajoutant mon champ texte supplémentaire, je voulais lors de mes imports csv pouvoir remplir ce champ !!!

Chose faite !!

Il suffit de dupliquer chaque ligne concernant "description" et remplacer "description" par "descriptionsupp" puis de préciser que le champ s'appelle "Description Supplémentaire" et hop c'est importé !!

Link to comment
Share on other sites

  • 4 weeks later...
  • 3 weeks later...

Bonjour ,

 

Pour ma part j'ai ajouter deux CheckBox Modifié les bons fichiers

 

A l'aide de smarty debug je vois bien mes nouvelles variables

 

Mais sur la fiche produit les modifications ne sont pas pris en compte elles sont toujours decochées

 

J'ai tenté de modifier en dur dans la BDD et la les cases sont cochées. Qu'en pensez vous ? Avez vous fais face à ce problème ?

Link to comment
Share on other sites

  • 6 months later...

Hello radhia005

 

Pour peu que tes infos soient stockées en BDD, oui tu peux les ajouter facilement dans tes vues et dans tes emails. ll te suffit d'aller jeter un oeil dans tes vues pour voir la logique d'insertion des infos depuis la BDD et conserver cette même logique pour aller chercher tes propres infos que tu souhaites insérer.

Link to comment
Share on other sites

  • 2 years later...

Bonjour,


J’utilise la version 1.6.0.5.

J'ai voulu ajouté un nouveau champ "monchamp" dans ma fiche produit

1. j’ai ajouté une colonne sur ps_product: name: monchamp; type: DECIMAL; Taille: 20,6 ;

2. sur override/classes/Product.php

class Product extends ProductCore
{
public $monchamp=0;

public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)
{
Product::$definition[‘fields’][‘monchamp’] = array(‘type’ => self::TYPE_FLOAT, ‘lang’ => true, ‘validate’ => ‘isPrice’);
parent::__construct($id_product, $full, $id_lang, $id_shop, $context);
}

}

3. sur override/controllers/admin/templates/products/prices.tpl

    <div class="form-group">
        <label class="control-label col-lg-3" for="pvmc">Mon champ</label>
        <div class="input-group col-lg-2">
            <span class="input-group-addon">{$currency->prefix}{$currency->suffix}</span>
            <input maxlength="14" id="monchamp" type="text" value="" name="monchamp" />
        </div>
    </div>


le champ s'affiche mais le souci c'est l'enregistrement ne passe pas.

Message d'erreur: Une erreur s'est produite pendant la mise à jour de l'objet. product ().

Est-ce que quelqu'un à déjà passé par là?

Merci d'avance.

Link to comment
Share on other sites

Bonjour,

 

 

J’utilise la version 1.6.0.5.

 

J'ai voulu ajouté un nouveau champ "monchamp" dans ma fiche produit

 

1. j’ai ajouté une colonne sur ps_product: name: monchamp; type: DECIMAL; Taille: 20,6 ;

 

2. sur override/classes/Product.php

 

class Product extends ProductCore

{

public $monchamp=0;

 

public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)

{

Product::$definition[‘fields’][‘monchamp’] = array(‘type’ => self::TYPE_FLOAT, ‘lang’ => true, ‘validate’ => ‘isPrice’);

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

}

 

}

 

3. sur override/controllers/admin/templates/products/prices.tpl

 

    <div class="form-group">

        <label class="control-label col-lg-3" for="pvmc">Mon champ</label>

        <div class="input-group col-lg-2">

            <span class="input-group-addon">{$currency->prefix}{$currency->suffix}</span>

            <input maxlength="14" id="monchamp" type="text" value="" name="monchamp" />

        </div>

    </div>

 

 

le champ s'affiche mais le souci c'est l'enregistrement ne passe pas.

 

Message d'erreur: Une erreur s'est produite pendant la mise à jour de l'objet. product ().

 

Est-ce que quelqu'un à déjà passé par là?

 

Merci d'avance.

 

Bonjour,

 

A vue d’œil le problème provient de : 'lang' => true qui devrait être a false.

En effet un prix de peut pas être multi langue.

De plus il me semble (je n'ai pas fait cette manip depuis un moment) que tu dois aussi créer le champ dans la table ps_product_shop en plus de ps_product.

Edited by Paco112 (see edit history)
  • Like 1
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...