ModuleBuilder Utiliser dictionnaire dans un champ

Je suis en train de créer un nouveau module avec Module Builder et j’ai besoin d’inclure un dictionnaire dans un champ de formulaire, comment puis-je le faire ?

Je vous remercie

@Expression : je ne sais si tu as trouvé la solution mais je suis preneur de l’information.

Bonjour,

Tout se fait dans la classe de l’objet qui contient le champ. Le module builder vous génère automatiquement un attribut $field, qui est un tableau décrivant comment les champs de l’objet seront gérés dans le CRUD et dans les listes.

Pour les champs à remplir à partir d’un dictionnaire, la seule solution que j’ai trouvé est de créer tout d’abord une entrée dans fields, obligatoirement de type interger :
‹ fk_monChamp › => array(‹ type ›=>‹ integer ›,…

'monChamp étant déclaré comme une foreignkey sur un champ de type interger dans la table dictionnaire. Je vais appeler ce champ ‹ code › dans l’exemple qui suit.

Ensuite; il faut ajouter à ‹ fk_monChamp › une entrée ‹ arrayofkeyval › avec toutes les valeurs de la table dictionnaire, ce qui peut se faire dans le constructeur. Exemple :
$sql = « SELECT c.code, c.label, c.active »;
$sql.= " FROM ".MAIN_DB_PREFIX.« c_monDictionnaire as c »;
$sql.= " WHERE c.active = 1 « ;
$sql.= " ORDER BY c.label ASC »;
$resql = $db->query($sql);
if ($resql)
{
$num = $db->num_rows($resql);
if ($num > 0)
{
$arrayofkeyval = array();
$i = 0;
while ($i < $num)
{
$obj = $db->fetch_object($resql);
$arrayofkeyval[$obj->code] = $obj->label;
$i = $i +1;
}
$this->fields[‹ fk_monChamp ›][‹ arrayofkeyval ›] = $arrayofkeyval;
}
$db->free($resql);
}
else
{
dol_print_error($db);
}

Ca fonctionne parfaitement dans le CRUD si on utilise le _card.php généré par le module builder (on a une jolie Combobox avec les entrées du dictionnaire). Dans le champ de recherche de la liste, je butte encore sur comment faire apparaître la combo box. Il faut que je farfouille dans les modules exitants pour voir quel paramétrage spécifique dans $fields est à faire.

@droubaud : merci du retour.

Il faut que l’on aille demander à @eldy.

Très intéressant !

Mais comment faire par exemple si l’on souhaite mettre une checkBox avec tous les champs du dictionnaire ??

Bonjour cela m’intéresse mais je ne voie pas ou mettre le arrayyokeyval?

J’ai trouvé ça fonctionne parfait!

Bonsoir
Merci pour la réponse : elle va aider beaucoup d’utilisateur du forum !

Trêve d’humour : quelques détails d’explication seraient bienvenus .
D’avance merci

Je me doutais de cette reflexion :yum: je vais poster celà quand j’aurais un peux de temps durant ce confinement :smirk:

Voici tout ce que j’ai fait

Déclaration du dictionnaire dans la class du module /monmodule/core/modules/modMonmodule.class.php
Dans la section:

        // Dictionaries
        $this->dictionaries=array(

Dans le fichier class de mon objet /custom/monmodule/class/monobjet.class.php

	public $fields=array(
	'fk_type' => array('type'=>'integer', 'label'=>'Type', 'enabled'=>1, 'position'=>15, 'notnull'=>1, 'visible'=>-1, 'foreignkey'=>'c_nom_dictionnaire', 'foreignkey'=>'c_nom_dictionnaire.rowid', 'arrayofkeyval'=>array(),),

Dans le constructeur du même fichier /custom/monmodule/class/monobjet.class.php

public function __construct(DoliDB $db)
{

//Ajouter

$sql = 'SELECT c.rowid, c.code, c.label, c.active';
        $sql.= ' FROM '.MAIN_DB_PREFIX.'c_nom_dictionnaire as c';
        $sql.= ' WHERE c.active = 1';
        $sql.= ' ORDER BY c.label ASC';
        
        $resql = $db->query($sql);
        
        if ($resql)
        {
            $num = $db->num_rows($resql);
            if ($num > 0)
            {
                $arrayofkeyval = array();
                $i = 0;
                while ($i < $num)
                {
                    $obj = $db->fetch_object($resql);
                    $arrayofkeyval[$obj->rowid] = $obj->label;
                    $i = $i +1;
                }
                $this->fields['fk_type']['arrayofkeyval'] = $arrayofkeyval;
            }
            $db->free($resql);
        }
        else
        {
            dol_print_error($db);
        }

un fichier sql pour créer la table dans /custom/monmodule/sql/llx_c_nom_dictionnaire.sql

   create table llx_c_nom_dictionnaire
    (
      rowid   	integer	AUTO_INCREMENT	PRIMARY KEY	NOT NULL,
      code    	varchar(12) NOT NULL,
      label 	varchar(30),
      active  	tinyint DEFAULT 1  NOT NULL
    )ENGINE=innodb;

un fichier sql pour créer la table dans /custom/monmodule/sql/llx_c_nom_dictionnaire.key.sql

ALTER TABLE llx_c_nom_dictionnaire ADD UNIQUE INDEX uk_c_nom_dictionnaire(code);

Faire une maj .class et .sql

Modifier

nom_dictionnaire
fk_type qui est le nom du champs

4 « J'aime »