Aide au projet spx : plugins pour pluxml - Forums pluxml
Vous n'êtes pas identifié(e).
En lisant spxdatas.php pour reporter mes modifs, notamment les "/n/t" qui m'aident à mieux lire mon xml, je découvre spxdatasXmlmanager et spxdatasJsonmanager.
Se pourrait-il que mon bug vienne des décalages et saut de ligne dans la structure du .xml ?
tant que j'y suis je te donne mes autres modifs :
[== PHP ==]
# ajout pour accéder directement au 999ème enregistrement (méthode bancale avant que j'utilise les formulaires)
public function initconfiguration() {
if (isset($_GET['data_id'])and $_GET['data_id']!=""){
$this->setParam('nb_data_pagination','1000','numeric');
$this->setParam('data_id',$_GET['data_id'],'numeric');
$this->setParam('pager',($_GET['data_id']/30+1),'numeric');
}
}
# select multicolonne bibi
case "liste":
$table = $aoption[1];
$column = $aoption[2];
$column1="";
$column2="";
$column3="";
if(stristr($column, "|")!=false){
$col=explode('|', $column);
$column=$col[0];
$column1=$col[1];
$column2=$col[2];
$column3=$col[3];
}
else {$column=$aoption[2];}
$data = $this->aDatas[$table];
$printarray = array();
foreach($data as $val) {
$valliste = $val["data"][$column]["value"];
if($column1!=""){$valliste.= "|".htmlspecialchars(stripcslashes(trim($val["data"][$column1]["value"])))."|";} #title
if($column2!=""){$valliste.= " - ".$val["data"][$column2]["value"];} #bibi
if($column3!=""){$valliste.= " - ".$val["data"][$column3]["value"];} #bibi
$idliste = $val["number"];
$printarray[$idliste]=$valliste;
}
natsort($printarray);
return (spxdatasUtils::printSelect ($name.'[]', $printarray,$value));
break;
case "date":
$id = "id_".$name.$number_id;
$s= spxdatasUtils::printInput2 ($id,$name."[]", $value, 'text', "10-10",$reado);
$s.="\n\t".'<script>';
$s.="\n\t".'$(document).ready(function() {';
//$s.="\n\t".'$("#'.$id.'").datepicker();'; #original
$s.="\n\t".'$("#'.$id.'").datepicker({ dateFormat: "yy-mm-dd" });'; #bibi
Ces modifs mineures n'ont aucun rapport avec mon problème, j'ai cependant le doute concernant les sauts de ligne ?
En espérant t'avoir donné le maximum d'éléments.
Bonjour Jéjé, merci de ta réponse.
C'est une bonne idée d'avoir allégé la partie administration, hélas je n'ai pas plus de succès avec cette version.
Au final j'utilise getData, delData et setData uniquement pour un nouvel enregistrement.
J'ai un bout de code qui fonctionne bien pour les modifs, même si je suis obligé d'alourdir mon code d'une variable contenant le fichier xml.
[== PHP ==]
if(isset($_POST['modif'])){
# méthode qui marche en frontend, ! penser à changer variables
$fichier='data/xmlperso/data/'.$table.'.xml';
$client=(isset($_POST['client']))? 1:"";
# méthode qui charge $fichier dans le string $contenu
$contenu = implode('',file($fichier));
$parser = xml_parser_create(PLX_CHARSET);
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);
xml_parse_into_struct($parser,$contenu);
xml_parser_free($parser);
# chaîne à remplacer
$A=explode('<data number="'.$id.'"',$contenu);
$B=explode('<data',$A[1]);
$original='<data number="'.$id.'"'.$B[0];
# chaîne de remplacement
$C=explode('<parameter',$original); //récupérer l'original de <data... jusqu'à <column>
$xml = $C[0];
# tableau des ![CDATA
$column=array("nom","personne","fixe","mobile","idgroupe","mail","ip","site","adresse","rem");
for ($i=0;$i<count($column);$i++){
if(isset($_POST[$column[$i]])){
$xml.= '<parameter name="'.$column[$i].'" type="cdata"><![CDATA['.plxUtils::strCheck($_POST[$column[$i]]).']]></parameter>'."\n\t\t";
}
}
# strings
$xml.= '<parameter name="client" type="string">'.$client.'</parameter>'."\n";
$xml.= "\t</column>\n";
$xml.= "</data>\n";
# replacement segment xml
$xml = str_replace($original,$xml,$contenu);
# vérifie si </document> existe à la fin sinon le rajouter (# cas dernier record supprimé)
$xml.= (strpos(substr($xml,-20,20), '</document>')) ? "" : "</document>";
# écriture
plxUtils::write($xml,$fichier);
# actualise la page
echo '<script>window.location.replace("'.$url.'&id='.$id.'");</script>';
}
Ma méthode peut paraitre sauvage mais elle marche. Ton plugin est magnifique, je doute que tu doives te donner plus de mal pour la console d'administration car je me rends compte, à l'usage, que rien ne vaut un bon vieux formulaire en page statique pour administrer la base. Ne serait-ce que pour obtenir un optgroup ou disposer d'un incontournable champ de recherche.
En espérant que tu profites du soleil qu'il fait aujourd'hui, bonne journée.
Steph
Bonjour J.E.
je prend l'exemple d'une table contenant 10 entrées ici
j'enregistre uniquement coté client (pas par l'admin)
j'ai fait la modif comme expliquée sur http://secretsitebox.fr/forumspx/viewto … d=730#p730
le php de la page statique est déjà affiché sur ce site mais je peux le remettre si nécessaire
aucun problème en création,
aucun problème en modification
...sauf lorsqu'il s'agit du dernier enregistrement : le fichier .xml est réécrit avec un data number=""
- idem que je sois enregistré ou pas
- var_dump($o) confirme que le tableau est bien renseigné, notamment $o['id']
- j'ai testé en supprimant des enregistrements (dès fois qu'une simple ou double quote dans un champ plante la réécriture).
- je pensais à une limite au 51ème enregistrement, mais la version en ligne attesterai que c'est sur le dernier record que ça plante (ligne test5)
- j'ai parcouru setData, posé des var_dump() un peu partout...et revu mon niveau en php à la baisse pour l'occasion.
là où c'est dingue, c'est qu'il arrive que ça marche pour le 250ème enregistrement et pas le 251ème (d'où le fait que j'aie d'abord mis en cause mes données)
[edit]
en fait ça marche les 10/20 premières minutes puis basta, la variable SESSION n'est pourtant pas modifiée mais on dirait un timer qui planterai l'écriture après x minutes
[/edit]
une suggestion ?
merci de m'avoir lu, bonne soirée
bonjour,
afin de soulager ton travail de dev, ne serait-il pas plus confortable de gérer les selects ou les checkbox (voire tout autre champ) à travers une table contenant
id
nom
code
ceci pour éviter de rajouter dans spxDatas.php les cases persos du style
[== PHP ==]
case "listeBibi":
$table = $aoption[1];
$column = $aoption[2];
$column1="";
$column2="";
$column3="";
# select multicolonne bibi
if(stristr($column, "|")!=false){
$col=explode('|', $column);
$column=$col[0];
$column1=$col[1];
$column2=$col[2];
$column3=$col[3];
}
else {$column=$aoption[2];}
# /bibi
$data = $this->aDatas[$table];
$printarray = array();
foreach($data as $val) {
$valliste = $val["data"][$column]["value"];
if($column1!=""){$valliste.= "|".htmlspecialchars(stripcslashes(trim($val["data"][$column1]["value"])))."|";} #title
if($column2!=""){$valliste.= " - ".$val["data"][$column2]["value"];} #bibi
if($column3!=""){$valliste.= " - ".$val["data"][$column3]["value"];} #bibi
$idliste = $val["number"];
$printarray[$idliste]=$valliste;
}
natsort($printarray);#bibi
return (spxdatasUtils::printSelect ($name.'[]', $printarray,$value));
break;
Je propose ça car même dans le cas des checkbox, ce sont nos besoins respectifs qui déterminent principalement le contenu et son affichage.
Exemple de checkbox multiple en frontEnd qui fait un saut de ligne toutes les $v0 valeurs affichées....because pas la place en largeur :
[== PHP ==]
function checkbox($v0,$v1,$v2,$v3,$urlpage){
$i=0;
while( list( $value, $g ) = each( $v1 ) ){
$v=$g['plantes_'.$v3.'_id'];
$check1 = (in_array($v,$v2)) ? "checked" : "";
if($check1!="" ){$b="<b>";$b1="</b>";} else {$b="";$b1="";}
if ($i>$v0){$saut="<br/>"; $i=0; }
echo $saut.'<input type="checkbox" name="f'.$v3.'[]" value="'.$v.'" '.$check1.'/>'
.$b.'<a href="'.$urlpage.'&'.$v3.'='.$v.'" title="'.$g['desc'].'" class="no-link">'.$g['tit']
.'</a>'.$b1;
$i++; $saut="";
}
}
exemple en ligne : http://domainedebelleroche.free.fr/inde … plante=540
effectivement c'est prometteur...
concernant $o['filter'], je ne m'en sert que pour alléger le poids du tableau avant un tri plus approfondi car il ne prend que des variables simples (data1=x and data2=y)
au final il me sert surtout pour discriminer l'$id de façon à afficher rapidement un résultat unique.
je poste mon code ci-dessous si ça peut servir à quelqu'un :
[== PHP ==]
$o["table"]=$table;
$filters="";
foreach ($_SESSION['search'] as $a=>$b){
if ($b!=""){$filters.=$a.'='.$b.' and ';}
}
if ($filters!=""){$o["filter"] =substr($filters,0,-5);} //supprimer dernier " and "
if ($id!="") {$o["filter"]== $table.'_id='.$id;} //prédominance à l'id
$query = $plxShow->callHook('spxdatas::getData',$o); //$id et selects filtrés
# filtrage du texte sur $query restant
foreach($query as $a => $b){
#filtre 1 : texte
if ($chaine!=""){
if( stristr($b['champtexte1'], $chaine)==false AND
stristr($b['description'], $chaine)==false) AND
stristr($b['grosTextarea'], $chaine)==false) AND
stristr($b['bigstring'], $chaine)==false)
{unset($query[$a]);}
}
}
1. $table parce que j'avais 6700 lignes dans phpMyAdmin à transférer, j'ai donc découpé par année de saisie
2. $_SESSION['search'] contient les requêtes simples des selects (champ=>valeur). Pratique pour conserver l'affichage du tableau trié en même tps qu'on saisi de nouveaux enregistrements.(copier/coller c'est moins fatiguant)
3. getData ne part qu'après être épuré au maximum. Je suis un traumatisé du Fatal error Memory...forcément avec Free. (au point d'avoir pondu un plugin pour gérer ça).
4. le dernier foreach intervient pour la recherche de texte et filtre autant de champ que nécessaire
5. c'est là que je place les champs select ou chkbox multiples car $o['filter'] ne fait pas d'explode sur un string (001|002|003|004)
bref, tout ça pour lire qu'un type à sorti une gestion JSON de BDD qui sera du tonnerre !
...tant pis, j'aurais appris à le faire
Bonne soirée.
pas de soucis, avec l'âge je me réponds tout seul
la nature fait décidément bien les choses : je viens de me prendre la tête avec $o['id']="" pour enregistrer coté client, impossible de forcer l'écriture avec sizeof($query)+1...entre autres
je retourne lire ce que permet json, ça doit être très prometteur
bonne soirée.
Afin de faire gagner du temps à ceux qui comme moi, ont pédalé des lustres, mais ont appris bcp :
il existe la fonction magique setData()...et tout redevient simple !
sacré boulot le jéjé, bravo !
qd ce sera propre je posterai mes modifs sur spx (case:"liste" augmenté à coup de strpos et d'explode, accès direct au 738ème enregistement dans l'admin...)
bonne journée
Dans la catégorie "ne pas réinventer la roue" et utilisez toutes les belles fonctions de spxdatas :
Comment pourrait s'utiliser le parseur de loadTables() dans une page statique ?
j'ai essayé sans succès :
$test= $plxShow->callHook('spxdatas::loadTables', 'data/contacts2.xml');
PS: j'ai remplacé DOM par xml_parser_create et consorts : ça tourne impec !
je m'auto-répond si qq'un se pose un jour la mm question :
1. afficher la valeur des champs dans des input (si les droits d'accès sont accordés)
2. requete DOM dans la page statique sur le fichier xml contenant la base. Ex :
$dom = new DomDocument();
$dom->load('data/tables/monfichier.xml');
3. modifier le contenu en fonction des champs modifiés
4. $dom->save('data/tables/monfichier.xml'); ou plxUtils::write($xml,'data/tables.monfichier.xml')
je modifie ainsi mon enregistrement :
1. directement en le consultant
2. quelle que soit son id
3. sans passer par la console d'administration (trouve l'enregistrement, appuie "éditer" si les enregistrements sont ordonnés en javascript, trouve le champ à modifier au milieu des éditeurs textarea)
4. l'accès aux fonctions de création/modification/suppression se gère via $_SESSION['user'] dans la page statique
Il existe peut-être des fonctions natives à pluxml ou spx pour ne pas réinventer la roue avec DOM mais tout ce que j'ai testé à échoué...
bonne journée
is there anyboby out there ? (bon morceau de Pink Floyd aussi)
Bonjour J-E, bonjour tout l'monde
je dispose en public d'un lien vers la valeur en base du type :
<a href="/core/admin/plugin.php?p=spxdatas&page=data_edit&table=plantes&data_id=738">
ce qui veux dire en clair :
1. data_edit.php demande à getAdminOneData() l'id recherchée
2. getAdminOneData() crée $dataliste = $this->getAdminData($table,$data_file_name);
3. $dataliste ne contiendra que nb_data_pagination enregistrements
...et c'est tout mon problème : mon lien ne marche que pour les 30 premiers enregistrements d'une table et comme il n'y a pas de recherche en admin...
je me tâte entre plusieurs soluces, plus immondes les unes que les autres, dont celle-ci :
[== IndéfiniMix ==]
$test = $data_id / $nb_data_pagination;
$test = arrondi_moi_tout_ça($test);
<a href="core/admin/plugin.php?p=spxdatas&pager='.$test.'">
désolé si ça pique les yeux, et toi grosso-modo tu ferais comment ?
bonne soirée !
salut du matin, ça tourne impec !
Il semble que maxrecorduser ait la prédominance sur maxrecord (ordre de traitement j'imagine)
J'ai dumpé une table SQL qui avait 728 entrées : aucun problème en lecture, juste en enregistrement.
Je pressens un tas de choses faisables avec ta bête, ça donne envie de s'y coller.
Merci Jéjé
eupe, salut les Plu(sp)xiens !
Alors Jack, ça tape du code ?
Jéjé, je sais que tu n'as pas le temps, mais deux réponses courtes STP :
1.ton spx peut gérer jusqu'à combien d'entrées ?
2. à quoi sert $acmd["C"]=="1" dans data_liste.php ?
bye tout l'monde
Steph
C'est bon signe. Bien reçu.
c'est si grave que ça docteur ?
hier c'est parti sur @neuf,
ce matin c'est parti sur secretsite, d'ailleurs tu n'as pas de msg de confirm à l'écran ?
bonne journée
j'ai répondu en passant par l'atelier du peintre, histoire de mater un peu les toiles.
t'es doué !
Salut J-E
C’est pas la syntaxe française qui me chagrine, mais dans l’administration j’ai une table qui m’affiche :
« Nombre de d´enregistrement maximum atteint » en gros <H agressif>
La table fait 1.5Mo avec 738 enregistrements à peine.
J’ai remonté les variables depuis le fichier lang mais arrivé à $cmd…on dirait un problème de droits ?
La table est pourtant bien configurée :
<table name="plantes" maxparam="5" groupe="plantes" tableuserlevel="0,1,2,3,4" datauserlevel="0,1,2,3,4">
Bref, je patauge !
Tu connais un moyen de contourner ça ?
PS : C’est passionnant ce que tu fais avec spx.
Je navigue dans « éditer base » et ça donne envie de tout toucher
Merci de ton aide et bon week-end...si t'en as
Have a nice PluXml day !
je dois aller bosser mais là j'ai accroché.
bref, résolu...en désactivant le plugin shortcode
désolé !
bonjour tout l'monde
on oublie les lignes précédentes, le filtrage marche désormais.
le code ci-dessous contourne la syntaxe $o['filter'] mais je laisse en com les lignes idoines pour ceux qui voudraient requêter sur plusieurs champs...à condition que ce ne soit pas des array.
[== PHP ==]
# recherche sur toutes les fiches plantes
$o2= array();
$o2["table"]="plantes";
/*
# utilisation $o2["filter"] impossible car gamme,statut...= impossible si plusieurs valeurs ex:"001 002"
$o2filters="";
$filters=array();
if($gamme_id!=""){$filters[].= 'gamme='.$gamme_id;}
if($statut_id!=""){$filters[].= 'statut='.$statut_id;}
foreach ($filters as $key=>$text){
$and = ($key>0 ) ? " and " : "";
$o2filters .= $and.$text;
}
$o2["filter"] = $o2filters;
*/
$o2["order"]="genre|A";
//$o2["limit"] = 100;
$o2["out"]="array";
$plantes = $plxShow->callHook('spxdatas::getData',$o2);
$plante_s= array();
$nom_s= array();
$gamm_s= array();
$stat_s= array();
$cate_s= array();
$expo_s= array();
# boucle de tri
foreach ($plantes as $p)
{ $id_fiche = $p['plantes_id'];
$plante_s[].=$id_fiche;
#application des filtres
if ($nom!=""){
if(stristr($p['famille'], $nom)!=false){$nom_s[].=$id_fiche; } //OK
if(stristr($p['genre'], $nom)!=false) {$nom_s[].=$id_fiche; } //OK
if(stristr($p['espece'], $nom)!=false) {$nom_s[].=$id_fiche; } //OK
if(stristr($p['variete'], $nom)!=false) {$nom_s[].=$id_fiche; } //OK
if(stristr($p['synonymes'], $nom)!=false) {$nom_s[].=$id_fiche; } //OK
}
$gamm=explode(' ', $p['gamme']);
if($gamme=id!="" and in_array($gamme_id, $gamm)) { $gamm_s[].=$id_fiche;}//array_push($fiches_selected, $id_fiche)
$stat=explode(' ', $p['statut']);
if($statut_id!="" and in_array($statut_id, $stat)) { $stat_s[].=$id_fiche;}
$cate=explode(' ', $p['categ']);
if($categ_id!="" and in_array($categ_id, $cate)) { $cate_s[].=$id_fiche;}
$expo=explode(' ', $p['exposol']);
if($expo_id!="" and in_array($expo_id, $expo)) { $expo_s[].=$id_fiche;}
}
# nettoyage des fiches retenues
$ordre = array("nom_s"=>sizeof($nom_s),"gamm_s"=>sizeof($gamm_s),"stat_s"=>sizeof($stat_s),"cate_s"=>sizeof($cate_s),"expo_s"=>sizeof($expo_s));
arsort($ordre);
foreach ($ordre as $or=>$dre)
{ if ($dre!=0){
switch ($or){
case "nom_s": $param=$nom_s; break;
case "gamm_s": $param=$gamm_s; break;
case "stat_s": $param=$stat_s; break;
case "cate_s": $param=$cate_s; break;
case "expo_s": $param=$expo_s; break;
}
$plante_s = array_intersect($plante_s, $param);
}
}
unset ($ordre);
#affichage des fiches selectionnées
echo sizeof($plante_s).' réponses sur '.sizeof($plantes).' fiches <br/>';
// à partir de là : Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 76 bytes)
$i=0;
$nb=30;
# sans photos
foreach ($plantes as $a)
{ echo'<div style="width:240px; float:left;">';
$plantes_id = $a["plantes_id"];
if(in_array($plantes_id, $plante_s))
{ if($i==$nb){ $i=0; echo'</div><div style="width:240px; float:left;">';}
echo'<li><a href="'.$urlpage.'&plante='.$plantes_id.'" alt="no photo" title="ouvrir fiche individuelle n°'.$plantes_id.' '.$a["synonymes"].'" >
<b align="center">'.$a["genre"].' '.$a["espece"].' '.$a["variete"].'</b>
</a></li>';
$i++;
}
echo'</div>';
}
Bref ça tourne impec en local..sauf en distant où j'ai Fatal error: Allowed memory (...)
Le tableau est traité piske j'ai le compte juste d'enregistrements filtrés, ça buggue dès qu'on passe à l'affichage (même echo $i;)
j'ai posé des unset()
j'ai testé les solutions php.ini, htaccess (memory_limit = 64)...sans succès (oh, un apache_error de 2Go )
je n'ai pas encore testé d'ouvrir les résultats dans une autre page, mais serais-ce la solution ?
jéjé STP, une idée ?
[edit] http://domainedebelleroche.free.fr/inde … 00/plantes [/edit]
Bonjour les Pluxiens
@jérome, j'ai élagué au max mais il en reste un dossier compressé de 10Mo
je vais essayer de te l'envoyer en PJ sur le mail de ce site, sinon j'essaierai la boite sur laquelle nous avons déjà correspondu (si ça se trouve c'est la même ?)
Gardez la forme les gars !
Je remercie le pasteur et l'auteur
Cependant, je sortirai le champagne qd j'arriverai à filtrer sur l'input...
J'ignore si vous avez testé, mais difficile de parler de tri si je n'obtiens pas cet élément de base
L'auteur aurait une suggestion, le pasteur une prière ?
Cher Jack, je te propose d'attendre la solution à ce problème avant de partager le lien :
- l'url sera domaine.free.fr et pas paysan hardi
- avoir une solution pour l'input me permettra de dumper de grosses tables sql associées à la table botanique
- je dois aussi obtenir un select multiple dans plxdata à partir de l'exemple des chkbox
- encore bcp de modifs à porter au template
J'avais proposé mon aide sur le forum pluxml pour rédiger la doc,
partant du principe qu'on ne parle bien que de ce que l'on connait, j'attendais de maitriser la bête pour me manifester.
Vu que je n'y suis pas encore...j'ai donc posté un code inabouti.
bonne soirée
Bonjour,
c'est en ligne sur http://paysanhardi.free.fr/index.php?static10/plantes
Imaginez un mur en pierre en background (bug css à corriger)
Des modifs mais pas de soluce en vue pour récupérer la valeur de l'input en javascript (pour éviter de me taper un plugin)
bonne journée !
salut les gars,
affres de la mise en ligne : le slider buggue à la seconde image (pb de css surement) alors qu'en local c'était parfait (cache vidé, ect..)
je revois ça ce soir
bonne journée
Ayé !
http://paysanhardi.free.fr/index.php?
je mettrais en ligne ce week-end (gros copier/coller image, vidéos,etc)
sur http://domainedebelleroche.free.fr/ (actuellement sous joomla)
bonne soirée les gars, ici on passe à table !