Author: christian_lefebvre@laposte.net
Date: Sun Jun 25 19:41:32 2006
New Revision: 3658
Log:
refonte totale du machin
Added:
_plugins_/_ze_laboratoire_/editables/action/
_plugins_/_ze_laboratoire_/editables/action/editer.php
_plugins_/_ze_laboratoire_/editables/inc/widgets/Hidden.php
_plugins_/_ze_laboratoire_/editables/inc/widgets/Vide.php
_plugins_/_ze_laboratoire_/editables/soumettre.action.html
_plugins_/_ze_laboratoire_/editables/soumettre.html
Removed:
_plugins_/_ze_laboratoire_/editables/inc/actionParserTest.php
_plugins_/_ze_laboratoire_/editables/inc/actions.exemple
_plugins_/_ze_laboratoire_/editables/inc/callbacks.php
_plugins_/_ze_laboratoire_/editables/test.html
_plugins_/_ze_laboratoire_/editables/test2.action.html
_plugins_/_ze_laboratoire_/editables/test2.html
Modified:
_plugins_/_ze_laboratoire_/editables/editable.php
_plugins_/_ze_laboratoire_/editables/inc/actionParser.php
_plugins_/_ze_laboratoire_/editables/inc/widgets/TextAreaWidget.php
Added: _plugins_/_ze_laboratoire_/editables/action/editer.php
--- _plugins_/_ze_laboratoire_/editables/action/editer.php (added)
+++ _plugins_/_ze_laboratoire_/editables/action/editer.php Sun Jun 25 19:41:32 2006
@@ -0,0 +1,88 @@
+<?php
+
+function action_editer() {
+ if (!isset($_REQUEST['widgets']) OR !is_array($_REQUEST['widgets'])) {
+ die("rien a faire la !");
+ }
+
+ // recuperer les autres morceaux et verifier qu'ils sont nets
+ $actions = urldecode($_REQUEST['actions']);
+ $callbacks = urldecode($_REQUEST['callbacks']);
+ $secu = $_REQUEST['actions_secu'];
+ if(!verif_secu($actions, $callbacks, $secu)) {
+ die("Actions truandees !");
+ }
+ $xml= doSpipInclude($actions);
+ echo "XML : $xml\n";
+ include_spip('inc/actionParser');
+ $parser = new actionParser();
+
+ $res= $parser->parse($xml);
+ //echo "RES : '$res'\n";
+ echo "ACTIONS : ".var_export($parser->actions, 1)."\n";
+ $cmds= $parser->evaluate($parser->actions);
+ //echo "PHP : ".var_export($cmds, 1)."\n";
+ foreach($cmds as $cmd) {
+ echo "=> $cmd\n";
+ if(eval("return (\$r= ($cmd))===false;")) {
+ die("erreur : $r");
+ }
+ }
+ if($parser->retour) {
+ $GLOBALS['redirect']= eval("return ".$parser->retour.";");
+ } elseif($retour = urldecode($_REQUEST['retour'])) {
+ $GLOBALS['redirect']= str_replace('&', '&', $retour);
+ }
+ echo "RETOUR : ".$parser->retour."/".$GLOBALS['redirect']."\n";
+}
+
+// A l'alle, on a calcule un md5 sur les elements sensibles, concatene a un peu
+// de sel (alea_ephemere). si ce qu'on recoit a le meme md5, c'est que
+// l'internaute n'a pas truande les valeurs
+// Petit hack en passant, on calcule sur action.alea.callback et pas
+// action.callback.alea pour pas risquer qu'un plaisantin mette action.callback
+// dans action et zappe donc les callback
+function verif_secu($v1, $v2, $secu) {
+ $ligne= $v1.' - '.$GLOBALS['meta']['alea_ephemere'].' - '.$v2;
+ error_log("verif_secu($v1, $v2, $secu) / ".$GLOBALS['meta']['alea_ephemere'].' => '.md5($ligne));
+ return ( $secu == md5($v1.' - '.$GLOBALS['meta']['alea_ephemere'].' - '.$v2)
+ OR $secu == md5($v1.' - '.$GLOBALS['meta']['alea_ephemere_ancien'].' - '.$v2) );
+}
+
+@define ('_INC_PUBLIC', 1);
+
+function doSpipInclude($fond) {
+ $GLOBALS['contexte_inclus']= $GLOBALS['contexte'];
+ $GLOBALS['contexte_inclus']['fond']= $fond;
+
+ $f = charger_fonction('assembler', 'public');
+ $page = inclure_page($fond, $contexte_inclus);
+ return $page['texte']; // A REVOIR : faire un eval ??
+}
+
+
+function balise_E_VALEUR($p) {
+ if (!$p->param || $p->param[0][0] || !$p->param[0][1]) {
+ erreur_squelette('VALEUR necessite 1 parametre');
+ return $p;
+ }
+ $nom= calculer_liste($p->param[0][1],
+ $p->descr, $p->boucles, $p->id_boucle);
+ $p->code= "(\$_REQUEST['content_'.$nom])";
+ return $p;
+}
+
+function balise_E_MODIFIE($p) {
+ if (!$p->param || $p->param[0][0] || !$p->param[0][1]) {
+ erreur_squelette('MODIFIE necessite 1 parametre');
+ return $p;
+ }
+ $nom= calculer_liste($p->param[0][1],
+ $p->descr, $p->boucles, $p->id_boucle);
+
+ $p->code= "(array_key_exists('md5_'.$nom, \$_REQUEST) && (!(\$md5 = \$_REQUEST['md5_'.$nom]) || \$md5!=md5(\$_REQUEST['content_'.$nom])))";
+ $p->interdire_script= false;
+ return $p;
+}
+
+?>
Modified: _plugins_/_ze_laboratoire_/editables/editable.php
--- _plugins_/_ze_laboratoire_/editables/editable.php (original)
+++ _plugins_/_ze_laboratoire_/editables/editable.php Sun Jun 25 19:41:32 2006
@@ -13,15 +13,6 @@
return $res;
}
-function doSpipInclude($fond) {
- $contexte_inclus = $GLOBALS['contexte'];
- $contexte_inclus['fond']= $fond;
- ob_start();
- include('ecrire/public.php');
- $inclu= ob_get_clean();
- return $inclu;
-}
-
function compactCallBacks() {
global $editable;
error_log("compactCallBacks:".var_export($editable['callbacks'], 1));
@@ -126,15 +117,14 @@
}
function editable_debut(&$editable) {
- return '"<form method=\'post\' name=\'zonesEditables\' action=\'ecrire/index.php\'>
- <input type=\'hidden\' name=\'exec\' value=\'editer\'>
- <input type=\'hidden\' name=\'retour\' value=\'".'.$editable['retour'].'."\'>
+ return '"<form method=\'post\' name=\'zonesEditables\' action=\'".self()."\'>
+ <input type=\'hidden\' name=\'action\' value=\'editer\'>
+ <input type=\'hidden\' name=\'retour\' value=\'".urlencode('.$editable['retour'].')."\'>
"';
}
function editable_fin(&$editable) {
- return '" <input type=\"submit\" value=\"ok\" />
- <input type=\'hidden\' name=\'actions\' value=\'".(urlencode($actions=doSpipInclude('.$editable['actions'].')))."\'>
+ return '"<input type=\'hidden\' name=\'actions\' value=\'".($actions='.$editable['actions'].')."\'>
<input type=\'hidden\' name=\'callbacks\' value=\'".urlencode($callbacks=compactCallBacks())."\'>
<input type=\'hidden\' name=\'actions_secu\' value=\'".md5($actions.\' - \'.$GLOBALS[\'meta\'][\'alea_ephemere\'].\' - \'.$callbacks)."\'>
</form>"';
Modified: _plugins_/_ze_laboratoire_/editables/inc/actionParser.php
--- _plugins_/_ze_laboratoire_/editables/inc/actionParser.php (original)
+++ _plugins_/_ze_laboratoire_/editables/inc/actionParser.php Sun Jun 25 19:41:32 2006
@@ -7,53 +7,34 @@
class actionParser {
var $parser;
- // les valeurs récupérées par le contexte et à utiliser dans les actions
- var $valeurs;
- // les ordres sql qu'on en déduit
- var $sql= array();
-
- // on part d'un etat 'vide' et on empile des etats 'actions' puis
- // 'update' ou 'insert' puis 'field' puis eventuellement 'select'
- var $state=array();
-
- // 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 cours de route (valeurs obligatoires
- // absentes principalement)
- var $errors= array();
- // compteur pour les variables temporaires generees
- var $tmpVars= 0;
+ // le insert/update en cours d'analyse
+ var $currentAction= null;
+ // le bloc where/set en cours
+ var $currentBloc= null;
+
+ // faut il ajouter le texte rencontre au le bloc courant
+ var $appendText= false;
+
+ // la liste des actions qu'on en deduit
+ var $actions=array();
+ // les valeurs de ref/id rencontres
+ var $ids= array();
// initialisation d'un parseur d'actions et des données de travail
- function actionParser($valeurs) {
- $this->valeurs= $valeurs;
+ function actionParser() {
$this->parser = xml_parser_create($GLOBALS['meta']['charset']);
xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
xml_set_object($this->parser, $this);
xml_set_element_handler($this->parser, "startElement", "endElement");
+ xml_set_character_data_handler($this->parser, "textElement");
}
// 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";
+ error_log("xml_parse");
xml_parse($this->parser, $data);
if(($c=xml_get_error_code($this->parser)) != XML_ERROR_NONE) {
@@ -63,151 +44,95 @@
}
}
- // 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>";
- $res='';
- foreach($l as $action) {
+ // récupère le tableau des actions a effectuer et en fait une série de
+ // codes php correspondant
+ function evaluate($actions) {
+ $varCpt=0; // compteur pour les variables intermediaires
+ $res= array();
+ foreach($actions as $action) {
+ $r= '';
if($action['type']=='insert') {
- foreach($action['field'] as $k => &$v) {
- $res.=$this->computeValue($v);
+
+ if($action['id']) {
+ $r.='$tmp_var_'.$action['id'].'= ';
}
$table= description_type_requete($action['table']);
$table= $table['table'];
- $colonnes= '('.join(", ", array_keys($action['field'])).')';
- $valeurs= '('.join(", ", array_values($action['field'])).')';
- $appel= "spip_abstract_insert(\"$table\",\"$colonnes\",\"$valeurs\")";
- if($id=$action['id']) {
[... 704 lines stripped ...]