Jump to content

Ajouter champs personnalisés Produit


Recommended Posts

Bonjour, je bosse actuellement sur un module 'Composition' permettant d'ajouter des champs personnalisés en surcharge sur une fiche produit (donc BO) et à afficher sur le front des pages produits. Étant encore en apprentissage dans le domaine du web et surtout de Presatshop, j'ai tout de même réussi à créer le module qui s'installe parfaitement et qui ajoute même en bdd mon éléments personnalisé (un simple input) dans la table souhaité (ps_product en l’occurrence). 

Cependant, je ne souhaite pas avoir qu'un seul champ personnalisé mais 4 (avec un seul champ l'installation fonctionne) . Je me doute que cela doit pas être très compliqué et que je ne doit pas être loin du but, mais avec les petites modifs que j'ai effectuées mon module ne parvient plus à s'installer.

En PJ le ficher composition.php du module où j'ai modifié (ligne 76) protected function _installSql() et(ligne 86) protected function _unInstallSql() ainsi que (lign 223) 'public function hookDisplayAdminProductsMainStepLeftColumnMiddle'

    protected function _installSql() {
        $sqlInstall = "ALTER TABLE " . _DB_PREFIX_ . "product"
            . " ADD compositionprix VARCHAR(255) NULL,"
            . "ADD compositionlivinfo VARCHAR(255) NULL, "
            . "ADD compositioncta VARCHAR(255) NULL, "
            . "ADD compositionlink VARCHAR(255) NULL";

        $returnSql = Db::getInstance()->execute($sqlInstall);
        return $returnSql;
    }
    protected function _unInstallSql() {
        $sqlInstall = "ALTER TABLE " . _DB_PREFIX_ . "product"
            . " DROP compositionprix,"
            . "DROP compositionlivinfo, "
            . "DROP compositioncta, "
            . "DROP compositionlink";
        $returnSql = Db::getInstance()->execute($sqlInstall);

        return $returnSql;
    }

[...]
[...]

    public function hookDisplayAdminProductsMainStepLeftColumnMiddle($params) {
        $product = new Product($params['id_product']);

        $this->context->smarty->assign(array(
            'compositionprix' => $product->compositionprix,
            'compositionlivinfo' => $product->compositionlivinfo,
            'compositioncta' => $product->compositioncta,
            'compositionlink' => $product->compositionlink,
        ));

        return $this->display(__FILE__, 'views/hook/admin/product/extra_fields.tpl');
    }

 

Le ficher extra_fields.tpl du module pour l'affichage des éléments dans l'admin des fiches produits. avec les différents affichages de blocs déclarés dans composition.php.

    <fieldset class="form-group">
        <div class="col-lg-12 col-xl-4">
            {*Champ Standard *}
            <label class="form-control-label">{l s='Prix à afficher' mod='composition'}</label>
            <input type="text" name="custom_field" class="form-control" {if $custom_field && $custom_field != ''}value="{$compositionprix}"{/if}/>

            <label class="form-control-label">{l s='Information de livraison' mod='composition'}</label>
            <input type="text" name="custom_field" class="form-control" {if $custom_field && $custom_field != ''}value="{$compositionlivinfo}"{/if}/>

            <label class="form-control-label">{l s='CTA' mod='composition'}</label>
            <input type="text" name="custom_field" class="form-control" {if $custom_field && $custom_field != ''}value="{$compositioncta}"{/if}/>

            <label class="form-control-label">{l s='Lien du CTA' mod='composition'}</label>
            <input type="text" name="custom_field" class="form-control" {if $custom_field && $custom_field != ''}value="{$compositionlink}"{/if}/>
        </div>
    </fieldset>

 

Le fichier Product.php dans /override/classes/Product.php de Prestashop dans lequel je préviens Prestashop des nouveaux champs et ce en surchargeant la classe du ProductCore.

class Product extends ProductCore
{
    public $compositionprix;
    public $compositionlivinfo;
    public $compositioncta;
    public $compositionlink;

    public function __construct(
        $id_product = null,
        $full = false,
        $id_lang = null,
        $id_shop = null,
        Context $context = null
    )
    {
        self::$definition['fields']['compositionprix'] = array(
            'type' => self::TYPE_HTML,
            'lang' => false,
            'required' => false,
            'validate' => 'isCleanHtml'
        );
        self::$definition['fields']['compositionlivinfo'] = array(
            'type' => self::TYPE_HTML,
            'lang' => false,
            'required' => false,
            'validate' => 'isCleanHtml'
        );
        self::$definition['fields']['compositioncta'] = array(
            'type' => self::TYPE_HTML,
            'lang' => false,
            'required' => false,
            'validate' => 'isCleanHtml'
        );
        self::$definition['fields']['compositionlink'] = array(
            'type' => self::TYPE_HTML,
            'lang' => false,
            'required' => false,
            'validate' => 'isCleanHtml'
        );
        parent::__construct($id_product, $full, $id_lang, $id_shop, $context);
    }
}

En espérant avoir bien expliqué mon problème, j'espère que quelqu'un saura m'orienter vers les erreurs que j'ai pu faire. :)

Merci !

Martin

 

composition.php extra_fields.tpl Product.php

Edited by martinchar
ajout d'éléments (see edit history)
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...