Comment s'y prendre?

Eléphant du PHP | 418 Messages

12 mars 2012, 17:45

Salutation à vous.

J'aimerais faire dans ma liste des catégorie ou forums, dans mon panel d'admin, un système de lien direct, qui changerais la position d'un forum ou d'une catégorie.

Je ne vous pas comment m'y prendre, alors je viens demander votre aide.

Voici une image de ce que je souhaite faire, sauf que si on peux plus monter un forum, alors on grise la flèche, et de même si on peux plus descendre un forum.
(fonctionnement similaire pour les catégories)
C'est un peu similaire (même beaucoup) à ce topic et au panel d'administration de phpbb3.

Image:
Image

Pourriez vous m'indiquer la marche à suivre, afin d'arriver à cela?

Je rajoute, que j'ai un champ Order dans les catégories et les forums, ce qui me permet de définir leur emplacement sur la page d'accueil du forum.

Merci de votre aide

Cordialement

ViPHP
xTG
ViPHP | 7331 Messages

12 mars 2012, 17:46

Il faut que tu gères un champ position dans ta table.
Après il suffit d'échanger deux positions entre elles. ;)

Et l'affichage, un ORDER BY ce champ.

Eléphant du PHP | 418 Messages

12 mars 2012, 17:48

Il faut que tu gères un champ position dans ta table.
Après il suffit d'échanger deux positions entre elles. ;)

Et l'affichage, un ORDER BY ce champ.
J'imagine bien, mais c'est ça que j'ai du mal a agencer.

Pourrais tu me montrer un exemple, que je comprenne le truc stp?

Merci
Cordialement

ViPHP
xTG
ViPHP | 7331 Messages

12 mars 2012, 17:50

Euh c'est à dire... C'est quelle partie qui te pose problème ?
Car bon c'est un système très simple, c'est similaire à un swap de valeur entre deux variables...

Eléphant du PHP | 418 Messages

12 mars 2012, 17:51

Arf, j'ai mal compris, j'ai ce champ, il s'agit du champ Order, mais je ne comprend pas comment faire que les flèches montent et descendent l'ordre des forums ou cats, et de même comment faire pour griser la flèche en cas d'impossibilité de monter ou descendre (pour le premier et le dernier)

Merci

Cordialement

Eléphant du PHP | 418 Messages

12 mars 2012, 18:40

J'ai modifier l'affichage des flèches pour griser les impossibilités.

Image

maintenant, que me reste t'il à faire sur les flèches, et dans le traitement, pour faire fonctionner ce système??

Merci de votre aide

Mammouth du PHP | 2278 Messages

12 mars 2012, 19:21

Je suppose que tu veux que :
initialement les éléments soient toujours dans le même ordre,
le premier ait une flèche : descendre activable
le dernier ait une flèche: monter activable
les autres aient une flèche monter et une flèche descendre activables
le changement de position se fasse sur un simple clic sur une flèche.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
xTG
ViPHP | 7331 Messages

12 mars 2012, 19:49

Tu récupères toutes tes catégories/forums dans un array.
Le premier de l'array a une flèche descendante mais pas montante.
Le dernier a une flèche montante mais pas descendante. ;)

