• ПлагиныВопросы
  • Сделать фильтрацию постов по категоряим в RainLab Blog при включённой пагинации

  • Изменено

Всем привет!
Недавно начал работать с Octbober CMS, столкнулся с одной неприятностью.
Решение на просторах интернета так до сих пор и не найдено...

Есть страница portfolio, которая тянет данные из записей (Rainlab Blog) и есть две категории: "фото" и "видео".
Для красоты и удобства это дело оформляется через masonry.js и делится на страницы с помощью пагинации.

Собственно проблема в фильтрации, штатная, от masonry.js фильтрует посты только на конкретно открытой странице, а не из всех загруженных постов.
Подскажите, как это исправить? Если masonry лишний и сложный для реализации - от им можно пожертвовать.

Начал эксперементировать, менял

url = "/portfolio/:page?"
на
url = "/portfolio/:slug/:page?"

и добавлял
[blogPosts]
categoryFilter = "{{ :slug }}"

URL стал логичней - можно напрямую открыть категорию:
http://october.local/portfolio/video

http://october.local/portfolio/photo

НО! Теперь страница "portfolio" доступна только по адресу с приставкой "default"!

http://october.local/portfolio/default

Без посторонней помощи не справляюсь...
Вот полный код страницы, буду очень признателен за помощь:

title = "Portfolio"
url = "/portfolio/:page?"
layout = "default"
is_hidden = 0

[blogPosts]
pageNumber = "{{ :page }}"
categoryFilter = "{{ :slug }}"
postsPerPage = 10
noPostsMessage = "No posts found"
sortOrder = "published_at desc"
postPage = "blog-post"

[blogCategories]
slug = "{{ :slug }}"
displayEmpty = 0
categoryPage = "blog-category"
==

{% set posts = blogPosts.posts %}

<div class="portfolio-section">

    <ul class="portfolio-filter controls text-center">
        <li class="control" data-filter="all">All</li>
        {% for category in categories %}
        <li {% if category.slug == currentCategorySlug %} class="active control" {% endif %} data-filter=".{{ category.name }}">{{ category.name }}</li>
        {% endfor %}
    </ul>

    <div class="row portfolio-gallery m-0">
        {% for post in posts %}
        {% for image in post.featured_images %}
        {% for category in post.categories %}
        <div class="mix col-xl-2 col-md-3 col-sm-4 col-6 p-0 {{ category.name }}">
		
            {% if category.name=='Video' %}           
            <a href="{{ post.excerpt }}" class="video-link">    
                {% set url = post.excerpt %}
                {% if url is not empty %}
                {% set id = url|split('v=')|last %}
                {% set id = id|split('&')|first %}
                {% set id = id|split('/')|last %}
                    <img src="http://img.youtube.com/vi/{{id}}/hqdefault.jpg" class="portfolio-item img-popup set-bg" data-setbg="{{ image.path }}" />                
            </a>            
            {% endif %}
                            
            {% else %}
                <a href="{{ image.path | resize(500,500) }}" class="portfolio-item img-popup set-bg" data-setbg="{{ image.path | resize(500,500) }}"></a>
            {% endif %}
        </div>                
        {% endfor %}
        {% endfor %}
        {% endfor %}                      
    </div>
    
    <div class="blog-pagination">
    	{% if posts.lastPage > 1 %}
    		<ul class="pagination">
    			{% if posts.currentPage > 1 %}
    				<li><a href="{{ page.baseFileName|page({ (pageParam): (posts.currentPage-1) }) }}">&larr; Prev</a></li>
    			{% endif %}
    
    			{% for page in 1..posts.lastPage %}
    				<li class="{{ posts.currentPage == page ? 'active' : null }}">
    					<a href="{{ page.baseFileName|page({ (pageParam): page }) }}">{{ page }}</a>
    				</li>
    			{% endfor %}
    
    			{% if posts.lastPage > posts.currentPage %}
    				<li><a href="{{ page.baseFileName|page({ (pageParam): (posts.currentPage+1) }) }}">Next &rarr;</a></li>
    			{% endif %}
    		</ul>
    	{% endif %}
    </div>
    
</div>
  • reazzon ответили на это сообщение.

    Неужели никто не пожскажет?

    01K Привет. Здесь достаточно комплексная завязка на том, как построена пагинация у этого компонента. Если мне не изменяет память, то в URL можно не указывать параметр :page, для того чтобы работала пагинация, а можно просто передавать через query параметр ?page= в URL.

    Попробуй убрать :page и подставь вручную ?page в URL.

    • 01K ответили на это сообщение.

      reazzon, спасибо за ответ!
      В смысле сделать так?
      url = "/portfolio/:slug/" - не пашет 😁 Ну это меньшее зло, можно опустить пока.
      А вот как быть с фильтрацией? Ничего с ней не понятно, похожих примеров не нашёл... В общем, тупик.

      • reazzon ответили на это сообщение.

        01K Сделайте свой пустой плагин, создайте внутри него компонент. Подключите его в страницу, и делайте кастомную сортировку, фильтрацию и пагинацию

        Всё это для меня звучит очень оптимистично 🙂 Но, как понимаю, саму фильтрацию можно сделать без своего плагина, ведь <li {% if category.slug == currentCategorySlug %} class="active control" {% endif %} data-filter=".{{ category.name }}">{{ category.name }}</li> работает, но только на конкретно открытой странице пагинации, игнорирую выборку из других страниц

        • reazzon ответили на это сообщение.
          4 дня спустя
          • Изменено

          01K Не оптимистично. Создание плагинов в OctoberCMS с последующим написанием компонентов делается двумя командами в терминале. Буквально.

          $ php artisan plugin:create Acme.Example
          
          $ php artisan create:component Acme.Example ComponentName

          Не бойтесь открывать для себя новые возможности реализации различных логик.