[SPIP Zone] r3612 - in /_plugins_/_ze_laboratoire_/editables: import.php inc/actionParser.php inc/actionParserTest.php inc/actions.exemple test2.action.html test2.html

Author: christian_lefebvre@laposte.net
Date: Wed Jun 21 15:40:24 2006
New Revision: 3612

Log:
quelques debug et ameliorations mais il faudrait surement revoir des trucs
plus profondement

Added:
    _plugins_/_ze_laboratoire_/editables/import.php
Modified:
    _plugins_/_ze_laboratoire_/editables/inc/actionParser.php
    _plugins_/_ze_laboratoire_/editables/inc/actionParserTest.php
    _plugins_/_ze_laboratoire_/editables/inc/actions.exemple
    _plugins_/_ze_laboratoire_/editables/test2.action.html
    _plugins_/_ze_laboratoire_/editables/test2.html

Added: _plugins_/_ze_laboratoire_/editables/import.php

--- _plugins_/_ze_laboratoire_/editables/import.php (added)
+++ _plugins_/_ze_laboratoire_/editables/import.php Wed Jun 21 15:40:24 2006
@@ -0,0 +1,49 @@
+<?php
+ // script permattant d'importer un fichier d'actions explicite
+ // ATTENTION : version simple sans recup de valeurs et sans callbacks
+ // interessant en batch a la sieps
+
+ // A MODIFIER SELON VOTRE CONFIG
+$spipDir= "../..";
+$spipDir= "/var/www/html/spalios";
+
+// le bout de code qui va bien pour se retrouver dans un contexte "spip minimal"
+define('_DIR_RACINE', "$spipDir/");
+define('_DIR_RESTREINT_ABS', "$spipDir/ecrire/");
+define('_DIR_RESTREINT', _DIR_RESTREINT_ABS);
+include("$spipDir/ecrire/inc_version.php");
+spip_connect();
+include_spip("base/abstract_sql");
+
+$r= spip_abstract_select(array("count(*)"), array("spip_articles"));
+if (!$r || !spip_abstract_fetch($r)) {
+ die("echec d'acces a la bdd (".mysql_error($r).")\n");
+}
+// arrivé là , on a les fonctions spip de base, et la bdd est accessible
+
+// récupérer le xml2bdd du plugin editables
+include_spip('inc/actionParser');
+
+// pour chaque fichier passé en argument (avec un chemin en aaaa/ll/...txt)
+array_shift($argv);
+foreach($argv as $fichier) {
+ $actions= file_get_contents($fichier);
+ $parser = new actionParser(null);
+ $parser->parse($actions);
+ $code= $parser->getCode();
+
+ echo "=> code = ".$code."\n";
+
+// $cc= explode("\n && ", $code);
+// array_shift($cc);
+// foreach($cc as $c) {
+// echo "CODE $c => ";
+// $res= eval("return $c;");
+// if($res===false) {
+// die("erreur à l'exécution du code");
+// }
+// echo "$res\n";
+// }
+}
+
+?>

Modified: _plugins_/_ze_laboratoire_/editables/inc/actionParser.php

--- _plugins_/_ze_laboratoire_/editables/inc/actionParser.php (original)
+++ _plugins_/_ze_laboratoire_/editables/inc/actionParser.php Wed Jun 21 15:40:24 2006
@@ -13,21 +13,32 @@
   var $sql= array();

   // on part d'un etat 'vide' et on empile des etats 'actions' puis
- // 'update' ou 'insert' puis 'key' ou 'field' puis eventuellement 'get'
+ // 'update' ou 'insert' puis 'field' puis eventuellement 'select'
   var $state=array();

- // la liste d'action qui en resulte
+ // la liste d'actions qui en resulte
   var $liste= array();
   // les actions en cours d'interpretation
   var $actions= array();
