Использование партиалов в приложении (как правильно настроить контроллеры?)

Я хотел бы создать приложение (интернет-магазин), в котором каждый блок (частичный) может отображаться отдельно (для обслуживания этих блоков с помощью pAJAX), но в то же время я хочу получить всю страницу, если она запрашивается напрямую. Поясню на примере.

страница каталога интернет-магазина состоит из следующих блоков (частей):

  1. товары
  2. Новости
  3. нижний колонтитул
  4. тележка

Главная страница интернет-магазина состоит из следующих блоков (частей):

  1. статья
  2. Новости
  3. нижний колонтитул
  4. тележка

страница товара интернет-магазина состоит из следующих блоков (частей):

  1. товар
  2. Новости
  3. нижний колонтитул
  4. тележка

Поэтому, если я запрашиваю «/catalog/robots», я получаю страницу со всеми отображаемыми блоками, но когда я запрашиваю «/block/cart», я хотел бы получить только частичное содержимое корзины.

Как правильно спроектировать контроллеры (и представления), чтобы мне не приходилось снова и снова извлекать продукты из корзины в каждом ProductsController, ProductController, IndexController (например)? Могу ли я сделать что-то вроде:

class IndexController extends \Phalcon\Mvc\Controller {

  use CartController;
  use NewController;
  ....

}

Как я могу спроектировать все так, чтобы оно работало так, как я планирую?


person Oleg Smith    schedule 07.11.2013    source источник


Ответы (1)


У меня, вероятно, была бы куча очень тонких контроллеров, которые расширяли бы более существенный базовый контроллер.

class ShopBaseController extends \Phalcon\Mvc\Controller {

    public function getNews( $limit=10 )
    {
        $news = \App\News::find(
            'query stuff here'
           ,'limit'=>$limit
        );

        $this->view->setVar('news', $news); 
    }

    public function getProducts( ... ){ ... }

    public function getCart( ... ){ ... }

    public function getSpecials( ... ){ ... }

}

class IndexController extends ShopBaseController {

    public function indexAction(){
        $this->getNews(10);
        $this->getProducts(array(
            // product params
        ));
        $this->getCart();
        $this->getSpecials();
    }

}

class CatalogController extends ShopBaseController {

    public function indexAction(){
        $this->getNews(5);
        $this->getProducts(array(
            // product params
        ));
        $this->getCart();
        $this->getSpecials();
    }
}

А потом взгляды

<div>
    <?=$this->partial('blocks/news', array( 'news'=>$news ))?>
</div>

так далее

person CodeMonkey    schedule 11.11.2013
comment
Я не хочу быть сварливым парнем, собирающим точки, но похоже, что вы здесь новичок, поэтому, если что-то здорово и помогло вам, принято принимать ответ и / или отмечать его, спасибо :) - person CodeMonkey; 18.11.2013