Bonjour à tous,
Suite aux excellents tuto sur cakephp, j'ai mis la main à la pâte et malheureusement, je butte sur ce problème :
Je souhaite pouvoir gérer l'ordre dans lequel apparaissent le nom des pages dans la barre de navigation.

En effet, les pages sont ajoutée à la volée les unes après les autres dès qu'elles dont créés, le fait de jouer avec la fonction "on line", ni le fait de modifier l'id dans la BDD de changent leurs positions.

J'ai le lointain souvenir du temps de PHPNUKE ... (wow ça date ça ;)), avoir eu un module qui permettait de modifier la position de l'item LORS de son édition.
Pouvez-vous m'aider ?
Je vous remercie par avance de vos réponses et suggestions, Avec Mes Amitiés.

3 réponses


Sinon tu créé un champ dans la base de donnée que t'as appelle position puis tu récupéres les éléments en les ordonnants selon leur position.

exactement! comme à dit palmer08 j'ai toujours un champ order que je gère via jquery ui sortable. dans mon administration je glisse et deplace les menus la ou je veut)

Pour le model que tu veut classer rajoute dans sa structure le champ order (int / null)
ensuite voici la fonction admin_order dans mon controller

public function admin_order() {
            $this->set('title_for_layout', Configure::read('MSG.msg_ordonner'));
            $this->set('objets', $this->MODEL->find('all',array(
            'order' => 'order ASC',
            )
        ));
    }

ensuite ma vue (PS j'utilise bootstrap pour les styles)

<div class="row">
  <div class="span12">
   <section>
<div class="index">

<h2><?php echo "classement des menus" ?></h2>

<?php echo $this->Html->link('<i class="icon-share icon-white"></i>retour ', array('action' => 'index'),array('escape'=>false,'class'=>'btn btn-warning')); ?>
    <hr />
    <ul id="classement" class="nav nav-pills nav-stacked">
    <?php
    foreach ($objets as $objet): ?>
    <li id='MODEL_<?php echo $objet'MODEL']'id'] ?>'><i class="icon-resize-vertical icon-white"></i> <?php echo $objet'MODEL']'name'] ?></li>
    <?php endforeach; ?></ul>

<?php $this->Html->scriptStart(array('inline' => false,'block' => 'scriptAdmin')); ?>
jQuery(function(){
$("#classement").sortable({delay:"20", opacity:"0.8", start:function (event, ui) {$(ui.item).addClass("bouger")}, stop:function (event, ui) {$.post("reorder", $("#classement ").sortable("serialize"))}}); 
});
<?php $this->Html->scriptEnd(); ?>

</div>
   </section>
  </div>
</div>

dans ton layout vers la fin après avoir appeler jQuery et jQuery ui tu rajoute ceci

echo $this->fetch('scriptAdmin');

tu en auras besoins pour qu'il y mette le code de ton sortable (l'attribut block juste dans le code précédent)

et dans mon controller la fonction admin_order

public function admin_reorder() {
        foreach ($this->data'MODEL'] as $key => $value) {
            $this->MODEL->id = $value;
            $this->MODEL->saveField("order",$key + 1);
        }
        exit();
    }

et pour finir je te recopie les styles

ul#classement li{
    -webkit-border-radius:0;
    -moz-border-radius:0;
    border-radius:0;
    background-image:none;
    border:0;
    padding:10px;
    font-weight:lighter;
    border-top-color:#fff;
    border-bottom-color:#fff;
    background-color:#f5f5f5;
    margin-bottom:4px;
    color:#fff;
    text-shadow:0 -1px 0 rgba(0,0,0,.25);
    background-color:#2f96b4;
}
ul#classement li.bouger{
    background-color:#bd362f;
}
ul#classement li:hover{
    background-color:#222;
}

Sinon l'autre méthode sympa c'est d'utiliser le behavior Tree et d'y rajouter quelques fonctions (comme par exemple monter tout en haut ou tout en bas

J’utilise les deux!

Le premier quand tu n'as qu'un seul niveau cela suffit
si tu en as plus (menu et sous menu) alors le comportement Tree deviens incontournable

J'espère que cela t'aidera :)

Corel73
Auteur

wow, merci a vous deux, là, il est un peut tard pour m'y mettre mais il me semble que c'est bien ça que je cherche.
avec mes amitiés ;)