Jump to content

[Resolu] Probléme Avec Les Helpers !


Recommended Posts

Salut tout le monde,

 

Petit problème en vue !

Je crée un module pour le backoffice de presta..

J'utilise les helpers pour construire ça propre..

 

Donc j'ai ma fields_list qui fonctionne bien, qui va recup les champs dans la base et tout va bien.

Le problème intervient quand je souhaite utiliser la fonction edit d'une row.

Les champs input ne récupère pas de valeur ( enfin seulement le product_id ).

 

Quelqu'un à une idée ? ;)

 

Bisous

 

 

 

    /* Constructeur */
    public function __construct()
    {
        $this->bootstrap = true;
        /* Pour aller chercher la table correspondante dans la base */
        $this->table = 'reverdy_aliments';
        $this->className = 'ReverdyPrices';
        $this->deleted = false;

        $this->context = Context::getContext();
        /* Pour ajouter la checkbox à gauche */
        /*$this->bulk_actions = array(
            'delete' => array(
                'text' => $this->l('Delete selected'),
                'confirm' => $this->l('Delete selected items?'),
                'icon' => 'icon-trash'
            )
        );*/

        /* Pour préciser que la clé primaire n'est pas 'id_'.$table */
        $this->identifier = 'id_product';

        parent::__construct();
    }

    /* Pour ajouter les boutons */
    public function renderList()
    {
        /* Boutons sur les lignes du tableau */
        $this->addRowAction('edit');

        /* Champs voulus dans le tableau */
        $this->fields_list = array(
            'id_product' => array(
                'title' => $this->l('Produit'),
                'align' => 'center',
                'callback' => 'getAlimentNameById'
            ),
            'departement' => array(
                'title' => $this->l('Département'),
                'align' => 'center'
            ),
            'quantite_kg' => array(
                'title' => $this->l('Quantité'),
                'align' => 'center'
            ),
            'prix_ht' => array(
                'title' => $this->l('Prix H.T.'),
                'align' => 'center'
            )
        );

        return parent::renderList();
    }

    /* Pour récupérer directement le nom des produits */
    public function getAlimentNameById($echo,$row)
    {
        $id_product = (int)$row['id_product'];
        if($id_product){
            $produit = new Product($id_product);
            return $produit->name[$this->context->language->id];
        }
        return "";
    }

    /* Pour le formulaire de modification */
    public function renderForm()
    {
        if (!($obj = $this->loadObject(true)))
            return;

        $this->fields_form = array(
            'tinymce'=> false,
            'legend' => array(
                'title' => $this->l('Produit'),
                'icon' => 'icon-cogs',
            ),
            'input' => array(
                array(
                    'type' => 'text',
                    'name' => 'id_product',
                    'label' =>  $this->l('Produit'),
                    'disabled' => true
                ),
                array(
                    'type' => 'text',
                    'name' => 'departement',
                    'label' =>  $this->l('Département'),
                    'disabled' => true
                ),
                array(
                    'type' => 'text',
                    'name' => 'quantite_kg',
                    'label' =>  $this->l('Quantité en kg'),
                    'disabled' => true
                ),
                array(
                    'type' => 'text',
                    'name' => 'prix_ht',
                    'label' =>  $this->l('Prix H.T.')
                )
            ),
            'submit' => array(
                'title' => $this->l('Save'),
                'name' => 'submitAdd'.$this->table
            )
        );

        /*$this->fields_value = array('departement' => 'test');
        $this->fields_value['id_employee_default'] = $default_employee;*/

        return parent::renderForm();
    }

 

Link to comment
Share on other sites

Bonjour,

Merci beaucoup pour votre réponse :)

 

Ma class est la suivante :

class AdminReverdyPricesController extends ModuleAdminController

 

J'ai crée un fichier ReverdyPrices que j'ai mis dans un dossier models et ce fichier est comme ceci :

class ReverdyPrices extends ObjectModel
{

    public $id_product;
    public $departement;
    public $quantite_kg;
    public $prix_ht;

    public static $definition = array(
        'table' => 'reverdy_aliments',
        'primary' => 'id_product',
        'fields' => array(
            'departement' => array('type'=>self::TYPE_STRING),
            'quantite_kg' => array('type'=>self::TYPE_INT),
            'prix_ht' => array('type'=>self::TYPE_FLOAT),
        )
    );

} 
Link to comment
Share on other sites

OK !

 

Bon grâce à vos informations, j'ai inclus mon model dans le fichier de base du module ( celui qui installe ), et comme par magie, j'ai bien mes informations quand j'édite une ligne ! Génial :)

 

Je ne comprend cependant pas pourquoi cela marche pas comme ça, et aussi pourquoi j'avais quand même mon product_id qui se remplissait !

 

Je vous remercie beaucoup, et si jamais vous avez une explication supplémentaire à me donner pour la compréhension, je suis preneur !

 

Excellente journée :)

Edited by Benoit.ndr (see edit history)
Link to comment
Share on other sites

Je suis là pour ça, vous aidez à comprendre le problème ;-)

 

Actuellement, les models ne sont pas inclus automatiquement à la volée et au besoin pour ceux appartenant aux modules. Malheureusement, ce serait pratique. Mais c'est une autre histoire.

 

Le champ se remplit bien car il est récupéré différemment, via la valeur passée en paramètre d'URL. C'est un pré-remplissage due à la mécanique des contrôleurs et des helpers, finalement.

Link to comment
Share on other sites

Re J. Danse,

 

Du coup, je vois que quand je modifie mon $this->identifier, ça à l'air de correspondre à la variable que prestashop passe en get pour récupérer les values dans le formu.

 

Etant donné que dans ma base, pour un product_id je dois avoir 1500 entrées, il faudrait que j'arrive à dire à presta que j'ai en fait 3 identifier..

Le problème c'est qu'en fouillant un peu dans AdminController, je n'arrive pas à voir comment faire pour passer plusieurs id dans $identifier..

A mon avis il faut passer par une autre variable, mais vas savoir laquelle...

 

Je continue à chercher en attendant, mais si t'as une piste ou un indice, je suis preneur ;)

 

Bonne journée

Link to comment
Share on other sites

En fait, c'est souvent utilisé de ce type:

 

id_[table_name] = primary identifier (la colonne n'a pas réel besoin d'être primaire, disons que là c'est surtout une question d'intégrité de la base). L'idée est que cette colonne soit incrémentée et la seule utilisée pour l'édition. C'est en fait l'identifier de la ligne corresponde en DB, finalement. Vous me suivez ?

Link to comment
Share on other sites

Oui, enfin j'avais compris que si on ne précisait pas le $this->identifier, presta voulait prendre en base le champ du type id_[nom_de_la_table] en identifiant.

Mais la, d'une, le champ ne s'appelle pas comme ça ( et la table m'a été donnée donc pas de possibilité de changement de nom de champ ),

et deux, il faut que je passe les 3 champs en get, car ce sont 3 clés primaires dans la base.

 

( Le fichier SQL dont je parle fait 35000 lignes, il y a 17 id_product différents, une quinzaine de quantite_kg différents et tous les départements de france.. donc une valeur prix pour chaque combinaison de ces 3 champs ... )

 

Voyez vous ce que je veux faire et quel est mon problème ?

 

En tout cas merci pour votre temps.

Edited by Benoit.ndr (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...