Avant:[regex]Supprimer ce qui ne correspond pas | Après:Supprimer des noeuds XML

Eléphant du PHP | 443 Messages

14 oct. 2007, 15:17

donc que tu as généré le contenu xml pour lui.
Donc pourquoi produire un contenu hors limites ?
Euh...comment ça? :o
Ton fichier, a priori contient des coordonnées de cases dont le centre est (0,0), pour un utilisateur tu filtres les cases en mettant comme contraintes (6<x<-6 et 6<y<-6), ce qui me fait dire que l'utilisateur est au centre et donc que le fichier xml lui est personnel (à été généré pour lui).

La remarque que j'apportais etait la suivant: si l'xml a été produit pour lui pourquoi avoir introduit des cases hors contraintes ?

Mais j'ai sans doute loupé une marche, alors ne tiens pas compte de ma remarque...

Tracker.

Eléphant du PHP | 99 Messages

14 oct. 2007, 15:25

Non, il n'est pas généré pour lui.
En fait, j'ai codé un outil en Python qui code des cartes du monde sous forme de fichier xml (Kyria World Maker). La case en haut à gauche est la 1;1. Puis, dans ma base de données, j'ai les positions des joueurs (par exemple, 2;3 pour Babi, et 6;4 pour Babu). Tous les joueurs ont la même carte, mais des positions différentes.
Je positionne le joueur (et les cases) à l'aide des propriétées css "position", "top" et "left". Je met tout ceci dans une iframe, ce qui me permet de la recharger sans avoir à actualiser toute la page (c'est tjours ça de gagné ^^).
Donc je souhaiterais "élaguer" le fichier xml commun en fonction de la position des joueurs, pour que Babi n'ait accès qu'aux cases présentes entre -3 et 7 sur l'axe X, et -2 et 8 sur l'axe Y (je laisse une marge de 5 aux joueurs), et que Babu n'ait accès qu'aux cases présentes entre 1 et 11 sur l'axe X, et -1 et 9 sur l'axe Y.
Forcément, des cases seront vides (toutes celles inférieurs à 1), mais ça ce n'est pas grave.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

14 oct. 2007, 16:09

Est-ce que tu as essayé la solution de Tracker ? Il y a une petite erreur dans la condition du <xsl:if> mais sinon ça correspond à ce que tu cherches

Code : Tout sélectionner

<xsl:if test="@x >= -5 and @x <= 5 and @y >= -5 and @y <= 5">
Sinon, tu peux éventuellement le faire avec SimpleXML ou DOM, ou les deux. SimpleXML n'est pas fait pour supprimer des éléments, donc ce n'est pas particulièrement évident. Tu ne peux pas supprimer des éléments sur lesquels tu es en train d'itérer (en tout cas, pas à ma connaissance) donc tu dois les supprimer en deux temps : d'abord récupérer leurs positions dans la liste des éléments, puis ensuite supprimer effectivement les éléments. Avec comme piège le fait que chaque suppression fait remonter tous les éléments suivants d'un cran.

Pour référence, via SimpleXML (en imaginant que $cases représente le parent de tes éléments case)
$n = 0;
$del = array();

foreach ($cases as $case)
{
	if ($case['x'] > 5 || $case['x'] < -5 || $case['y'] > 5 || $case['y'] < -5)
	{
		$del[] = $n;
	}
	else
	{
		++$n;
	}
}

foreach ($del as $n)
{
	unset($cases->case[$n]);
}
Le même truc via SXE
$cases->deleteNodes('//case[@x < -5 or @x > 5 or @y < -5 or @y > 5]');
J'ai lu ça :
même en centièmes de secondes, c'est trop
...mais je pense que si tu en es à compter les centièmes tu as sûrement un problème ailleurs. Si le fichier existe apparement déjà, l'opération de suppression est le traitement principal de la page donc tu ne devrais pas te soucier de passer 0.01 ou 0.02 secondes... :-k

Eléphant du PHP | 99 Messages

14 oct. 2007, 17:38

Alors ça marche, mais en partie :/
En fait, certaines cases sont supprimées, mais ce ne sont pas les bonnes. Et certaines ne le sont pas, et ce sont celles à supprimer...

Je vais devoir utiliser un print_r colorié pour voir ce qui cloche :mrgreen:

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

14 oct. 2007, 17:44

Est-ce que tu as adapté les exemples donnés pour correspondre à la position actuelle du joueur ? J'imagine bien que la zone à conserver est dynamique, il te faut donc adapter les valeur ton XSL ou ton XPath vis-à-vis de la position du joueur.

Eléphant du PHP | 443 Messages

14 oct. 2007, 17:46

Est-ce que tu as adapté les exemples donnés pour correspondre à la position actuelle du joueur ? J'imagine bien que la zone à conserver est dynamique, il te faut donc adapter les valeur ton XSL ou ton XPath vis-à-vis de la position du joueur.
+1
Ce qui revient à générer directement un xml personnalisé par user.

Tracker.

Eléphant du PHP | 99 Messages

14 oct. 2007, 17:49

Yep, c'est fait avec le <?xsl-param> déclaré au début du fichier.
Je fait juste un
$xml = str_replace(array('[[:OFFSETX:]]','[[:OFFSETY:]]'),array($x,$y),$xml);
pour le personnaliser.

Eléphant du PHP | 99 Messages

14 oct. 2007, 18:19

Le bouton d'édition à disparu?!

Je pense avoir trouvé l'erreur: $case contient ceci, et donc $case{x'] et $case['y'] n'existent pas. Mais je ne sais pas comment atteindre x et y, j'ai essayé avec ça:
$case->@attributes['x']
$case->x
$case->['x']
$case['x']
$case['@attributes']['x']
Mais rien ne marche :?
SimpleXMLElement Object
(
[@attributes] => Array
(
[x] => 7
[y] => 9
)

[tile] => SimpleXMLElement Object
(
[@attributes] => Array
(
[niveau] => 1
[valeur] => 1,1,6
[deplacement] => 999
)

)

)

[edit1] Bouton retrouvé :mrgreen:
[edit2] Problème corrigé. Il fallait faire un foreach sur $xml->case au lieu de $xml