Октябрьская CMS (блог Rainlab) - ссылка на следующую и предыдущую публикацию из той же категории

У меня есть страница сообщения в блоге, где я использую категорию как жестко заданный параметр в URL-адресе.

URL-адрес похож на

url = "/category1/:slug"

Я использую компонент blogPost в этом макете. Я могу получить ссылку nextPost и prevPost, используя следующий код в шаблоне

{% set nextPost = blogPost.post.nextPost %}
{% set prevPost = blogPost.post.previousPost %}

Но я хочу, чтобы nextPost и prevPost принадлежали к той же категории, что и blogPost.post, т.е. category1

blogPost.post относится только к одной категории

Я проверил, есть ли у модели Post метод scopeFilterCategories, но я не уверен, как его использовать и служит ли он той же цели.

Код

Это часть конфигурации

title = "Category1 post"
url = "/category1/:slug"
layout = "default"
is_hidden = 0
robot_index = "index"
robot_follow = "follow"

[blogPost]
slug = "{{ :slug }}"
categoryPage = "category1"

person Akash K.    schedule 12.06.2018    source источник


Ответы (1)


Кажется, это не предусмотрено.

Я создал сниппеты, которые могут выполнять эту работу.

Вы page's code block добавьте этот фрагмент кода [next previous работает на основе поля published_at (опубликовано в форме)]

public function nextPost($post) {

    // get current cats
    $postCats = $post->categories->pluck('id')->toArray();

    // Here you need to pass it as we are 
    // hardcoding category slug in URL so we have no data of category

    // IF YOU DONT WANT CAT COME FROM POST
    // YOU CAN HARD CODE THEM $postCats = ['2'] 
    // here 2 is id of category

    // use this cats to scope 
    $nextPost = $post->isPublished()->applySibling(-1)
                   ->FilterCategories($postCats)->first();

    // check if next is not availabe then return false
    if(!$nextPost) {        
        return false;
    }

    // create page link here same page
    $postPage = $this->page->getBaseFileName();

    // set URl so we can direct access .url
    $nextPost->setUrl($postPage, $this->controller);

    // set Cat URl so we can use it directly if needed
    $nextPost->categories->each(function($category) {
        $category->setUrl($this->categoryPage, $this->controller);
    });

    return $nextPost;

}

public function previousPost($post) {

    // get current cats
    $postCats = $post->categories->pluck('id')->toArray();

    // IF YOU DONT WANT CAT COME FROM POST
    // YOU CAN HARD CODE THEM $postCats = ['2'] 
    // here 2 is id of category

    // use this cats to scope 
    $prevPost = $post->isPublished()->applySibling(1)
                   ->FilterCategories($postCats)->first();

    // check if nprevious ext is not availabe then return false
    if(!$prevPost) {        
        return false;
    }

    // create page link here same page
    $postPage = $this->page->getBaseFileName();

    // set URl so we can direct access .url
    $prevPost->setUrl($postPage, $this->controller);

    // set Cat URl so we can use it directly if needed
    $prevPost->categories->each(function($category) {
        $category->setUrl($this->categoryPage, $this->controller);
    });

    return $prevPost;

}

В Markup area вы можете добавить этот код.

{% component 'blogPost' %}

{% set nextPostRecord = this.controller.pageObject.nextPost(blogPost.post) %}
{% set previousPostRecord = this.controller.pageObject.previousPost(blogPost.post) %}

{% if previousPostRecord %}
    <a href="{{ previousPostRecord.url }}"> Previous </a>    
{% endif %}

{% if nextPostRecord %}
    <a href="{{ nextPostRecord.url }}"> Next </a>    
{% endif %}

Будет уважаться category и отображаться только сообщения этой категории

Если есть сомнения, прокомментируйте.

person Hardik Satasiya    schedule 13.06.2018
comment
Я получаю сообщение об ошибке. Пытаюсь получить свойство не-объекта в части рендеринга шаблона в строке {% set nextPostRecord = this.controller.pageObject.nextPost(blogPost.post) %}. Когда я сбрасываю this.controller, он не показывает никаких pageObject именованных методов или переменных - person Akash K.; 13.06.2018
comment
хорошо, я понял это. Я изменил формулировки на {% set pageObject = this.controller.getPageObject() %} {% set nextPostRecord = pageObject.nextPost(blogPost.post) %} {% set previousPostRecord = pageObject.previousPost(blogPost.post) %} - person Akash K.; 13.06.2018
comment
Однако есть еще одна проблема. При навигации по этим ссылкам в определенный момент они могут перемещаться только между двумя сообщениями. Нажатие «пред» в сообщении M переходит к сообщению N, а нажатие «пред» в сообщении N - для перехода к сообщению M и повторяется. Что могло быть причиной этого. Эта проблема возникла, когда я также использовал методы nextPost и prevPost по умолчанию. Есть ли шансы, что вы знаете, почему это происходит? Кстати, спасибо за фрагменты :) - person Akash K.; 13.06.2018
comment
Похоже, что published_at испорчен, когда несколько сообщений публикуются в одну и ту же дату. - person Akash K.; 13.06.2018
comment
да, я забыл упомянуть, что внутренняя логика работает только для разных дат, я тоже столкнулся с той же проблемой, но когда я изменил даты, она отлично работает .... я думаю, вы просто извлекаете логику из модели публикации и пишете в разделе кода. ваша собственная исправленная логика, и она должна работать - person Hardik Satasiya; 13.06.2018