Это, как я хотел бы подойти к нему:
- Создание области в изображениях модели, которая фильтрует постранично, Категория ЭСТ ..
- Handle свойства URL и логики в компоненте не смотреть
Скажем Галерея компонент:
URL: page.com/:cat/:page?
public function defineProperties()
{
return [
// Page # for pagination..
'pageNumber' => [
'title' => 'Page #',
'description' => 'Gallery Page #',
'type' => 'string',
'default' => '{{ :page }}',
],
// Category slug
'category' => [
'title' => 'Category',
'description' => 'Gallery Cat',
'type' => 'string',
'default' => '{{ :cat }}',
],
// Images to show per page
'perPage' => [
'title' => 'Images per page',
'type' => 'string',
'validationPattern' => '^[0-9]+$', // validation
'validationMessage' => 'VValidation Error',
'default' => '15',
],
// if you want to add sorting
'sortOrder' => [
'title' => 'Sort Order',
'description' => 'Images Sort Order',
'type' => 'dropdown',
'default' => 'updated_at desc'
],
];
}
public function getSortOrderOptions()
{
return Image::$allowedSortingOptions;
}
public function init()
{
$this->pageNumber = empty($this->property('pageNumber')) ? 1 : $this->property('pageNumber');
$this->perPage = $this->property('perPage');
$this->sortOrder = $this->property('sortOrder');
$this->category = $this->property('category');
}
public function onRun()
{
// here you may want to do some checks
// and add logic before querying your DB
return $this->listImages($this->pageNumber , $this->sortOrder, $this->perPage, $this->category);
}
public function listImages($pageNumber, $sortOrder, $perPage, $category){
// this is the scope you will define in your Images Model
// to handle pagination, sorting, category filtering ect..
$images = Images::listFrontEnd([
'page' => $pageNumber,
'sort' => $sortOrder,
'perPage' => $perPage,
'category' => $category,
]);
// small helper if the pagination # is > than last page
// redirect to last page..
$lastPage = $images->lastPage();
if ($this->pageNumber > $lastPage && $this->pageNumber > 1){
return Redirect::to($this->currentPageUrl(["page" => $lastPage]));
}
$this->images = $this->page['images'] = $images;
}
в вашей модели Изображение:
// list the allowed sorting options that will show up in your component
public static $allowedSortingOptions = array(
'created_at asc' => 'Images Created (ascending)',
'created_at desc' => 'Images Created (descending)',
'updated_at asc' => 'Images Updated (ascending)',
// ect....
);
// Scope for your component
public function scopelistImages($query, $options)
{
/*
* Default options
*/
extract(array_merge([
'page' => 1,
'perPage' => 15,
'sort' => 'updated_at',
'category' => null
], $options));
// SORTING
if (!is_array($sort)) {
$sort = [$sort];
}
foreach ($sort as $_sort) {
if (in_array($_sort, array_keys(self::$allowedSortingOptions))) {
$parts = explode(' ', $_sort);
if (count($parts) < 2) {
array_push($parts, 'desc');
}
list($sortField, $sortDirection) = $parts;
if ($sortField == 'random') {
$sortField = Db::raw('RAND()');
}
$query->orderBy($sortField, $sortDirection);
}
}
// Filter by category
........
return $query->paginate($perPage, $page);
}
Ответ вдохновленный от RainLab Blog Plugin
Не уверен, что, если я неправильно понял, но не проще для извлечения записей, которые соответствуют критериям, прежде чем передать его вид? например 'Gallery :: где ('category_id', $ catId) -> get()'. Конечно, вам сначала нужно получить идентификатор категории, используя имя, взятое из параметров –
@ChristopherFrancisco Через OctoberCMS вы перетаскиваете список записей или записи, а затем устанавливаете класс модели и столбец отображения. Оттуда вы можете использовать синтаксис Twig для использования записей. Я новичок в этом и использую Laravel за пределами Twig. –
Неплохо, ссылка на OctoberCMS перенаправлена на страницу разбивки на страницы, так что я предположил, что это всего лишь компонент разбиения на страницы (хотя название говорит CMS, глупо меня хахаха) –