Вывести категории и товары на одной странице

226
19 декабря 2018, 13:50

Мне нужно вывести категории и товары на одной странице, как здесь - http://bavaria.bavaria-rest.ru/products

Код ProductController -

    <?php

class ProductController extends Controller
{
    public function actionIndex()
    {
        $mod = new Category();
        $model = $mod->selectAll();
        $cat = Category::findAll(['active' => 1]);
        $mod1 = new Product();
        $product = $mod1->selectCat($cat->id);
        $product1 = Product::find()->all();

    }

        return $this->render('index', 
            [
                'model' => $model,
                'cat' => $cat,
                'product' => $product,
                'product1' => $product1,
                /*'add' => $this->findModel($alias),*/
            ]);
    }

}

Код модели Product -

    <?php


class Product extends BaseModel
{
    public function rules()
    {
        return [
            [['name', 'price', 'categoryId'], 'required'],
            [['description'], 'string'],
            [['type', 'count', 'active', 'categoryId', 'clear', 'clear1', 'clear2', 'clear3', 'clear4'], 'integer'],
            [['price'], 'number'],
            [['createdAt', 'updatedAt'], 'safe'],
            [['name', 'alias', 'image', 'image1', 'image2', 'image3', 'image4', 'title'], 'string', 'max' => 255],
            [['metaKeywords', 'metaDescription'], 'string', 'max' => 300],
            ['alias', 'unique'],
            ['name', 'unique'],
            //дополнительные поля
            [['str1', 'str1'], 'string', 'max' => 255],
            [['num1', 'num2'], 'integer']
        ];
    }

    public function getCategory()
    {
        return $this->hasOne(Category::className(), ['id' => 'categoryId']);
    }

    public function selectCat($id)
    {
        return self::find()->where(['categoryId' => $id])->all();
    }
    public function getAction()
   {
    return Product::find()->limit(7)->where('categoryId = 2')->all();
   }
}

Код модели Category -

<?php

class Category extends BaseModel
{

    public function rules()
    {
        return [
            [['name'], 'required'],
            [['parentId', 'active', 'sort'], 'integer'],
            [['active'], 'default', 'value' => 1],
            [['createdAt', 'updatedAt'], 'safe'],
            [['name', 'alias', 'image', 'title'], 'string', 'max' => 255],
            [['description'], 'string'],
            [['metaKeywords', 'metaDescription'], 'string', 'max' => 300],
            ['parentId', 'validateParent'],
            [['clear'], 'integer'],
            ['name', 'unique'],
            ['alias', 'unique']
        ];
    }

    public function selectAll()
    {
        return self::find()->where('id != 2 AND sort = 0')->all();
    }
}

Код CategoryController -

<?php
class CategoryController extends Controller
{
    public function actionIndex()
    {
        $searchModel = new CategorySearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }


}

Код view -

<?php

<section id="contant">
 <a id="main-content"></a>                    
 <div class="region region-content">
  <section id="block-views-delivery-header-header" class="block block-views clearfix">
    <h2 class="block-title">Доставка готовых блюд из ресторана "Бавария"</h2>   
    <div class="view view-delivery-header view-id-delivery_header view-display-id-header view-dom-id-0befc60be66c1da85f8b16cd12d233c2">             
      <div class="delivery-label">        Порадуйте себя и своих близких любимыми и вкуснейшими блюдами, заказав доставку в удобное для Вас время и место  </div>  
      <div class="delivery-condition">        <p>При заказе на сумму от 650 рублей доставка БЕСПЛАТНАЯ.</p>
        <p>При заказе с сайта или мобильного приложения действует скидка 7%</p>
      </div>  
    </div>
  </section>
  <section id="block-views-taxonomy-category-block" class="block block-views clearfix">  
    <div class="category-menu container clearfix "> 
      <?php foreach($model as $cat): ?>
       <a class="go_to" href="#<?= $cat->id ?>"><div><p><?= $cat->title ?></p></div></a> 
     <?php endforeach; ?> 
   </div>
 </section>

 <section id="block-system-main" class="block block-system clearfix">
  <div class="gpbgrid container clearfix">
    <?php foreach($model as $cats): ?>
      <div class="category"><div class="link" id="<?= $cats->id ?>"></div><h2><?= $cats->name ?></h2></div>  
      <?php foreach ($product1 as $art): ?>
        <div class="product item">
          <div class="commerce-add-to-cart commerce-cart-add-to-cart-form-236"  id="commerce-cart-add-to-cart-form-236"><div>
            <button type="button" class="btn btn-warning cart-add" data-cart="<?= $art->id ?>" data-alias="<?= Url::to(['product/view', 'alias' => $model->alias]) ?>">Добавить в корзину</button>
          </div></div>    
          <div class="description"><div class="price"><?= $art->price /*- ceil(($art->price * 7) / 100)*/ ?></div><div class="composition"><?= $art->title ?>
          </div></div>    
          <div class="background-wrap">
            <?= Html::img('/uploads/img/' . $art->image, [
              'style' => [
                'width' => '333px',
                'height' => '225px',
                ]]) ?> 
          </div>
        </div>
          <?php endforeach; ?>
        <?php endforeach; ?>
      </div>
    </section>
  </div>
