Bonjour,

Je me permets de poster sur le forum car je n'arrive pas à gérer mon système de vote (sans rafraîchir la page).

Ce que je souhaite, c'est avoir la possibilité de voter pour un objet, enregistrer le vote en bdd puis afficher sans rafraîchir la page.

Si quelqu'un pouvait m'aider (débutant) je lui en serais grandement reconnaissant ;).

Merci

6 réponses


Azorgh
Réponse acceptée

Et bien dans ce cas utilise le += 1 ou le ++ ;) (Il y a une méthode increment, mais je sais plus comment elle fonctionne ^^)

Salut,

Dans un premier temps, il serait bien de faire le système classique, sans Ajax, tu verra donc les données que tu as besoin afin d'executer la/les requêtes nécessaire.

Ensuite, étant donné que tu aura déjà une route associé à la méthode pour "voter", il te suffira de l'appeller en Ajax. Le plus simple serait d'écouter l'évènement submit, et d'envoyer la requête avec le formulaire séralisé.

Pour résumer :

  • Créer ton formulaire classique côté vue
  • Fais les méthodes nécessaire pour sauvegarder le vote, et associe une route à celle-ci
  • Vérifie que le post du formulaire fonctionne bien et que ca enregistre
  • Modifie le code côté front pour passer par de l'ajax. Il suffira simplement de modifier le retour de la fonction qui sauvegarde les votes afin de retourner soit l'objet, ou un json {success: true} ou {success: false, error: 'Une erreur est survenue'}.

N'hésite pas si je n'ai pas été très claire dans mon explication ;)

booni
Auteur

Salut,

Tout d'abord, merci beaucoup pour ta réponse.
J'ai fait exactement ce que tu décris et je parviens bien à envoyer les infos à mon controller puis à sauvegarder en bdd.
Mon soucis (avant de m'attaquer au passage en ajax) c'est la facon dont j'envois l'id de mon objet à mon controller. Je ne suis pas sûr que ce soit la manière conventionelle :).

Si cela ne te dérange pas je te mets un bout du code dans le post pour que tu me donnes ton avis, me dire ce qui va ou pas ?

File : modale.blade.php

@if(Auth::check())
{!! Form::model($video, ['url' => action('VideosController@addLike')]) !!}
{!! Form::hidden('id') !!}
<button type="submit" class="btn btn-primary btn-lg btn-block btn-raised">Like it</button>
{!! Form::close() !!}
@else
<div class="alert alert-dismissible alert-warning">
<button type="button" value="{{ $video }}" class="close" data-dismiss="alert">×</button>
<p><a href="steamlogin" class="alert-link">You need to login</a>.</p>
</div>
@endif

///////////////////

File : routes.php

Route::post('addlike', 'VideosController@addLike');

///////////////////

File : VideosController.php

public function addLike (VideoRequest $request)
{
$video = Videos::findOrFail($request->input('id'));
dd($video->id);
/$video->likes += 1;
$video->save();
/
}

Comme tu peux le voir j'affiche seulement l'id de la vidéo pour tester mais le save marche aussi.

Merci pour ton temps

Salut, alors petit conseil, utilise les balises pour formater ton code.
Sinon, j'aurais personnellement fait comme ça :

@if(Auth::check())
    {!! Form::open(['action' => ['VideosController@addLike', $video->id]]) !!}
    {!! Form::button('Like it', ['type' => 'submit']) !!}
    {!! Form::close() !!}
@else
    You need to login.
@endif

Ensuite pour la route :

Route::post('{id}/like', 'VideosController@like');

Ce qui donnerai dans ton controller :

public function like ($id, Request $request)
{
    $video = Videos::findOrFail($id);
    $video->likes->increment(1);
    $video->save();
    return redirect(action('VideosController@show', $id));
}
booni
Auteur

Super merci,
En revanche il n'aime pas la méthode increment() sur un integer ?

booni
Auteur

Ok en tout cas merci beaucoup de ton aide ;).