seenthis / seenthis_squelettes

plugin "squelettes" de seenthis
11 stars 6 forks source link

supprimer la construction `array_map('array_pop', $x)` #187

Closed Fil closed 7 years ago

Fil commented 7 years ago

L'idée était d'écrire simplement "récupérer le premier élément de chaque élément du tableau", mais on dirait que ça ne fonctionne plus si le tableau comporte plusieurs éléments, ce qui provoquait une grande lenteur sur la page d'accueil (cf. https://github.com/seenthis/seenthis/commit/0276740a47b03fad7160becf8cddd31dfee3e5f4 )

Fil commented 7 years ago

J'ai utilisé cette construction à pas mal d'endroits dans plugins/seenthis et seenthis_squelettes ; seuls ceux où les éléments qu'on passe comportent plusieurs champs vont poser problème, mais je crois que par principe il faudrait les éliminer tous. Comme c'est un peu chiant à écrire est-ce qu'on fait une fonction dédiée ?

Fil commented 7 years ago

À noter : https://github.com/seenthis/seenthis/commit/0276740a47b03fad7160becf8cddd31dfee3e5f4 aurait pu être corrigé autrement, en supprimant ,date de la requête SQL qui précède.

marcimat commented 7 years ago

Je disais : maintenant il vaut mieux utiliser array_column($tableau, 'nom de la colonne'); plutôt que des array_map('reset', $tableau); ou équivalent.

brunob commented 7 years ago

foreach($mentions as $m) $pointe[] = $m['id']; => $pointe = array_column($mentions, 'id'); donc

Le patch suivant réglerait le problème pour les deux occurrences où on passe un élément à plusieurs champs :

Index: inc/seenthis_data.php
===================================================================
--- inc/seenthis_data.php   (révision 418)
+++ inc/seenthis_data.php   (copie de travail)
@@ -507,7 +507,7 @@

    # les mentions @login vers $moi :
    $mentions = sql_allfetsel('id_me', 'spip_me_auteur', 'id_auteur='.$moi, '', 'date DESC', '0,'.($debut + $max_pagination));
-   $pointe = array_merge($pointe, array_map('array_pop', $mentions));
+   $pointe = array_column($mentions, 'id_me');

    # les messages qui parlent d'un sujet ou url qui m'interesse $moi
    if ($pointetags = liste_pointe_tags($debut, $max_pagination, $moi)) {
@@ -516,7 +516,7 @@

    # les messages auxquels j'ai repondu $moi
    $mentions = sql_allfetsel('DISTINCT(id_parent) as id, date', 'spip_me', "id_auteur=$moi AND id_parent>0 AND statut='publi'", '', 'date DESC', '0,'.($debut + $max_pagination));
-   foreach($mentions as $m) $pointe[] = $m['id'];
+   $pointe = array_column($mentions, 'id');

    # faut-il ajouter les messages ayant des URLs avec un tag opencalais que je suis ?
brunob commented 7 years ago

Appliqué dans la branche 3.1, reste à voir si on reporte dans la branche 2.1 dans quel cas il faudra préciser que PHP >= 5.5.0 est nécessaire.

Fil commented 7 years ago

= 5.5.0 est nécessaire.

Il suffit peut-être de fournir array_column si la fonction est absente (dans mes_fonctions par exemple ?)

-- Fil

brunob commented 7 years ago

Vi, on pourrait pomper ce que fait bonux https://zone.spip.org/trac/spip-zone/browser/_plugins_/spip-bonux-3/lib/array_column/array_column.php?rev=89337 pour la branche 2.1 uniquement, et ajouter un necessite bonux pour la branche 3.1.

Fil commented 7 years ago

Discussion en ce moment sur spip-dev pour que cette fonction soit ajoutée en cas de besoin au niveau de SPIP.

brunob commented 7 years ago

Dans un premier temps, il suffit d'ajouter un necessite spip_bonux (qui fourni array_column) dans la branche 3.1 du plugin seenthis, parce que je ne suis pas certain de pouvoir assurer le portage de seenthis vers SPIP 3.2 en 5 minutes (notamment au niveau du plugin inclure ajaxload et des changements apportés par la nouvelle version de jQuery).

brunob commented 5 years ago

Maintenant que seenthis est en 3.2 on peut considérer que c'est bien fermé :)