Показать материалы из категорий/подкатегорий

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
3000gt
Сообщения: 60
Зарегистрирован: 2015.01.18, 22:49

Показать материалы из категорий/подкатегорий

Сообщение 3000gt »

В меню есть несколько ссылок, привожу в пример одну. При переходе по ссылке, пользователь видет материалы из категории "Транспорт":

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

<a href="<?= \Yii::$app->urlManager->createAbsoluteUrl(['articles/index/', 'category_slug' => 'transport'])">Транспорт</a>
Далее, в ArticlesController у меня есть метод (showBasedOnCategory), он ищет материалы по слагу категорий ( 'category_slug' ):

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

 public function actionIndex($category_slug)
    {    
        $article_query = new ArticleQuery();
        $articles = $article_query->showBasedOnCategory($category_slug);
        $selected_category = $article_query->showCategoryName($category_slug);
        
        if($articles){
            return $this->render('index', ['articles' => $articles,
                                           'pages' => $article_query->pages,
                                           'selected_category' => $selected_category
        ]);
        } else {
            return $this->goHome();
        }
    }
 
Ну и сам метод, он просто делает выборку статей какой-то конкретной категории:

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


public function showBasedOnCategory($category_slug){
      
     $query = new Query;
    
     
     $query->select(['article.id', 'article_title', 'article_content', 'article.slug AS article_slug', 'path', 'featured_img', 'created_at'])
          ->from('article')
          ->where(['article_category.slug' => $category_slug, 'article_status' => self::STATUS_PUBLISHED])
          ->leftJoin('category_article_rel', 'article.id = category_article_rel.article_id')
          ->leftJoin('article_category', 'category_article_rel.category_id = article_category.id')
          ->orderBy(['created_at' => SORT_DESC]);

      $pages = new \yii\data\Pagination(['totalCount' => $query->count(), 'pageSize'=>10]);
      $articles = $query->offset($pages->offset)
            ->limit($pages->limit)
            ->all();
      $this->pages = $pages;
      return $articles;
  }
 
Вопрос в том, а если у категории "Транспорт" существует дочерняя категория "Легковые авто", то, как составлять ссылку на дочерюю категию, чтобы было site.com/transport/cars/

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

<a href="<?= \Yii::$app->urlManager->createAbsoluteUrl(['articles/index/', 'category_slug' => 'transport/cars])">Легковые авто</a>
 
1) так?

2) как можно вывести материалы которые относяться к категории cars?


Если что, вот мои таблицы в базе данных:

article
- id
- article_title
- slug
- article_content
- path
- featured_img

category
- id
-name
-slug
- parent_id

category_article_rel - свзять между категориями и статьями
- article_id
- category_id
3000gt
Сообщения: 60
Зарегистрирован: 2015.01.18, 22:49

Re: Показать материалы из категорий/подкатегорий

Сообщение 3000gt »

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

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

Url::to(['post/index', 'year' => 2014, 'category' => 'php']) creates /index.php/posts/2014/php
А если, у категории php существует подкатегория for beginners? Там почему то не увидел про подкатегории.

Поэтому, по созданию ссылки, у меня есть два варианта:
1)

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

Url::to(['post/index', 'year' => 2014, 'category' => 'php/for-beginners']) 
2)

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

Url::to(['post/index', 'year' => 2014, 'category' => 'php' , 'sub_category' => 'for-beginners'])
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Показать материалы из категорий/подкатегорий

Сообщение zelenin »

это не мой пример, а раздел документации, посвященный созданию своего класса для обработки ссылок. такой класс имеет два метода - разбор урла и создание урла.
3000gt
Сообщения: 60
Зарегистрирован: 2015.01.18, 22:49

Re: Показать материалы из категорий/подкатегорий

Сообщение 3000gt »

Если я сделаю так:

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

<li><a href="<?= \Yii::$app->urlManager->createAbsoluteUrl(['shop/view/', 'category' => 'computers/printers/laser'])?>">Товары</a></li>
Тогда, url статет такого рода:
shop/computers%2Fprinters%2Flaser/ - слэши пропадают.
А если бы работало, я бы мог вырезать категорию перед последним слешем, и искать материалы, все что угодно по вырезанной категории. В данном случае категория laser является последней.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Показать материалы из категорий/подкатегорий

Сообщение zelenin »

3000gt писал(а):Если я сделаю так:

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

<li><a href="<?= \Yii::$app->urlManager->createAbsoluteUrl(['shop/view/', 'category' => 'computers/printers/laser'])?>">Товары</a></li>
Тогда, url статет такого рода:
shop/computers%2Fprinters%2Flaser/ - слэши пропадают.
логично
3000gt писал(а):А если бы работало я бы мог вырезать категорию перед последним слешем, и искать материалы, все что угодно по вырезанной категории. В данном случае категория laser является последней.
и? вы будете класс реализовывать, или продолжите сам с собой?)
3000gt
Сообщения: 60
Зарегистрирован: 2015.01.18, 22:49

Re: Показать материалы из категорий/подкатегорий

Сообщение 3000gt »