+ /** ce tableau contient une liste d'entrées, chacune étant elle même un
+ * tableau associatif avec les clés suivantes :
+ * type = insert ou update
+ * table = la table concernées (nom spip et pas nom de table sql,
+ * càd articles et pas spip_articles par exemple)
+ * id = le nom à donner à l'éventuel autoincrément
+ * field = la liste des champs avec leur valeur
+ * aTrouver = la liste des champs dont il faut trouver la valeur par ailleurs
+ * (via un select imbriqué)
+ */

- // si on trouve des erreurs en court de route (valeurs obligatoires
+ // si on trouve des erreurs en cours de route (valeurs obligatoires
   // absentes principalement)
   var $errors= array();

   // compteur pour les variables temporaires generees
   var $tmpVars= 0;

+ // initialisation d'un parseur d'actions et des données de travail
   function actionParser($valeurs) {
     $this->valeurs= $valeurs;
     $this->parser = xml_parser_create($GLOBALS['meta']['charset']);
@@ -38,20 +49,29 @@
     xml_set_element_handler($this->parser, "startElement", "endElement");
   }

+ // effectue le parsing et en déduit une structure "actions"
   function parse($data) {
     //xml_parse_into_struct($this->parser, $data, $values, $indexes);
     //echo "VALUES=".var_export($values, 1)."\n";
     //echo "INDEXES=".var_export($indexes, 1)."\n";
     xml_parse($this->parser, $data);
+
+ if(($c=xml_get_error_code($this->parser)) != XML_ERROR_NONE) {
+ return xml_error_string($c);
+ } else {
+ return null;
+ }
   }

