Проблема с пагинацией

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
PC_Principal
Сообщения: 6
Зарегистрирован: 2017.04.26, 11:51

Проблема с пагинацией

Сообщение PC_Principal » 2018.02.14, 14:07

Добрый день уважаемые форумчане! Возник вопрос, по поводу Yii2 Pagination, на сайте была сделана система родительских и дочерних категорий, через отдельный компонент.

Код компонента:

Код: Выделить всё

namespace app\components;

use yii\web\UrlRule;
use app\models\Category;
use yii\web\UrlRuleInterface;
use yii\web\HttpException;
use Yii;


class CategoryurlComponent implements UrlRuleInterface
{
/** Урл компонент для маршрутизации категорий **/
    public function parseRequest($manager, $request)
    {
        $site = stristr(Yii::$app->request->url,'/site/'); 
        $admin = stristr(Yii::$app->request->url,'/admin/'); 
        $maps = stristr(Yii::$app->request->url,'/maps/'); 
        
        if(!$site && !$admin && !$maps) {
            if(strpos($request->pathInfo,'/') !== false){
                if(preg_match('%^([\w\-]+)([\/]{1})([\-\w\d]+)([\/]{1})([\-\w\d]+)$%',$request->pathInfo, $matches)) {
                    return ['loot/category',['name'=>$matches[5]]];
                } elseif(preg_match('%^([\w\-]+)([\/]{1})([\-\w\d]+)$%',$request->pathInfo, $matches)) {
                    return ['loot/category',['name'=>$matches[3]]];
                } elseif(preg_match('%^([\-\w\d]+)([\/]{1})([\-\w\d]+)([.html]+)$%',$request->pathInfo, $matches)) {
                    return ['item/detailloot', ['item' => $matches[3]]];
                }
            }
            return false;
        }
        return false;
    }

    public function createUrl($manager, $route, $params)
    {
        return false;  // данное правило не применимо
    }
}
Код контроллера, который отвечает за вывод категорий:

Код: Выделить всё

namespace app\controllers;

use yii\web\Controller;
use yii;
use app\models\Category;
use app\models\Items;
use yii\data\Pagination;
use yii\web\HttpException;
use yii\db\Query;


class LootController extends Controller
{
    /**
     * Displays homepage.
     *
     * @return string
     */

    /** Рендер страницы списка категорий и общего списка лута  **/
    public function actionMainloot()
    {
        $fullitems = Items::find()->where(['active' => 1]);
        $pagination = new Pagination(['defaultPageSize' => 10,'totalCount' => $fullitems->count(),]);
        $items = $fullitems->offset($pagination->offset)->orderby(['date_create'=>SORT_DESC])->limit($pagination->limit)->all();
        $request = \Yii::$app->request;
        
        return $this->render('mainpage.php', ['items' => $items,'active_page' => $request->get('page',1),'count_pages' => $pagination->getPageCount(), 'pagination' => $pagination]);
    }

    /** Рендер детальной страницы категории - тут рендерятся как родительские так и дочерние категории */
    public function actionCategory($name)
    {
        $cat = Category::find()->where(['url'=>$name])->One();
        if($cat) {
            $fullitems = Items::find()
                ->alias( 'i')
                ->select('i.*')
                ->leftJoin('category as c1', '`i`.`parentcat_id` = `c1`.`id`')
                ->andWhere(['c1.url' => $name])
                ->andWhere(['active' => 1])
                ->orWhere(['c1.parent_category' => $cat->id])
                ->andWhere(['active' => 1])
                ->with('parentcat');
            
            $pagination = new Pagination(['defaultPageSize' => 1,'totalCount' => $fullitems->count(), 'forcePageParam' => false, 'pageSizeParam' => false]);
            $items = $fullitems->offset($pagination->offset)->orderby(['date_create'=>SORT_DESC])->limit($pagination->limit)->all();
            
            return $this->render('categorie-page.php', ['cat' => $cat, 'items' => $items, 'count_pages' => $pagination->getPageCount(), 'pagination' => $pagination]);
        } else {
            throw new HttpException(404 ,'Такая страница не существует');
        }
       
    }

}
Во вьюшке пагинация выводится стандартным образом:

Код: Выделить всё

<div class="col-lg-12 pagination text-center">
                        <?= LinkPager::widget([
                            'pagination' => $pagination,
                        ]);
                        ?>
                    </div>
Проблема в том что когда мы находимся на странице категории, в пагинации ссылки имеют следующий вид, что также вызывает ошибку:
https://*Имя сайта*/loot/category?name=weapons&page=2

Хотя нужно добиться варианта, чтобы выглядело вот так:
https://*Имя сайта*/loot/weapons?page=2
Этот вариант, даже если проверить вручную работает корректно и отдает страницу правильно.

Как можно привести ссылки пагинации к нужному виду, используя текущий кастомный url компонент?

Аватара пользователя
ElisDN
Сообщения: 4837
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Проблема с пагинацией

Сообщение ElisDN » 2018.02.14, 14:16

Спрограммировать в createUrl.

PC_Principal
Сообщения: 6
Зарегистрирован: 2017.04.26, 11:51

Re: Проблема с пагинацией

Сообщение PC_Principal » 2018.02.14, 14:19

Это получается, сделать там логику аналогичную parseRequest в этом компоненте?

Аватара пользователя
ElisDN
Сообщения: 4837
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Проблема с пагинацией

Сообщение ElisDN » 2018.02.14, 14:20

Да, чтобы она там склеивала адрес.

PC_Principal
Сообщения: 6
Зарегистрирован: 2017.04.26, 11:51

Re: Проблема с пагинацией

Сообщение PC_Principal » 2018.02.14, 14:28

А есть пример, как это приблизительно может выглядеть?


PC_Principal
Сообщения: 6
Зарегистрирован: 2017.04.26, 11:51

Re: Проблема с пагинацией

Сообщение PC_Principal » 2018.02.14, 15:34

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

Код: Выделить всё

    public function createUrl($manager, $route, $params)
    {

        if ($route === 'loot/category' && Category::find()->where(['url'=>$params['name']])->andWhere(['enabled' => 1])->andWhere(['parent_category' => null])->One()) {
            return 'loot/' .$params['name'];
        } elseif ($route === 'loot/category' && Category::find()->where(['url'=>$params['name']])->andWhere(['enabled' => 1])->andWhere(['not like', 'parent_category', 'null'])->One()) {
            $cat = Category::find()->where(['url'=>$params['name']])->One();
            $parentcat = Category::find()->where(['id'=>$cat->parent_category])->One();

            return 'loot/'.$parentcat->url. '/' .$params['name'];
        }
        return false;
    }

Аватара пользователя
ElisDN
Сообщения: 4837
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Проблема с пагинацией

Сообщение ElisDN » 2018.02.14, 21:32

Код: Выделить всё

$url = 'loot/' . $parentcat->url . '/' . $params['name'];
unset($params['name']);
if ($params) {
    $url .= '?' . http_build_query($params);
}
return $url;

PC_Principal
Сообщения: 6
Зарегистрирован: 2017.04.26, 11:51

Re: Проблема с пагинацией

Сообщение PC_Principal » 2018.02.16, 10:08

Так сработало - спасибо Вам большое!

Ответить