Modification selectfields

Bonjour à tous,

Au fil des différents modules, de nombreux écrans de listes (list.php) sont modifiés avec l’apparition de nouvelles colonnes. Parfois, ces colonnes ne proviennent pas de l’objet concerné, et ne sont donc pas sélectionnables dans la liste des colonnes à afficher ou non par la menu hamburger.

J’aurais aimé changé ce comportement pour nos modules, mais je me heurte à une problématique : il n’existe pas de hook permettant de modifier l’array ($arrayfields) utilisée par la fonction multiSelectArrayWithCheckbox() de la classe Form (html.form.class.php).

Y a-t-il une solution que j’aurais loupée pour cela ? Ou bien est-il nécessaire de voir pour intégrer un hook ? Dans ce cas, plutôt dans la fonction multiSelectArrayWithCheckbox(), ou dans le list.php de chaque objet (le boulot !) ?

Des avis, avant que je ne me lance ?

1 « J'aime »

Je n’ai pas regardé partout si c’était un fonctionnement standard, mais le tableau est souvent envoyé par référence dans le hook doActions .

D’ailleurs, il serait peut-être bien de standardiser ce genre de comportements pour avoir quelque chose de plus homogène.

Si je prends l’exemple du list.php des produits :

$parameters = array();
$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);

Pas de trace du $arrayfields ici :confused:

Je ne pense pas que cet array soit passé, justement. D’autant plus que le doActions n’intervient pas sur la vue, qui est généralement plus bas dans le code.

Il l’est sur les listes commandes, propales, factures

1 « J'aime »

Ok go uniformiser ça, merci pour la piste !

perso je passe par le doaction et un global et cela se passe bien meme si ce n’est pas super propre

Oui il y a aussi cette solution, mais j’avais vraiment envie de proposer un truc propre. Le doActions avec l’arrayfields par référence me semble plutôt approprié :slight_smile:

1 « J'aime »

On est bien d’accord, de mémoire, je vérifie qu’il n’est pas présent dans l’éléments puis je passe en global…

1 « J'aime »

On pourrait peut-être faire un hook séparé plus plutôt que de le faire via un doAction histoire de séparé les fonctionnalités.

1 « J'aime »

Je vais attendre le retour d’eldy sur ma PR, au besoin je ferai ça :slight_smile:

je dirais que l’un (envoyer le selectfields dans le doActions) n’empêche pas l’autre (créer un hook dédié pour le modifier)…
une petite remarque supplémentaire : modifier le template list du modulebuilder pour l’ajouter aussi…

Et le hook, tu le verrais à quel niveau ? Dans les list.php, ou dans la fonction multiSelectArrayWithCheckbox() ?

Tout dépend de ta motivation :slight_smile:
En le mettant dans multiSelectArrayWithCheckbox(), ça serait généralisé quand même plus facilement

Je me garde ça sous le coude pour le début de semaine prochaine :wink:

Si c’est dans le multiSelectArrayWithCheckbox ce n’est plus un hook qu’il faut écrire mais un trigger
Meme si cela fait plus de travail, j’aurai qd meme une préférence pour le hook afin tout au meme endroit (et ne pas passer des plombes à comprendre comment cela fonctionne…)

Pourquoi un trigger plutôt qu’un hook ? J’atteins mes limites de néo-dolibarrien là :wink:

Pour le hook, tu suggères de le mettre dans tous les lists.php qui ont un arrayfield, donc ?

Dans la logique dolibarrienne, ce qui touche à l’interface c’est du hook et ce qui se passe dans les fonctions ou les méthodes c’est du trigger

Si je privilégie de créer un hook, bien que ce soit plus conséquent en terme de travail, c’est que coté développeur de module on n’aurait qu’un seul fichier action_xxx.class.php qui contienrait toute le code associé à la modification de la liste…

Ce serait pareil avec un trigger, non ? Sauf que tu l’aurais dans un fichier trigger. Tu gères en fonction de ton contexte. Ou je dis une bêtise ?

Mais oui, un hook me semble tout de même plus adapté, je pensais juste le mettre directement dans la fonction plutôt que dans les listes… Mais c’est effectivement pas cohérent.

Dans tous les cas : semaine prochaine.

C’est pour interagir avec l’interface, donc ça reste un hook, les triggers c’est pour les événements métiers.

1 « J'aime »