Supprimer un extrafield grâce au hook formObjectOptions

Bonjour,

Je suis à la recherche d’une solution pour supprimer un extratfield sur certaine card. La situation est la suivante :
Je dispose de plusieurs extrafields sur une même card, je souhaiterai en cacher certaine selon un boolean qui est aussi un extrafield.
Pour faire cela, il me semble que le hook formObjectOptions est la solution prévu par Dolibarr. Voici donc mon code du hook dans un module personnalisé.

public function formObjectOptions($parameters, &$object, &$action, $hookmanager) {
$i = 0;
foreach($object->array_options as $key => $value){
if($key == « options_urldoc »){
//array_splice($object->array_options, $i);
unset($object->array_options,$i);
print($key);
}
$i++;
}
print(« 

fezfzefzefzefzefzef

 »);
return 0;
}

Le hook marche, mon problème se situe au niveaux du unset() ou array_splice() ni l’un ni l’autre supprime l’affichage de l’extrafield en question juste sa value est supprimée mais la key reste afficher dans les cards.
Après avoir essayer plusieurs solution je pense que coté php c’est bon mais il me semble que je dois rater quelque chose en lien avec le hook.

Quelqu’un peut-il m’apporter un éclaircissement?

Cordialement.

Pourquoi ne pas utiliser l’attribut Visible de l’extrafield qui peut prendre un instruction php qui est évaluée à la volée ?

1 « J'aime »

Bonjour,

Merci de cette piste, je ne pensait pas pouvoir faire un if dans l’extrafield (enfin un ternaire de remplacement car avec le if en direct j’ai pas réussi :slight_smile: ). Cependant elle ne répond pas à mon attente. En effet, in fine, je souhaite utilisé ces extrafields dans l’interface de ticket public. Votre solution est exactement ce qu’il me faut mais sans devoir enregistrer pour faire apparaitre l’extrafield lorsque l’on choisi parmi une liste déroulante d’un autre extrafield. Je pense que je vais pas avoir le choix, je vais devoir faire du Jquery dans le fichier /public/ticket/create_ticket.php.
Merci car grâce à votre piste, je sais également que c’est mort avec le hook, je pense qu’il lui faudra la donné enregistrer également.

Ai-je raison ou il y aurait une solution qui m’est inconnu?

Cordialement.

Bonjour,

Jquery est la bonne piste. Je peux cacher les attribut supplémentaire avec document.ready cependant je souhaiterais ne pas les afficher. A voir entre manipuler le DOM en cours de construction avec Jquery ou le string du issu du formticket->showForm().
Pour une autre chose que je voudais faire. @FHenry Seriez-vous si il est possible de faire appel aux tag/catégories?
J’ai fait cela :

    $label = "COM";
    $cat=$db->query('SELECT fk_categorie FROM '.MAIN_DB_PREFIX.'categorie_product WHERE fk_product = '.$object->rowid); 
    $res=0;
    foreach($cats as $cat){
          if($db->query('SELECT label FROM '.MAIN_DB_PREFIX.'categorie WHERE rowid = '.$cat) == $label){
                  $res++;
            }; 
    }

Mais je suis limité par la taille du champs visibilité. Du coup je vais devoir crée un extrafield pour récupérer $cats et donc dupliquer en partie le système de tag/catégorie.

@ksar (Je sais pas qui est dev sur le forum) Pour les dev : Est-il possible changer le type de champs « visibilité » pour qu’il soit long text svp ? En effet je trouve dommage de ne pas pouvoir changer la visibilité des extrafields en fonction du tag sans avoir un crée un autre extrafield qui duplique le système de tag. Le principe de tag et de représenter, en partie, les différences entre deux produits par exemple et donc des donné différentes. Utilisé le couple tag/catégorie et extrafield pour éviter de taper dans les modules juste pour pas que la page de l’objet devienne un vrai bordel :).

Je vous recommanderais de creer votre classe et d’en appeler la méthode que vous auriez developper dedans qui ferais le même travail que votre long code.