Changeset 109583 in spip-zone


Ignore:
Timestamp:
Mar 18, 2018, 10:44:44 AM (16 months ago)
Author:
bystrano@…
Message:

report de r109580 : Évite des erreurs MySQL 1146

Dans le pipeline declarer_objets_sql, il ne faut surtout pas utiliser de
fonctions qui appellent lister_objets_sql() - comme p.ex. table_objet() -
puisque ça revient à appeler le pipeline depuis le pipeline…

Merci à Placido pour le signalement !

Location:
_plugins_/logos_roles/branches/v1
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/logos_roles/branches/v1/base/logos_roles.php

    r103779 r109583  
    139139function logos_roles_declarer_tables_objets_sql($tables) {
    140140
     141        $noms_tables = array_filter(array_keys($tables), 'is_string');
     142
    141143        include_spip('logos_roles_fonctions');
    142144        include_spip('base/objets');
    143145
    144         $roles_logos = lister_roles_logos();
     146        $roles_logos = lister_roles_logos(null, null, $noms_tables);
    145147
    146148        if (is_array($roles_logos)) {
     
    151153                        $nouveaux_roles_titres[$role] = $options['label'];
    152154                        foreach ($options['objets'] as $objet) {
    153                                 $nouveaux_roles_objets[table_objet($objet)][] = $role;
     155                                // Une ré-implémentation naïve de la fonction table_objet(), qu'on n'a
     156                                // pas le droit d'utiliser ici, parce qu'elle appelle indirectement ce
     157                                // pipeline.
     158                                foreach ($noms_tables as $nom_table) {
     159                                        if (preg_match("/$objet/", $nom_table) === 1) {
     160                                                $table_objet = $nom_table;
     161                                                $nouveaux_roles_objets[$table_objet][] = $role;
     162                                                break;
     163                                        }
     164                                }
    154165                        }
    155166                }
  • _plugins_/logos_roles/branches/v1/logos_roles_fonctions.php

    r109140 r109583  
    2727 *
    2828 * @param string|null $objet : Un nom d'objet auquel se restreindre. La fonction
    29  *        ne retourne alors que les rôles de logos que l'on peut attribuer à cet
    30  *        objet.
     29 *     ne retourne alors que les rôles de logos que l'on peut attribuer à cet
     30 *     objet.
    3131 * @param string|null $role : Un rôle auquel se restreindre. On accepte `on` ou
    32  * `off` pour la rétro-compatibilité
     32 *     `off` pour la rétro-compatibilité
     33 * @param string|null $tous_les_objets : Une liste des objets éditoriaux à
     34 *     prendre en compte. Ça n'est nécessaire que dans le cas où l'on appelle
     35 *     cette fonction à un moment où l'API lister_tables_objets_sql n'est pas
     36 *     encore disponible, notamment dans le pipeline declarer_tables_objets_sql.
     37 *     Dans les autres cas on utilise l'API pour trouver les tables, pas besoin
     38 *     de les spécifier.
    3339 *
    3440 * @return array : Retourne le tableau décrivant les rôles de logos. Si on a
    35  * passé un paramètre rôle, on retourne directement la définition plutôt qu'une
    36  * liste avec un seul rôle.
    37  */
    38 function lister_roles_logos($objet = null, $role = null) {
     41 *     passé un paramètre rôle, on retourne directement la définition plutôt
     42 *     qu'une liste avec un seul rôle.
     43 */
     44function lister_roles_logos($objet = null, $role = null, $tous_les_objets = null) {
    3945
    4046        if ($role === 'on') {
     
    4450        }
    4551
    46         $tous_les_objets = array_map('table_objet', array_keys(lister_tables_objets_sql()));
     52        if (! $tous_les_objets) {
     53                $tous_les_objets = array_map(
     54                        'table_objet',
     55                        array_filter(array_keys(lister_tables_objets_sql()))
     56                );
     57        }
    4758
    4859        // Logos par défaut
     
    7182
    7283        /* Filtrer par objet */
    73         if ($objet = table_objet($objet)) {
     84        if ($objet and $objet = table_objet($objet)) {
    7485                $roles_logos_objet = array();
    7586                foreach ($roles_logos as $cle_role => $options) {
Note: See TracChangeset for help on using the changeset viewer.