Le problème est bien plus complexe que ces 3 lignes. Je crois qu'il faut revoir ces tests pour utilise. Il y a plusieurs cas, il semble que je sois tombé sur un posant problème, mais un autre arrive en tentant de corriger, donc... Quelques cas :
Un plugin A indique qu'il utilise : B, C et D. Cas possibles :
1) B, C et D ne sont pas activés
2) B uniquement est actif
3) B C et D sont actifs.
Si on sauve au début $toute_la_liste = $liste_non_classee; (avant que ce tableau soit modifié), il contient la liste de tous les plugs qui seront actifs. La fonction erreur_necessite() va retourner différentes erreurs :
erreur_necessite($infos[$dir_type][$plug]['utilise'], $toute_la_liste))
1) necessite le plugin B, C et D
2) necessite le plugin C et D
3) rien.
si l'on dit :
if (!erreur_necessite($infos[$dir_type][$plug]['utilise'], $toute_la_liste))) {
$utilise_ok = !erreur_necessite($infos[$dir_type][$plug]['utilise'], $liste);
}
le test rentrera UNIQUEMENT si tous les plugins utilisés sont présents, pour tester si la liste ordonnée accepte ce plugin. Dans le cas où tous les <utilise> sont là, ou tous absents, ces tests fonctionnent. Le hic étant quand certains sont là seulement. Dans le cas 2) erreur_necessite retourne une erreur, donc $utilise_ok = true; reste à true. Ainsi, si le plugin B est après dans la $liste_non_classee, le plugin A sera tout de même inséré dans la $liste classée.
Le comportement était encore plus aléatoire avec le code actuellement dedans qui teste if (!erreur_necessite($infos[$dir_type][$plug]['utilise'], $liste_non_classee))) ... vu que en fonction des éléments déjà classés, on aura ou non des erreurs. Dans ce cas là le problème principal est que le point 1) peut aussi créer un mauvais ordre de plugin.
Si $liste contient B et C, que $liste_non_classée contient A et D et qu'on traite A, erreur_necessite($infos[$dir_type][$plug]['utilise'], $liste_non_classee) retourne des erreurs :
- necessite B et C (ils sont dans $liste). Comme ils retournent une erreur, le test d'après n'est pas effectué et $utilise_ok reste aussi à true, intégrant alors A avant D dans les plugins triés.
Bref, c'est complexe, et en plus, là, ça ne fonctionne pas.
Je me demande s'il ne faudrait pas faire un traitement qui enleve les erreurs d'utilise dont les plugins sont absents.
en gros :
$absents_mais_cest_pas_grave = erreur_necessite($infos[$dir_type][$plug]['utilise'], $toute_la_liste)); // tous les plugins "utilise" absents
$absents_liste_tries = erreur_necessite($infos[$dir_type][$plug]['utilise'], $liste)); // tous les plugins "utilise" absents de la liste deja trie
if (count($absents_liste_tries) - count($absents_mais_cest_pas_grave)) > 0 { $utilise_ok=false; }
Ça fait revoir le retour de erreur_necessite() qui là ne renvoie que tu texte, mais un argument en plus pourrait lui faire retourner un tableau des erreurs, pourquoi pas.