[plugin]ixePaf

Bonjour les pluxiens,

je viens de chercher Xpath sur le forum et personne ne semble avoir évoqué la possibilité de faire un plugin de gestion de BDD (tables, formulaires génériques,etc.) sur la base de requêtes Xpath
spxData est un beau bébé, sauf que les gueux hébergés par Free (dont je fais partie) n'ont pas accès aux fonction JSON, array_fill_keys... et mémoire à gogo.

j'ai donc pondu une classe sans prétention dont la fonction getData a surtout le mérite de filtrer dans le fichier xml uniquement les éléments dont j'ai besoin
(avec limit par défaut). En gros, le tableau de retour est bien expurgé par Xpath avant d'être constitué (choix des champs,etc)

L'air de rien, j'arrive à interroger une table de 4Mo(format spx) en 1.467 s et un peak qui reste à 8,5mo (au lieu de 35 pour la même page sous spx, mais j'ai fait moins de fonctions :P )
J'en suis au stade de me rendre compte que ces heures de boulot buttent sur qq problèmes ballots du style :
[== PHP ==]
if ($x['inputsearch']!="") {$xpaf='//data[column/parameter[contains(text(),"'.htmlentities($x['inputsearch']).'")]]';} #OK mais !case-sensitive
ou encore qq pb de croisement de filtres
[== PHP ==]
# 2.3. $x['filtres']='select1=275 and select2=224' ou 'bolan=1'
		# bug contacts.php : $x['filtres']='select1=310 and bolan=1'; pb cdata ?
		if ($x['filtres']!=""){ //
			if( stristr($x['filtres'], " and ")!=false) {
				$filtres = explode( " and " , $x['filtres'] );
			}else { $filtres[0] = $x['filtres']; }
			$i=0;
			foreach ($filtres as $filtre){
				if( stristr($filtre,'=')!=false){$filtre=explode('=',$filtre);
				}else { $filtre[0] = $filtre; }		 
				$conditions[$i]= array($filtre[0], $filtre[1]);
				++$i;
			}		
			$xpaf="//data";
			foreach ($filtres as $filtre){
				if( stristr($filtre,"=")!=false) { $filtre=explode("=",$filtre); }		 
				$xpaf .= '[column/parameter[@name="'.$filtre[0].'" and text()="'.$filtre[1].'"]]';
			}
			unset($filtres);	
		}		

(je ne laisse rien en ligne, c'est une appli perso, les variables ne sont pas encore protégées, néanmoins adieu le fatal_error_memory_size ]:D )

D'où la question que je pose : est-ce que ça vaut la peine de continuer ou Xpath est une voie sans issue ?

Réponses

  • paysan hardipaysan hardi Member
    janvier 2015 modifié
    89 vues et aucun avis sur l'évolution de la syntaxe Xpath ?
    Bien sûr que je vais continuer !!!!

    D'une, parce que taper du code me plait et j'aime avoir ce que je veux
    Deusse, parce que tous les manuels sont dispos sur le réseau
    Troisse, parce que j'en apprends tous les jours sur les subtilités de votre métier de devs ^^

    Je vous dis donc @ bientôt avec un code bien propre téléchargeable à soumettre à vos avis
  • Je ne suis pas un expert xPath, mais j'aime ce langage de lecture XML. Je ne connais pas ses avantages/inconvénients par rapport à d'autres méthodes, mais je l'aime pour sa simplicité (quand on en est à faire un requête xPath compliquée, c'est que ça aurait été quasi-impossible de faire la même requête autrement, sauf à utiliser quelques dizaines de ligne de code).
    Aucune idée de "l'évolution de la synthaxe xPath", et je dois admettre que je ne comprends pas trop ta question, ce qui explique peut-être que personne ne t'ait répondu ?
  • paysan hardipaysan hardi Member
    janvier 2015 modifié
    J'adore SQL : en 8 lignes lisibles, tu requêtes plusieurs tables pour récupérer un tableau croisé en sortie, mais on s'éloigne de pluxml

    Tu as raison, mettre des extraits de code pour illustrer mon propos n'a servi qu'à brouiller la question finale.
    Je voulais illustrer l'inconvénient de la recherche text() case-sensitive...chose que j'ai découverte à une étape bien avancée, rien de rédhibitoire, ça rajoute juste des lignes pour contourner
    Mon message avait pour but de savoir si d'autres surprises m'attendaient, comme une dépréciation programmée que je n'aurais pas trouvé dans mes recherches mais dont qq'un ici aurait eu connaissance.

    J'attendais juste un retour d'expérience comme le tien pour ne pas bosser dans le vide, rien de plus.

    Avec le même esprit, j'ose une question supplémentaire :
    - l'administration du plugin permet l'écriture des paramêtres des tables dans base.php (je ne parle pas des params du plugin avec $plxPlugin)
    - j'include base.php dans la fonction initialisation{} pour récupérer sa variable $aTables qui contient droits,label,champs,etc.
    - avec $this->aTables = $aTables; je peut l'utiliser partout dans la classe, sans solliciter aucune fonction de lecture (gain de tps, de calcul, de code,etc.)
    - en écriture je passe par quelques foreach puis file_put_contents...comme si j'updatais un .xml ou un .txt

    Tu ferais pareil que moi ou tu stockerai un .xml, avec une fonction pour l'écriture et autant pour la lecture ?
  • Il est difficile de te répondre car on ne sait pas où tu en es dans ton projet ni comment tu as codé tout ça.
    Il faudrait qu'on puisse jeter un oeil à la source pour comprendre ce que tu veux dire.
  • cet extrait devrait illustrer ma dernière question, à moins que ce ne soit contre-indiqué, je garderai l'include du fichier qui contient $aTables, d'autant qu'aujourd'hui j'ai bataillé pour son écriture.
    [== PHP ==]
    protected $aTables=array();
    	
    	public function __construct($default_lang) {
    		parent::__construct($default_lang); # Appel du constructeur de la classe plxPlugin (obligatoire)
    		$this->initconfiguration();
    		# droits pour accèder à la page config.php du plugin
    		$this->setConfigProfil(PROFIL_ADMIN);
    		$this->setAdminProfil(PROFIL_ADMIN); //, PROFIL_MANAGER, PROFIL_MODERATOR, PROFIL_EDITOR, PROFIL_WRITER
    		
    		# Personnalisation du menu admin depuis configuration
    		if(defined('PLX_ADMIN')) {
    			if(preg_match('/(ixePaf)/', $_SERVER['QUERY_STRING'])) {
    				$this->addHook('AdminTopEndHead', 'AdminTopEndHead');
    			}
    		}
    		$this->setAdminMenu($this->getParam('mnuName'), $this->getParam('mnuPos'), $this->getParam('mnuCaption'));
    		$this->urlTables=$this->getParam('urlTables');
    		$this->urlMainStatique=$this->getParam('urlMainStatique');
    		$this->urlForms = PLX_ROOT.$this->getParam('urlForms');
    		$this->Xpagination = ($this->getParam('Xpagination')<=2)? $this->Xpagination=20 : $this->getParam('Xpagination');		
    		
    		## charge le fichier(base1) contenant l'array des tables au format :
    		# nom du formulaire = array (table, users, profils, form, champs=> array(name, label, type, width, class, filtre(true/false) )
    		include_once(PLX_ROOT.'plugins/ixePaf/config/'.$this->getParam('urlBase').'.php'); 
    		$this->aTables=$aTables; //utile pour Xlinks
    		# faire version recherche dans le fichier pour ne pas tout charger
    		
    		# Hooks
    		$this->addHook('initconfiguration', 'initconfiguration');
    		$this->addHook('ixePaf::getData', 'getData');
    		$this->addHook('ixePaf::delData', 'delData');
    		$this->addHook('ixePaf::setData', 'setData');
    		$this->addHook('ixePaf::lastIndex', 'lastIndex');# ranger ailleurs
    		$this->addHook('ixePaf::ixePaForm', 'ixePaForm');
    		//$this->addHook('ixePaf::urlMainStatique', 'urlMainStatique'); #désormais écrit dans ixePaForm
    		$this->addHook('ixePaf::Xlinks', 'Xlinks');
    		$this->addHook('ixePaf::Xtables', 'Xtables');
    		$this->addHook('ThemeEndHead', 'ThemeEndHead');
    	} 
    	
    	public function initconfiguration() {
    		# valeurs par défaut
    		if (plxUtils::strCheck($this->getParam('mnuName'))=="") $this->setParam('mnuName','ixePaf','string');
    		if (plxUtils::strCheck($this->getParam('mnuPos'))=="") $this->setParam('mnuPos','1','numeric');
    		if (plxUtils::strCheck($this->getParam('mnuCaption'))=="") $this->setParam('mnuCaption',$mnuCaption,'string');
    		if (plxUtils::strCheck($this->getParam('Xpagination'))=="") $this->setParam('Xpagination','20','numeric');		
    		if (plxUtils::strCheck($this->getParam('urlBase'))=="") $this->setParam('urlBase','base1','string');
    		
    		# rentre les fonctions
    		include_once(PLX_ROOT.'plugins/ixePaf/libs/fonctionsBibi.php'); 
    		#ini_set('memory_limit', '32M'); //pour test local	
    	}
    	
    	####################### fin pluxml
    	
    	### Tout part de là 
    	public function ixePaForm($form){# vérifie les droits et affiche la page demandée
    		if(empty($form) and !isset($_GET['form'])) { echo "vous n'avez spécifié aucune page"; return false;
    		}else{ # vérifie les droits
    			if (!in_array(abs($_SESSION['user']), $this->aTables[$form]['user'])) {echo'page r&eacute;serv&eacute;e &agrave; <a href="'.PLX_ROOT.'core/admin">l\'admin</a>';return false;}
    			else{ //$form = ($this->aTables[$form]['form']!='') ? $form : 'defaut';
    				$aTables = $this->aTables;
    				$aTables[$form]['urlMainStatique']=$this->urlMainStatique; //OK
    				$aTables[$form]['pagination']=$this->Xpagination; //OK
    				ob_start();
    				include_once($this->urlForms.''.$aTables[$form]['form'].'.php');
    				echo ob_get_clean();
    				return $aTables[$form];
    			}
    		}
    	}	
    	
    
    à la rigueur ce qui me choque à l'oeil c'est de répéter
    [== PHP ==]
    include_once(PLX_ROOT.'plugins/ixePaf/config/'.$this->getParam('urlBase').'.php'); 		
    $this->aTables=$aTables; //utile pour Xlink, une fonction plus loin qui met en onglet les $aTables[0]
    
    et après dans la fonction
    [== PHP ==]
    $aTables = $this->aTables;
    

    je maintiens que je repasserai qd se sera testable en ligne
Connectez-vous ou Inscrivez-vous pour répondre.