+ // parcours la structure "actions" et en déduit un code php effectuant les
+ // appels sql correspondants.
   function getCode($liste=null) {
     if(!$liste) {
       $l= $this->liste;
     } else {
       $l= $liste;
     }
- echo "<xmp>getSql:".var_export($l, 1)."</xmp>";
+ //echo "<xmp>getSql:".var_export($l, 1)."</xmp>";
     $res='';
     foreach($l as $action) {
       if($action['type']=='insert') {
@@ -64,9 +84,9 @@
         $valeurs= '('.join(", ", array_values($action['field'])).')';
         $appel= "spip_abstract_insert(\"$table\",\"$colonnes\",\"$valeurs\")";
         if($id=$action['id']) {
- $res.="\n && (\$var_tmp_$id= $appel)";
+ $res.="\n && (\$tmp_var_$id= $appel)!==false";
         } else {
- $res.="\n && $appel";
+ $res.="\n && $appel!==false";
         }
       } else {
         $set= array();
@@ -181,6 +201,7 @@
       //array_unshift($this->state, $name);
       array_unshift($this->actions,
               array('type' => 'select',
+ 'aFaire' => 'oui',
                 'table' => $attrs['type'],
                 'colonne' => $attrs['name']));
       break;
@@ -209,8 +230,9 @@
       // die("fin update/insert inattendu");
       //}
       $a= array_shift($this->actions);
- echo "FERME ".var_export($a, 1);
- if($a['aFaire']=='oui' && $a['field']!=array()) {
+ //echo "FERME ".var_export($a, 1);
+ if($a['aFaire']=='oui'
+ && ($a['field']!=array() || $a['where']!=array()) ) {
         unset($a['aFaire']);
         if(count($this->actions)) {
           $this->actions[0]['sousActions'][]= $a;
@@ -222,7 +244,7 @@

     case 'field':
       //if($st!=$name) {
- // die("fin key/field inattendu");
+ // die("fin field inattendu");
       //}
       //array_shift($this->state);
       break;
@@ -275,8 +297,8 @@
         $table= $table['table'];
         $res.="\n && (($var=spip_abstract_fetsel(\""
           .$value['colonne']."\", \"".$table
- ."\", \"$where\")) && ($var= ${var}['"
- .$value['colonne']."']))";
+ ."\", \"$where\"))!==false && ($var= ${var}['"
+ .$value['colonne']."'])!==false)";
         $value= "\".$var.\"";
       }
     } else {

Modified: _plugins_/_ze_laboratoire_/editables/inc/actionParserTest.php

--- _plugins_/_ze_laboratoire_/editables/inc/actionParserTest.php (original)
+++ _plugins_/_ze_laboratoire_/editables/inc/actionParserTest.php Wed Jun 21 15:40:24 2006
@@ -3,5 +3,5 @@
include("actionParser.php");
$parser = new actionParser("aze");
$parser->parse($actions);
-echo $parser->getSql();
+echo $parser->getCode();
?>

Modified: _plugins_/_ze_laboratoire_/editables/inc/actions.exemple

--- _plugins_/_ze_laboratoire_/editables/inc/actions.exemple (original)
+++ _plugins_/_ze_laboratoire_/editables/inc/actions.exemple Wed Jun 21 15:40:24 2006
@@ -1,29 +1,31 @@
<actions>
<update type='articles'>
- <key name='id_article' value='1'/>
+ <where name='id_article' value='1'/>
   <field name='titre' valueFrom='titreArt1'/>
   <field name='surtitre' valueFrom='surtitreArt1'/>
</update>

<update type='articles'>
- <key name='id_article' value='2'/>
+ <where name='id_article' value='2'/>
   <field name='titre' valueFrom='titreArt2'/>
   <field name='surtitre' valueFrom='surtitreArt2'/>
</update>

+<!--
<update type='pipo'>
- <key name='id' value='42'/>
+ <where name='id' value='42'/>
   <field name='titre' valueFrom='pipo42'/>
</update>

<insert type='pipo' id='pipo1'>
- <key name='id' value='42'/>
+ <field name='id' value='42'/>
   <field name='str' valueFrom='pipo1'/>
</insert>
<insert type='pipo' id='pipo2'>
   <field name='id' value='24'/>
   <field name='str' valueFrom='pipo2'/>
</insert>
+-->

<insert type='articles' id='art'>
   <field name='titre' cond='!' valueFrom='titreNewArt'/>
@@ -32,9 +34,9 @@
   <callback>???</callback>
   <field name='id_rubrique' cond='!' valueFrom='rubrique'/>
   <field name='id_secteur'>
- <get type='rubriques' name='id_secteur'>
+ <select type='rubriques' name='id_secteur'>
       <where name='id_rubrique' valueFrom='rubrique'/>
- </get>
+ </select>
   </field>
</insert>
<insert type='auteurs_articles'>

Modified: _plugins_/_ze_laboratoire_/editables/test2.action.html

--- _plugins_/_ze_laboratoire_/editables/test2.action.html (original)
+++ _plugins_/_ze_laboratoire_/editables/test2.action.html Wed Jun 21 15:40:24 2006
@@ -9,22 +9,6 @@
</update>
</BOUCLE_arts>

-<BOUCLE_pipo(PIPO)>
-<update type='pipo'>
- <where name='id' value='#ID'/>
- <field name='titre' valueFrom='pipo#ID'/>
-</update>
-</BOUCLE_pipo>
-
-<insert type='pipo'>
- <where name='id' value='42'/>
- <field name='str' valueFrom='pipoNew1'/>
-</insert>
-<insert type='pipo'>
- <field name='id' value='24'/>
- <field name='str' valueFrom='pipoNew2'/>
-</insert>
-
<insert type='articles' id='art'>
   <field name='titre' obligatoire='1' valueFrom='titreNewArt'/>
   <field name='surtitre' valueFrom='surtitreNewArt'/>

Modified: _plugins_/_ze_laboratoire_/editables/test2.html

--- _plugins_/_ze_laboratoire_/editables/test2.html (original)
+++ _plugins_/_ze_laboratoire_/editables/test2.html Wed Jun 21 15:40:24 2006
@@ -10,14 +10,6 @@

<br><br>

-<BOUCLE_pipo(PIPO)>
-#ID : #STR =&gt;<br/>

[... 10 lines stripped ...]