cms/article-list
Danh sách bài viết, có thể lọc theo chuyên mục.
- Tệp giao diện:
cms/article-list.html - Đường dẫn:
/bai-viet - Controller:
App\Modules\Cms\CmsController::articleListPage
Ngoài những biến dưới đây, slot này còn nhận toàn bộ biến toàn cục.
Biến của trang
| Biến | Kiểu | Mô tả | Từ phiên bản |
|---|---|---|---|
articles |
Article[] |
Bài viết của trang hiện tại. | 1.0 |
article_categories |
ArticleCategory[] |
Toàn bộ chuyên mục bài viết, để dựng bộ lọc. | 1.0 |
current_category |
ArticleCategory | null |
Chuyên mục đang lọc; null khi xem tất cả. | 1.0 |
has_more |
boolean |
Còn trang tiếp theo hay không. | 1.0 |
next_cursor |
string | null |
Con trỏ để tải trang kế; null khi đã hết. | 1.0 |
featured_article |
Article | null |
Bài viết nổi bật lớn ở đầu trang; chỉ có ở trang tổng (không lọc chuyên mục, không có cursor), ngược lại là null. | 1.2 |
featured_side |
Article[] |
Ba bài viết xếp cạnh bài nổi bật; rỗng khi không phải trang tổng. | 1.2 |
grouped_articles |
ArticleSection[] |
Các khối bài viết theo chuyên mục; chuyên mục có dưới 3 bài sẽ bị bỏ qua. Rỗng khi lọc chuyên mục hoặc sang trang. | 1.2 |
recent_articles |
Article[] |
Bài viết mới nhất, dùng cho cột bên "Tin mới nhất". | 1.2 |
page_title |
string |
Tiêu đề SEO của trang. | 1.0 |
Mã đầy đủ
Toàn bộ tệp cms/article-list.html của bộ giao diện mặc định. Chép về templates/<bộ giao diện của bạn>/cms/article-list.html rồi sửa theo ý muốn.
<div class="container page-content">
<h1 class="page-title">{{ page_title }}</h1>
{% if article_categories.size > 0 %}
<nav class="article-category-nav">
<a href="/bai-viet" class="article-cat-btn {% unless current_category %}article-cat-btn--active{% endunless %}">
Tất cả
</a>
{% for cat in article_categories %}
<a href="/bai-viet?danh-muc={{ cat.slug }}"
class="article-cat-btn {% if current_category and current_category.slug == cat.slug %}article-cat-btn--active{% endif %}">
{% if cat.image_url %}<img src="{{ cat.image_url }}" alt="" width="20" height="20" loading="lazy" class="article-cat-btn__img" style="width:20px;height:20px;border-radius:50%;object-fit:cover;vertical-align:middle">{% endif %}
{{ cat.title }}
{% if cat.article_count > 0 %}<span>({{ cat.article_count }})</span>{% endif %}
</a>
{% endfor %}
</nav>
{% endif %}
{% if articles.size > 0 %}
<div class="article-grid">
{% for article in articles %}
<article class="article-card">
{% if article.thumbnail_url %}
{% if article.url %}<a href="{{ article.url }}" class="article-card__img-wrap">{% else %}<span class="article-card__img-wrap">{% endif %}
<img src="{{ article.thumbnail_url }}" alt="{{ article.title }}"
class="article-card__img" loading="lazy">
{% if article.url %}</a>{% else %}</span>{% endif %}
{% endif %}
<div class="article-card__body">
<h2 class="article-card__title">
{% if article.url %}
<a href="{{ article.url }}">{{ article.title }}</a>
{% else %}
{{ article.title }}
{% endif %}
</h2>
{% if article.summary %}
<p class="article-card__summary">{{ article.summary }}</p>
{% endif %}
<div class="article-card__meta">
{% if article.author_name %}
<span class="article-card__author">{{ article.author_name }}</span>
{% endif %}
{% if article.published_at %}
<time class="article-card__date">{{ article.published_at | slice: 0, 10 }}</time>
{% endif %}
</div>
{% if article.url %}
<a href="{{ article.url }}" class="btn btn--sm btn--outline">Đọc thêm</a>
{% endif %}
</div>
</article>
{% endfor %}
</div>
{% if has_more %}
<div class="pagination">
<a href="?cursor={{ next_cursor }}{% if current_category %}&danh-muc={{ current_category.slug }}{% endif %}"
class="btn btn--outline">Xem thêm</a>
</div>
{% endif %}
{% else %}
<p class="empty-state">Chưa có bài viết nào.</p>
{% endif %}
</div>