Bonjour,

Voila je rencontre un petit problème avec mon code.
voici le code js

        $('.star-btn').on('click',function(){
            $.ajax({
                    url: "<?=$this->Html->url(array('controller'=>'feeds','action'=>'star','admin'=>true));?>",
                    type: 'post',
                    data: {id:$(this).data('id')},
                    dataType : 'json',
                    success: function (data) {
                        console.log(data);
                    }
                });
        });

dans la vue :

            <?php echo $this->Html->link(__('<i class="glyphicon glyphicon-star'.$class_bookmark.'"></i>'), array('action' => '#'), array('class' => 'btn btn-'.$class_bookmark_btn.' btn-xs star-btn', 'data-id'=>$feed['Feed']['id'], 'escape' => false, 'data-toggle'=>'tooltip', 'title' => $title_bookmark)); ?>

dans le controller:

    public $components = array('Security' => array(
        'csrfUseOnce' => false
        )
    );

    public function admin_star(){

        $this->autoRender = false;
        $id = $this->request->data['id'];

        if($this->request->is('post')){

            $feed = $this->Feed->findById($id);
            $star_status = ($feed['Feed']['bookmarked'])?'0':'1';

            $this->Feed->id = $id;
            $this->Feed->saveField('bookmarked',$star_status);

            return json_encode(current($this->Feed->read()));

        }
    }

Ce que je veux

Je cherche a pouvoir changer le status d'un champs sans avoir a unlocker le component Security pour cette action.
Du coup, je n'ai pas de formulaire, juste un lien.
si j'utilise la methode $this->Form->postLink() , j'obtiens bien mon token. Mais comment le faire passer en data dans ma requete Ajax ?
Ci joint le code HTML que j'obtiens avec $this->Form->postLink()

<form id="post_56825b1147d6e939953106" method="post" style="display:none;" name="post_56825b1147d6e939953106" action="/admin/feeds/#">
<input type="hidden" value="POST" name="_method">
<input id="Token2111569107" type="hidden" value="e1ef9f8c647f1fc541c7f591243e6e15d2bd643f" name="data[_Token][key]">
<div style="display:none;">
</form>
<a class="btn btn-warning btn-xs star-btn" onclick="document.post_56825b1147d6e939953106.submit(); event.returnValue = false; return false;" title="" data-toggle="tooltip" data-id="14" href="#" data-original-title="bookmarked">
<i class="glyphicon glyphicon-star"></i>
</a>

Il y a t'il une facon plus elegante d'envoyer le token sans me balader dans le DOM comme un fou ?
Je ne veux pas renoncer au component Security.

Merci d'avance

2 réponses


Dans ton js tu récupère la valeur du token dans le champs, et tu l'envois en Ajax non ? ça fait un pti moment que je n'ai pas touché à Cake2, il faudrait voir si tu peux obtenir le token par une méthode et dans ce cas là le mettre qquespart ou c'est plus simple d'y accéder.

Bonjour,

concernant le compsant Security pour la version 2.x il faut déclarer ton action ajax autant que "unlockedActions" via un beforeFilter pour préserver ton composant et faire passer ton action ajax c'est le topo.
Et cela se fait comme suit :

public function beforeFilter() {
            parent::beforeFilter();
            $this->Security->unlockedActions = array('ajax_action');
        }

et pour avoir un code propre coté controller utlise le test ajax sans oublier de déclarer le composant RequestHandler

if($this->request->is('ajax')){
    // Traitement
}

Cordialement.