[SPIP Zone] SPIP [SVN], Forms & Tables et crayons sont dans un bateau.... et ... BUG

Hello all

Bon je viens de passer quelques heures sur un bug méchant entre ces 3 protagonistes...

Dans une boucle documents classique :

<BOUCLE_docs(DOCUMENT){id_article}>
<h1 class="#EDIT{titre}">#TITRE</h1>
</BOUCLE_doc>

Le problème :

en administrateur restreint sur un de ses articles, spip retourne l'erreur :

pip_documents_donnees WHERE id_document=3974
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM `devemotionps`.spip_documents_donnees WHERE id_document=3974' at line 1

qui est due à la balise #EDIT{titre}

La raison pour cela vient de la méthode d'autorisation ligne 226 de inc/autoriser :
function autoriser_document_modifier_dist($faire, $type, $id, $qui, $opt){

Pour faire bref :

- ligne 243 : $id_table = id_table_objet($type);
est incapable de trouver la table spip_documents_donnee car il cherche en somme spip_documents_forms_donnee (un problème qui vient du nom de la table très certainement)

Donc en gros j'ai modifiée la fonction ainsi que j'ai placée dans mes_fonctions.php :

function autoriser_document_modifier($faire, $type, $id, $qui, $opt){
  static $m = array();

  if ($qui['statut'] == '0minirezo'
  AND !$qui['restreint'])
    return true;

  if (!isset($m[$id])) {
    $interdit = false;
    $vu = true;
    include_spip('public/interfaces');
    $jointures = array_diff(
      $GLOBALS['tables_jointures']['spip_documents'],
      array('types_documents', 'mots')
    );
    foreach($jointures as $j) {
      $type = preg_replace(',s?_?documents?_?|s$,', '', $j);
      if($type == 'donnee'){
        $type = 'forms_donnee';
      }
      $id_table = id_table_objet($type);
      spip_log('$j = '.$j.' $type = '.$type.' $id_table = '.$id_table, 'autoriser');
      $s = sql_select("$id_table", "spip_$j", "id_document=".sql_quote($id));
      while ($t = sql_fetch($s)) {
        spip_log($t);
        if (autoriser('modifier', $type, $t[$id_table], $qui, $opt)) {
          $vu = true;
        }
        else {
          $interdit = true;
          break 2;
        }
      }
    }
    $m[$id] = ($vu && !$interdit);
  }

  return $m[$id];
}

Cela résoud le problème cité ci dessus par contre je ne sais pas si les documents associés marchent avec Forms&tables

++

Q.

Le 10/02/08, Drouet quentin <kent1@arscenic.info> a écrit :

Hello all

Bon je viens de passer quelques heures sur un bug méchant entre ces 3
protagonistes…

Dans une boucle documents classique :

<BOUCLE_docs(DOCUMENT){id_article}>

#TITRE

Le problème :

en administrateur restreint sur un de ses articles, spip retourne
l’erreur :

pip_documents_donnees WHERE id_document=3974
You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use
near ‹ FROM devemotionps.spip_documents_donnees WHERE
id_document=3974 › at line 1

qui est due à la balise #EDIT{titre}

Juste pour m’éclairer (je suis sur un page avec ne boucle similaire qui ne plante apparement pas), tu parle d’une boucle document classique mais ensuite tes requetes se referebt à document donnees qui est plutot un boucle sur les doc attachées dans F et Tables.
Heu po clair :-b.
A+

Arnaud

Hello Arnaud…

En fait j’ai essayer de tracer hier dans la nuit et voila ce que j’ai compris et déduis (attention je n’assure pas que ca vient de là non plus :smiley: ) :

  • Pour que #EDIT{titre} marche il se réfère aux autorisations

  • J’ai donc ouvert mon fichier inc/autorisation en ayant réduit le problème à cette balise (sans,no tout fonctionne correctement)

  • Là j’ai regardé de plus près la fonction « autoriser_document_modifier_dist » qui correspond à la modif des docs et on remarque :

  • pour les 0minirezo non restreint l’autorisation retourne toujours true donc normal que ca marche avec les admins normaux

  • pour tout autre utilisateur (admins restreints + redacteurs + visiteurs peut être), la fonction d’autorisation parcours les tables avec la fonction « id_table_objet($type) » qui se trouve dans le fichier « base/connect_sql.php »

  • Cette fonction parcours les tables afin de trouver la table de jointures à la boucle documents en se basant sur son type (article,rubrique,site,forms_donnee) afin de trouver les tables spip_documents_articles, spip_documents_rubriques etc…

  • Cette fonction veut trouver une table nommée spip_documents_$type.s

Or ici elle ne trouve pas la table car la table devrait certainement s’appeler spip_documents_forms_donnees

Ceci n’est que ce que j’en déduis

Pour tester : plugins crayons + F&t + spip 1.9.3 à jour

Avoir le statut admin restreint sur son article avec des documents (dans l’article) et la boucle que j’ai donné cette nuit
NB : avec la petite correction que j’ai donné hier ca marche

Q.

Le 10 févr. 08 à 12:20, Arnaud Ventre a écrit :

Le 10/02/08, Drouet quentin <kent1@arscenic.info> a écrit :

Hello all

Bon je viens de passer quelques heures sur un bug méchant entre ces 3
protagonistes…

Dans une boucle documents classique :

<BOUCLE_docs(DOCUMENT){id_article}>

#TITRE

Le problème :

en administrateur restreint sur un de ses articles, spip retourne
l’erreur :

pip_documents_donnees WHERE id_document=3974
You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use
near ‹ FROM devemotionps.spip_documents_donnees WHERE
id_document=3974 › at line 1

qui est due à la balise #EDIT{titre}

Juste pour m’éclairer (je suis sur un page avec ne boucle similaire qui ne plante apparement pas), tu parle d’une boucle document classique mais ensuite tes requetes se referebt à document donnees qui est plutot un boucle sur les doc attachées dans F et Tables.
Heu po clair :-b.
A+

Arnaud