Laravel 5

Catégories

  • Avatar de WilliamMaquin
    Membre depuis :
    02/12/2018
    Messages :
    45

    Hello ! J'utilise le model de blog laravel 5.5 de bestmomo proposé ici et j'ai un petit souci, voilà je voudrais rediriger chaque catégorie différente vers une vue.

    J'imagine que je dois sélectionner la catégorie dans le controller mais je sais pas comment le faire.

    Voici la partie catégorie du post repository :

    public function getActiveOrderByDateForCategory($nbrPages, $category_slug)
    {
    return $this->queryActiveOrderByDate()
    ->whereHas('categories', function ($q) use ($category_slug) {
    $q->where('categories.slug', $category_slug);
    })->paginate($nbrPages);
    }

    Et côté post controller :

    public function category(Category $category)
    {
    $posts = $this->postRepository->getActiveOrderByDateForCategory($this->nbrPages, $category->slug);
    $info = __('Posts for category: ') . '<strong>' . $category->title . '</strong>';

    return view('front.index', compact('posts', 'info'));
    }

    Et je voudrais aussi que lorsque je clique sur un post dans l'adresse ça m'affiche le nom de la category et le titre du post c'est a dire :
    Quand je clique sur un post j'ai 127.0.0.1:8000/posts/post-1 et je voudrais que ca soit comme ça : 127.0.0.1:8000/category-1/post-1

    Voila mes routes :

    Route::name('home')->get('/', 'Front\PostController@index');

    Route::prefix('posts')->namespace('Front')->group(function () {
    Route::name('posts.display')->get('/{slug}', 'PostController@show');
    Route::name('posts.tag')->get('tag/{tag}', 'PostController@tag');
    Route::name('posts.search')->get('', 'PostController@search');
    Route::name('posts.comments.store')->post('{post}/comments', 'CommentController@store');
    Route::name('posts.comments.comments.store')->post('{post}/comments/{comment}/comments', 'CommentController@store');
    Route::name('posts.comments')->get('{post}/comments/{page}', 'CommentController@comments');
  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2472

    Salut,

    Dans le contrôleur tu récupères la variable $category que tu peux librement utiliser. Si tu veux des vues différencets selon les catégories alors la manière la plus directe est de faire un truc dans ce genre :

    public function category(Category $category)
    {
    $posts = $this->postRepository->getActiveOrderByDateForCategory($this->nbrPages, $category->slug);
    $info = __('Posts for category: ') . '<strong>' . $category->title . '</strong>';

    switch ($category->slug) {
    case 'category-1':
    return view('front.category1', compact('posts', 'info'));
    break;
    case 'category-2':
    return view('front.category1', compact('posts', 'info'));
    break;
    ...
    }
    }

    Efficace mais plutôt laid comme approche. Tout dépend de l'organisation du code et du nombre de catégories et de leur caractère évolutif.

    Il est plus élégant de mémoriser quelque part la relation entre catégories et vues et de faire un traitement adapté.

  • Avatar de WilliamMaquin
    Membre depuis :
    02/12/2018
    Messages :
    45

    Bah en fait je vais en avoir une dixaine de catégories. dont 5 affichées dans l'index et toutes affichées dans une vue distincte...

    En gros je veux : category-1 - 2 - 3 - 4 - 5 affichée dans front.index avec les 5 derniers articles
    Et je veux une vue pour category-1 2 3 4 5 6 7 8 9 etc... avec tout les articles de cette catégorie

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2472

    Peut-être que le plus simple est de composer le nom de la vue avec le nom de la catégorie.

  • Avatar de WilliamMaquin
    Membre depuis :
    02/12/2018
    Messages :
    45

    oui c´est ce que je pensais faire mais je ne peut pas assigner 2 vues (l´index et la vue en question) ca ne marche pas :/

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2472

    Je ne comprends pas le problème... Tu n'as besoin que d'une vue...

  • Avatar de WilliamMaquin
    Membre depuis :
    02/12/2018
    Messages :
    45

    bah non puisque je veux pouvoir afficher les 5 premiers articles de chaque categorie dans l'index aussi... puis du coup pour l'adresse je fais comment stp ?

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2472

    Tu dis que tu veux construire une vue spécifique pour chaque catégorie donc tu passes pas par l'index du projet de base...

  • Avatar de WilliamMaquin
    Membre depuis :
    02/12/2018
    Messages :
    45

    oui je comprends bien collent faire les vues du coup mais je voudrais les derniers articles de certaines categories affichés dans l´index aussi... sauf que je sais pas comment proceder

  • Avatar de WilliamMaquin
    Membre depuis :
    02/12/2018
    Messages :
    45

    du coup tu saurais m´expliquer comment faire pour afficher les 5 derniers articles de chaque categorie dans l´index ? et aussi comment modifier les liens pour que j´ai la categorie et le slug de l´article dans l´adresse ?

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2472

    Là il y a pas mal de code à changer... Pas évident de répondre comme ça...

  • Avatar de WilliamMaquin
    Membre depuis :
    02/12/2018
    Messages :
    45

    Ah :/ parce que je sais pas dutout comment faire du coup :/
    Et aussi du coup j'ai bien comment rediriger les catégories vers une vue mais je sais pas comment les afficher dans la vue x)

  • Avatar de WilliamMaquin
    Membre depuis :
    02/12/2018
    Messages :
    45

    Du coup mon post va rester sans réponse ? comme le précédent ? Super... Je vais passer par un cms ca ira plus vite au moins ils ont une commu..

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2472

    Il y a des questions pour lesquelles une réponse est rapide et d'autres où il faut plonger dans le code un certain temps et la disponibilité n'est pas toujours au rendez-vous.

  • Avatar de WilliamMaquin
    Membre depuis :
    02/12/2018
    Messages :
    45

    Je up le sujet du coup... J'ai pas avancé d'un millimetre depuis...

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2472

    Pour les 5 arcticles de chaque catégorie je ne pense pas qu'il y ait une solution de requête avec le query builder. Il doit falloir passer par une requête raw.

  • Avatar de WilliamMaquin
    Membre depuis :
    02/12/2018
    Messages :
    45

    Dac du coup je procède comment ?

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2472

    En fait c'est pas simple ton truc... Mais c'est faisable avec le query builder quand même. Voici une version simplifiée éclatée pour le principe avec 3 catégories dont on connait les id :

    $posts1 = \DB::table('posts')
    ->join('category_post', 'posts.id', '=', 'category_post.post_id')
    ->select('posts.id', 'posts.title', 'posts.slug', 'posts.excerpt', 'posts.image')
    ->where('category_post.category_id', '=', 1)
    ->limit(5);

    $posts2 = \DB::table('posts')
    ->join('category_post', 'posts.id', '=', 'category_post.post_id')
    ->select('posts.id', 'posts.title', 'posts.slug', 'posts.excerpt', 'posts.image')
    ->where('category_post.category_id', '=', 2)
    ->limit(5);

    $posts3 = \DB::table('posts')
    ->join('category_post', 'posts.id', '=', 'category_post.post_id')
    ->select('posts.id', 'posts.title', 'posts.slug', 'posts.excerpt', 'posts.image')
    ->where('category_post.category_id', '=', 3)
    ->limit(5)
    ->union($posts1)
    ->union($posts2)
    ->get();

    dd($posts3);
  • Avatar de WilliamMaquin
    Membre depuis :
    02/12/2018
    Messages :
    45

    Dac merci beaucoup ! Mais du coup je met ou ce code et je le transmet comment dans la vue ?

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2472

    Il faut le compléter, sans doute refactoriser pour éviter les répétitions, et le placer dans le repository.

Vous ne pouvez pas répondre à ce sujet.