</section>

Как мне это вывести в цикле, чтобы шла категория, а за ней все ее продукты?

Answer 1

Разобрался сам, код ProductController -

 public function actionIndex()
        {
            $mod = new Category();
            $model = $mod->selectAll();
            $category = Category::find()->asArray()->all();
            $product= Product::find()->asArray()->all();
            return $this->render('index', 
                [
                    'model' => $model,
                    'category' => $category,
                    'product' => $product
                    /*'add' => $this->findModel($alias),*/
                ]);
        }

Во view -

<section id="contant">
 <a id="main-content"></a>                    
 <div class="region region-content">
  <section id="block-views-delivery-header-header" class="block block-views clearfix">
    <h2 class="block-title">Доставка готовых блюд из ресторана "Бавария"</h2>   
    <div class="view view-delivery-header view-id-delivery_header view-display-id-header view-dom-id-0befc60be66c1da85f8b16cd12d233c2">             
      <div class="delivery-label">        Порадуйте себя и своих близких любимыми и вкуснейшими блюдами, заказав доставку в удобное для Вас время и место  </div>  
      <div class="delivery-condition">        <p>При заказе на сумму от 650 рублей доставка БЕСПЛАТНАЯ.</p>
        <p>При заказе с сайта или мобильного приложения действует скидка 7%</p>
      </div>  
    </div>
  </section>
  <section id="block-views-taxonomy-category-block" class="block block-views clearfix">  
    <div class="category-menu container clearfix "> 
      <?php foreach($model as $cat): ?>
       <a class="go_to" href="#<?= $cat->id ?>"><div><p><?= $cat->title ?></p></div></a> 
     <?php endforeach; ?> 
   </div>
 </section>




 <section id="block-system-main" class="block block-system clearfix">
  <div class="gpbgrid container clearfix">
   <?php  foreach ($category as $item) :?>
    <?php if ($item['sort'] ==  0): ?>
      <div class="category"><div class="link" id="<?= $item['id'] ?>"></div><h2><?=$item['title']?></h2></div>  
      <?php  foreach ($product as $itemok) :?>
        <?php if ($item['id'] ==  $itemok['categoryId']): ?>
        <div class="product item">
          <div class="commerce-add-to-cart commerce-cart-add-to-cart-form-236"  id="commerce-cart-add-to-cart-form-236"><div>
            <button type="button" class="btn btn-warning cart-add" data-cart="<?=$itemok['id']?>" data-alias="<?= Url::to(['product/view', 'alias' => $itemok['alias']]) ?>">Добавить в корзину</button>
          </div></div>    
          <div class="description"><div class="price"><?=$itemok['price']?></div><div class="composition"><?=$itemok['title']?>
          </div></div>    
          <div class="background-wrap">
            <?= Html::img('/uploads/img/' . $itemok['image'], [
              'style' => [
                'width' => '333px',
                'height' => '225px',
                ]]) ?> 
          </div>
        </div>
         <?php endif; ?>
          <?php endforeach; ?>
          <?php endif; ?>
        <?php endforeach; ?>
      </div>
    </section>  
Answer 2

Вариант 1, чуть быстрее, но не правильней В ProductController:

    $cat = Category::findAll(['active' => 1]);
    $mod1 = new Product();
    foreach ($cat as $key => $cat_one) {
        $products = $mod1->selectCat($cat_one->id);
        $cat[$key]['products'] = $products;
    }

В итоге, в $cat у каждой категории будет массив products с продуктами

Вариант 2, чуть дольше, но правильнее В модели Product написать подобную функцию, которая вернет такой же преобразованный массив

READ ALSO
Картинка в ссылке

Картинка в ссылке

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

162
Как поменять язык форматированного datetime в Laravel

Как поменять язык форматированного datetime в Laravel

столкнулся с проблемой рендеринга языка форматированного datetime в Laravel тоесть по-умолчанию если использовать например $personal->created_at->format('d B Y') то будет...

165