Affichage d'un tableau groupé

Eléphant du PHP | 291 Messages

05 juin 2013, 11:10

Bonjour,

Je voudrais sur une page afficher un formulaire matérialisé par des cases à cocher permettant d'attribuer une ou plusieurs ACL à un groupe.
Également lors de l'affichage je souhaiterais que les cases soient cochées ou non en fonction.

J'ai trois tables.

ACL :
CREATE TABLE IF NOT EXISTS `acls` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `acls_value` varchar(255) NOT NULL COMMENT 'Ajouter un article\nModifier ses articles\nModifier les articles des autres\nSupprimer un article\netc...',
  `acls_slug` varchar(255) NOT NULL,
  `acls_categorie` varchar(255) NOT NULL,
  `acls_comment` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `slug_UNIQUE` (`acls_slug`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

INSERT INTO `acls` (`id`, `acls_value`, `acls_slug`, `acls_categorie`, `acls_comment`) VALUES
(1, 'droit numéro 1', 'perm1', 'cat1', 'Pas de description')
Groupe :
CREATE TABLE IF NOT EXISTS `groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `groups_name` varchar(255) NOT NULL,
  `groups_slug` varchar(255) NOT NULL,
  `groups_description` text,
  `online` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `grps_slug_UNIQUE` (`groups_slug`),
  KEY `grps_name_INDEX` (`groups_name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

INSERT INTO `groups` (`id`, `groups_name`, `groups_slug`, `groups_description`, `online`) VALUES
(1, 'Groupe', 'grp1', NULL, 0);
Un groupe peux avoir un ou plusieurs ACL donc j'ai une autre table :
CREATE TABLE IF NOT EXISTS `acls_groups` (
  `acls_id` int(11) NOT NULL,
  `groups_id` int(11) NOT NULL,
  PRIMARY KEY (`acls_id`,`groups_id`),
  KEY `fk_acls_has_groups_groups1_idx` (`groups_id`),
  KEY `fk_acls_has_groups_acls1_idx` (`acls_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `acls_groups` (`acls_id`, `groups_id`) VALUES
(1, 1);
Pour le moment j'ai ma requête qui me liste toutes les ACL. Ça va pas loin. Je les affiche avec un forech mas je ne sais pas comment grouper par "acls_categorie"

Pouvez-vous m'aider ?

Mammouth du PHP | 619 Messages

05 juin 2013, 12:04

Bonjour,

pour regrouper des éléments par champ il suffi de mettre group by acls_categorie

Eléphant du PHP | 291 Messages

05 juin 2013, 14:43

j'ai bien essayé mais il ne me sort que deux résultat ce qui correspond à mes deux catégories différentes. Les autres enregistrements ne sont pas listés.

Eléphant du PHP | 291 Messages

05 juin 2013, 14:48

ma requête :
SELECT acls_value,acls_slug,acls_categorie FROM acls as acls GROUP BY acls_categorie

Mammouth du PHP | 619 Messages

05 juin 2013, 14:54

tu veux regrouper tes données ou les organise par acls_categorie ?

sinon pourquoi mettre un as dans ta requête ?


group by champ va afficher un seul élément par type différant pour le champ

Eléphant du PHP | 291 Messages

05 juin 2013, 14:58

en fait (j'étais justement en train de me demander) je veux organiser mes ACL en fonction des catégories à laquelle elles appartiennent.

pour le AS c'est pas forcément utile dans ce cas la mais c'est une fonction qui s'occupe des requête donc c'est automatique.

Mammouth du PHP | 619 Messages

05 juin 2013, 14:59

ok alors tester plutôt


SELECT acls_value,acls_slug,acls_categorie FROM acls AS acls ORDER BY acls_categorie

Eléphant du PHP | 291 Messages

05 juin 2013, 15:01

Quel null :|

merci je n'y ai même pas pensé.

Mammouth du PHP | 619 Messages

05 juin 2013, 15:10

tu peux essaie cette ligne dans ton phpmyadmin
SELECT acls_value,acls_slug,acls_categorie FROM acls AS acls ORDER BY acls_categorie

Eléphant du PHP | 291 Messages

05 juin 2013, 15:16

c'est la même que précédemment ?

en fait je viens de réaliser (je crois) que j'aurais pu faire un select All sur ma table ACLS et faire un usort() sur le tableau de sortie ?

maintenant je cherche pour l'affichage, le but étant de regroupé l'affichage.

j'ai ça en sortie :
Array
(
    [0] => stdClass Object
        (
            [acls_value] => droit1
            [acls_slug] => droit1
            [acls_categorie] => cat1
        )

    [1] => stdClass Object
        (
            [acls_value] => droit2
            [acls_slug] => droit2
            [acls_categorie] => cat1
        )

    [2] => stdClass Object
        (
            [acls_value] => droit3
            [acls_slug] => droit3
            [acls_categorie] => cat2
        )

    [3] => stdClass Object
        (
            [acls_value] => droit4
            [acls_slug] => droit4
            [acls_categorie] => cat2
        )

)
avoir :

cat1:
droit1
droit2

cat2:
droit3
droit4

Mammouth du PHP | 619 Messages

05 juin 2013, 15:21

Re,

cela revient a faire un ORDER BY acls_categorie

qui va afficher d'abord la categorie 1 puis categorie 2 etc

oui c'est la meme mais moi dans phpmyadmin ca marche

Eléphant du PHP | 291 Messages

05 juin 2013, 15:24

oui dans phpmyadmin ça fonctionne bien mais c'est l'affichage qui est plus complexe.

Eléphant du PHP | 291 Messages

05 juin 2013, 15:41

je suis partis sur cette base la :
$categorie = '';
foreach($acl as $k=>$v){
	if(empty($categorie) || $categorie != $v->acls_categorie){
		$categorie = $v->acls_categorie;
		echo $v->acls_categorie;
	}
	echo $v->acls_slug.'<br />';
}
est-ce une bonne méthode ?

Mammouth du PHP | 619 Messages

05 juin 2013, 15:44

Oui cela me semble bon

Eléphant du PHP | 291 Messages

05 juin 2013, 15:48

merci pour l'aide !