Я так понимаю, надо создать класс декоратор - CustomURLmanager, который будет заменять «%2F» обратно на слэш.

Для yii1 я нашел то что нужно, а как его применить к yii2? Мне нужно сделать extend от класса UrlManager?

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

class UrlManager extends CUrlManager
{
    public function createUrl($route, $params=array(), $ampersand='&')
    {
        return $this->fixPathSlashes(parent::createUrl($route, $params, $ampersand));
    }
 
    protected  function fixPathSlashes($url)
    {
        return preg_replace('|\%2F|i', '/', $url);
    }
}
 
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Показать материалы из категорий/подкатегорий

Сообщение zelenin »

3000gt писал(а):Я так понимаю, надо создать класс декоратор - CustomURLmanager, который будет заменять «%2F» обратно на слэш.

Для yii1 я нашел то что нужно, а как его применить к yii2? Мне нужно сделать extend от класса UrlManager?

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

class UrlManager extends CUrlManager
{
    public function createUrl($route, $params=array(), $ampersand='&')
    {
        return $this->fixPathSlashes(parent::createUrl($route, $params, $ampersand));
    }
 
    protected  function fixPathSlashes($url)
    {
        return preg_replace('|\%2F|i', '/', $url);
    }
}
 
нет, вам надо реализовать свой урл-класс, который будет генерировать урлы по вашей логике и парсить урл.
если у вас дерево cat1/cat2/cat3/cat4/cat5, то вы должны написать так: ->createUrl(['controller/action', 'category' => 'cat5']); а класс сам сгенерит правильный урл. вы же не собираетесь все 5 категорий передавать в createUrl?
3000gt
Сообщения: 60
Зарегистрирован: 2015.01.18, 22:49

Re: Показать материалы из категорий/подкатегорий

Сообщение 3000gt »

Ваша идея конечно интересная, но по мне это сложно, даже незнаю с чего начать.
Я бы просто создал отдельный класс, который заменяет %2F на "/", и потом я смогу вырезать последнюю категорию из URL и искать данные по ней.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Показать материалы из категорий/подкатегорий

Сообщение zelenin »

3000gt писал(а):Ваша идея конечно интересная, но по мне это сложно, даже незнаю с чего начать.
5 строк кода для генерации урла. ссылку я вам кинул. что еще вам надо, чтобы вы узнали с чего начать?
3000gt писал(а):Я бы просто создал отдельный класс, который заменяет %2F на "/", и потом я смогу вырезать последнюю категорию из URL и искать данные по ней.
но ведь это же бред.
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: Показать материалы из категорий/подкатегорий

Сообщение flashimage »

3000gt писал(а):Я бы просто создал отдельный класс, который заменяет %2F на "/", и потом я смогу вырезать последнюю категорию из URL и искать данные по ней.
Иногда читаю и поражаюсь куда людей заводит паттернофилия.
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Показать материалы из категорий/подкатегорий

Сообщение zelenin »

flashimage писал(а):
3000gt писал(а):Я бы просто создал отдельный класс, который заменяет %2F на "/", и потом я смогу вырезать последнюю категорию из URL и искать данные по ней.
Иногда читаю и поражаюсь куда людей заводит паттернофилия.
просто автор считает, что его проблема в %2F, а решение нашел в виде переопределения урлменеджера. о паттернах он и не слышал, скорее всего. Да тут и нет ни слова о паттернах.
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: Показать материалы из категорий/подкатегорий

Сообщение flashimage »

zelenin писал(а):
flashimage писал(а):
3000gt писал(а):Я бы просто создал отдельный класс, который заменяет %2F на "/", и потом я смогу вырезать последнюю категорию из URL и искать данные по ней.
Иногда читаю и поражаюсь куда людей заводит паттернофилия.
просто автор считает, что его проблема в %2F, а решение нашел в виде переопределения урлменеджера. о паттернах он и не слышал, скорее всего. Да тут и нет ни слова о паттернах.
3000gt писал(а):Я так понимаю, надо создать класс декоратор - CustomURLmanager, который будет заменять «%2F» обратно на слэш.
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Показать материалы из категорий/подкатегорий

Сообщение zelenin »

flashimage писал(а):
zelenin писал(а):
flashimage писал(а): Иногда читаю и поражаюсь куда людей заводит паттернофилия.
просто автор считает, что его проблема в %2F, а решение нашел в виде переопределения урлменеджера. о паттернах он и не слышал, скорее всего. Да тут и нет ни слова о паттернах.
3000gt писал(а):Я так понимаю, надо создать класс декоратор - CustomURLmanager, который будет заменять «%2F» обратно на слэш.
автор слышит звон, да не знает где он) http://www.elisdn.ru/blog/33/generaciia ... orii-v-yii отсюда скопировал, но elisdn ошибся - это не декоратор, а обычный наследник.
Декоратор это когда

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

UrlManagerDecorator {
private $urlManager;

public function __construct(UrlManager $urlManager) {
    $this->urlManager = $urlManager;
}

public function createUrl(...) {
    return $this->urlManager->createUrl(...);
}
....
}
Ответить