Après il suffit de transmettre l'ID ou la position de l'élément concerné (avec l'ordre descente ou montante) dans l'url.
Puis grâce à l'array tu connais tout de suite les voisins et il suffit d'opérer les requêtes SQL de type UPDATE.

Eléphant du PHP | 418 Messages

12 mars 2012, 22:20

Pour les flèches c'est régler, le problème est résolut, mais oui sirakawa, je veux bien faire le changement de position par un simple clic sur une flèche.

J'ai comparer les ordres avec le nombre total de catégories (ou forums)

D'après ce que tu m'as dit xTG, dans mon url je fait par exemple:

index.php?catid=1&pos=desc

Et dans ma page de traitement j'inverse les deux catégories??

C'est cela le principe?

Merci de votre aide

Cordialement

ViPHP
xTG
ViPHP | 7331 Messages

13 mars 2012, 07:40

Oui, en travaillant avec un tableau cela revient à un simple échange de variable.
Bon après pour garder à jour il faut rajouter les requêtes SQL, mais c'est pas grand chose.

Eléphant du PHP | 418 Messages

13 mars 2012, 07:50

Merci, mais je vais encore un peu t'embêter

A moins que je comprenne pas le terme exactement, je ne pense pas savoir faire un échange de variable.

Peux tu me définir comment faire cela STP?

Merci de votre aide

Cordialement

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 mars 2012, 07:57

Salut,

Le plus simple pour toi c'est de faire une procédure stockée sur le sgbd. Celle ci prend en paramètre ms l'id de la catégorie à modifier et le sens (que tu as dans l'url).
Dans cette procédure :
-mise à jour de la ligne précédente (ou suivante) avec un update + / - 1
-mise à jour de la ligne concernée avec la nouvelle position
Tu peu bien entendu y intégrer les contrôles des possibilités de changement de la catégorie.

Tu peux faire exactement la même chose en php avec deux appel ms au sgbd ;)

Pour info order est un mot réservé SQL c'est une très mauvaise idée en nom de champs (select ... order by order c'est moyen :mrgreen: )

@+
Il en faut peu pour être heureux ......

ViPHP
xTG
ViPHP | 7331 Messages

13 mars 2012, 08:41

Un échange de variable :
$maVar1 = 1;
$maVar2 = 2;

$tmp = $maVar1;
$maVar1 = $maVar2;
$maVar2 = $tmp;

Eléphant du PHP | 418 Messages

13 mars 2012, 09:48

Merci de votre aide, je vais m'y atteler.

C'est pas exactement order, c'est cat_order et forum_order ^^

Je vais tenter cela, je viens poster le résultat ici

Cordialement

Eléphant du PHP | 418 Messages

13 mars 2012, 10:34

J'ai réussir à faire cela grâce à vos conseils.

Voici le résultat:
<?php
	// on séléction la catégorie principale (qui monte)
	$query = $cnx->prepare('SELECT cat_id, cat_name, cat_order FROM t_cat
	WHERE cat_id = :cat_id');
	$query->bindValue(':cat_id',(int) $_GET['catid'],PDO::PARAM_INT);
	$query->execute()or die(print_r($query->errorInfo()));
	$data = $query->fetch();
	$query->CloseCursor();
	
	// on définit $cat_up
	$cat_up=$data['cat_order']-1;
	
	// et on séléctionne aussi celle qui va la remplacer
	$query = $cnx->prepare('SELECT cat_id, cat_name, cat_order FROM t_cat
	WHERE cat_order = :cat_order');
	$query->bindValue(':cat_order',(int) $cat_up,PDO::PARAM_INT);
	$query->execute()or die(print_r($query->errorInfo()));
	$datai = $query->fetch();
	$query->CloseCursor();
	
	// on définit $cat_down
	$cat_down=$datai['cat_order']+1;
	
	// on prépare les requêtes qui permettront d'intervertir les deux champs
	$query=$cnx->prepare('UPDATE t_cat
	SET 
	 cat_order = :cat_order
	WHERE cat_id = :cat_id');
	$query->bindValue(':cat_id',(int) $data['cat_id'],PDO::PARAM_INT);
	$query->bindValue(':cat_order',(int) $cat_up,PDO::PARAM_INT);
	$query->execute();
	$query->CloseCursor();
	
	$query=$cnx->prepare('UPDATE t_cat
	SET 
	  cat_order = :cat_order
	WHERE cat_id = :cat_id');
	$query->bindValue(':cat_id',(int) $datai['cat_id'],PDO::PARAM_INT);
	$query->bindValue(':cat_order',(int) $cat_down,PDO::PARAM_INT);
	$query->execute();
	$query->CloseCursor();
	
	header('Location: '.SITE_ADRESSE.'admin/index.php?r=forum');
?>
Le script pour déscendre est exactement le même sauf que on définit en premier cat_down

Merci de votre aide, Cordialement