Yii 1. Получить товары из категорий И их подкатегорий [Неограниченное вложение]

Я работаю над каким-то проектом на основе каталога, который содержит неограниченную вложенность (на самом деле, я думаю, максимальный уровень будет 3, но в любом случае он должен быть динамическим).

Покажу что сделано:

Модель OrganizationCategory:

public function relations()
{
    return array(
        'organizations' => array(self::HAS_MANY, 'Organization', 'organization_category_id'),
        'parent' => array(self::BELONGS_TO, 'OrganizationCategory', 'category_parent_id'),
        'children' => array(self::HAS_MANY, 'OrganizationCategory', 'category_parent_id'),
    );
}

public static function getParentCategories()
{
    if (is_null(self::$categories))
    {
        self::$categories = array();
        $criteria = new CDbCriteria();
        $criteria->order = 't.category_title';
        $criteria->condition = "t.category_parent_id IS NULL";
        $arr = self::model()->with('children')->findAll($criteria);
        foreach ($arr as $item)
            self::$categories[$item->primaryKey] = $item;
    }

    return self::$categories;
}

public static function createTree($children, $counter)
{
    $tree = '';

    if(count($children)){

        $tree .= CHtml::tag('ul', array('class'=>'menu_open_'.$counter));

        foreach($children as $child):

            $childrenSub = self::createTree($child->children, $counter+1);

            $tree .= CHtml::tag('li',  (empty($childrenSub) ? array('class'=>'no_child_li') : array()));

            $organizations = Organization::model()->findByAttributes(array('organization_category_id'=>$child->category_id));

            $tree .= CHtml::link($child->category_title, array('organizationCategory/view', 'slug'=>$child->category_slug));

            $tree .= $childrenSub;
            $tree .=CHtml::closeTag('li');

        endforeach;

        $tree .= CHtml::closeTag('ul');

    }

    return $tree;
}

КатегорияКонтроллер:

public function actionView($slug = '')
{
    $model = $this->loadModelSlug($slug);

    $organizationsList = Organization::getOrganizations($model->category_id);

    $this->pageTitle=$model->category_title;
    Yii::app()->clientScript->registerMetaTag($model->meta_description, 'description');
    Yii::app()->clientScript->registerMetaTag($model->meta_keywords, 'keywords');

    $this->render('view',array(
        'model'=>$model,
        'organizationsList'=>$organizationsList,
    ));
}

Модель организации getOrganizations():

public static function getOrganizations($category_id) {

    $criteria = new CDbCriteria;
    $criteria->condition = 'organization_category_id = :cat_id';
    $criteria->params = array(':cat_id'=>$category_id);
    $result = self::model()->findAll($criteria);

    return $result;
}

Категория view.php

<?php if(!empty($model->children)) {
echo OrganizationCategory::model()->createTree($model->children, 1); 
} ?>

<?php $i=1; foreach($model->organizations as $organization): ?>
    blah blah blah
<?php $i++; endforeach; ?>

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

И моя цель - получить продукты из категорий и всех их подкатегорий-> подкатегории-> подкатегории.

Я пытался найти решение почти везде, но до сих пор не могу реализовать эту тривиальную задачу в своем проекте.

Буду признателен за любую оказанную помощь, спасибо


person Decd    schedule 20.05.2015    source источник
comment
Вы можете перезаписать класс CModel, чтобы получить родительские модели при вызове, перезаписав магический метод get.   -  person Jelle de Fries    schedule 20.05.2015
comment
Всем привет! Я действительно не могу понять, как это может помочь мне получить организации из текущей категории и всех ее подкатегорий-›подкатегорий-›подкатегорий.   -  person Decd    schedule 20.05.2015
comment
Вам нужны организации или продукты?   -  person Jelle de Fries    schedule 20.05.2015
comment
Сейчас я работаю над организациями, но это очень похоже на товары в торговых категориях.   -  person Decd    schedule 20.05.2015


Ответы (1)


Для других людей, которые могут быть заинтересованы в этой проблеме, я решил ее таким образом:

В действии просмотра контроллера категории я вызываю:

$model = $this->loadModelSlug($slug);
$organizationsList = Organization::getOrganizationsFromSubcategories($model);

В модели организации:

public static function getOrganizationsFromSubcategories($category) {

    $childCategoriesIds = OrganizationCategory::getChildCategoriesIds($category);

    $criteria = new CDbCriteria();
    $criteria->addInCondition('organization_category_id', $childCategoriesIds);
    $result = self::model()->findAll($criteria);

    return $result;
}

И, наконец, в OrganizationCategory:

public static function getChildCategoriesIds($category)
{
    $arr = array($category->primaryKey);

    if (!empty($category->children))
        foreach ($category->children as $child_category) $arr = array_merge($arr, self::getChildCategoriesIds($child_category));

    return $arr;
}
person Decd    schedule 25.05.2015