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
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.
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 je vais poster celà quand j’aurais un peux de temps durant ce confinement
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