Yii catalog

Собираем здесь завершённые проекты, использующие Yii. Один проект — одна тема.
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: мой первый проект на Yii

Сообщение SpiLLeR »

Видимо при выводе value в гриде идет смешение на   в зависимости от уровня вложенности.
str_repeat(' ', $level).' '.$name;
Предупрежден - значит вооружен.
devKP.ru
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

Re: мой первый проект на Yii

Сообщение alexk984 »

MMM_Corp писал(а):Круто, однозначно!

Эх, так и хочется попросить посмотреть сорцов, но это уже будет наверное наглость(((

П.С. Как сделали вывод к-ва запросов к БД? (про время генерации и память в курсе, знаю...)
Еще если не затруднит роскажите побольше как сделали каталог, у меня подобная задачка, вроде сделал, но моя нубская сущность не дает покоя, что сделал как попало, если не затруднит росскажите плиз :oops:
Вот код, который использовал для вывода статистики

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

if (YII_DEBUG) {
        echo '<br/>Отработало за ' . sprintf('%0.5f', Yii::getLogger()->getExecutionTime()) . ' с.';
        echo 'Скушано памяти: ' . round(memory_get_peak_usage() / (1024 * 1024), 2) . ' MB <br>';
            $sql_stats = YII::app()->db->getStats();
            echo $sql_stats[0] . ' запросов к БД, время выполнения запросов - ' . sprintf('%0.5f', $sql_stats[1]) . ' c.';
            }
 
Про сам каталог я подробно не писал, потому что сделан он довольно не идеально и там нужно кое-что переделывать, но нет на это времени.
EAV я не стал использовать, есть примерно такая БД
Изображение
Не знаю что можно по ней понять, но в целом есть категории товаров, в каждую категорию входит несколько групп характеристик, в каждую группу несколько характеристик. В отдельной таблице (attr_val) задаются значения характеристик (например для расширения монитора это будут строки 1024x768, 1920x1280,...). И в таблице good_attr_val хранятся связи между моделями и значениями характеристик. Если характеристики типа да/нет или числовая (type), то значение храниться в таблице good_attr_val в поле value, а соответственно значение пуста.

Но в пример брать это я не советую :) Есть проблемы с представлениями характеристик - например ширина, высота, длина должны быть отображены по шаблону, но задаваться отдельно. Хотя это легко исправить. Но вот с типами характеристик мне кажется некрасиво сделано. Вообще много кто заинтересовался этим проектом, можно было бы вместе сделать каталог как open-source проект на основе моего проекта и вместе написать его нормально, в виде модуля скажем :)
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

Re: мой первый проект на Yii

Сообщение alexk984 »

johnluxor писал(а):Подскажите, а вывод в таблице дерева как осуществили? на первом скрине
Вот методы которые я придумал

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

        public static function GetArrayForDropDownList() {
                $roots = Category::model()->roots()->findAll();
                $res = array();
                foreach ($roots as $root) {
                        if ($root->isLeaf())
                                $res[$root->id] = $root->name;
                        else
                                $res[$root->name] = Category::GetChildren($root);
                }

                return $res;
        }

        private static function GetChildren($elem) {
                $res = array();
                $roots = $elem->children()->findAll();
                foreach ($roots as $root) {
                        if ($root->isLeaf())
                                $res[$root->id] = $root->name;
                        else
                                $res[$root->name] = Category::GetChildren($root);
                }
                return $res;
        }

        public static function GetArrayForDropDownList2() {
                $roots = Category::model()->roots()->findAll();
                $res = array();
                foreach ($roots as $root) {
                        $res[$root->id] = $root->GetStringName();
                        if (!$root->isLeaf())
                                $res = $res + Category::GetChildren2($root, 1);
                }

                return $res;
        }

        private static function GetChildren2($elem, $i) {
                $res = array();
                $roots = $elem->children()->findAll();
                foreach ($roots as $root) {
                        $res[$root->id] = $root->GetStringName();
                        if (!$root->isLeaf())
                                $res = $res + Category::GetChildren2($root, $i + 1);
                }
                return $res;
        }

        public function GetStringName() {
                if ($this->isLeaf())
                        return str_repeat('&nbsp', ($this->level - 1) * 4) . $this->name;
                else
                        return str_repeat('&nbsp', ($this->level - 1) * 4) . "<b>" . $this->name . "</b>";
        } 
Выводят немного по-разному, но я хотел сделать как тут, но как он сделал курсивом так и не понял ;)
Последний раз редактировалось alexk984 2011.03.31, 21:40, всего редактировалось 1 раз.
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

Re: мой первый проект на Yii

Сообщение alexk984 »

Тут еще возникла проблема что надо парсить товары с яндекса, чтобы полноценно протестировать проект :)
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: мой первый проект на Yii

Сообщение rak »

можно и не парсить, а забить бд левыми данными. с соблюдением связей конечно же
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

Re: мой первый проект на Yii

Сообщение alexk984 »

rak писал(а):можно и не парсить, а забить бд левыми данными. с соблюдением связей конечно же
так не интересно :)
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: мой первый проект на Yii

Сообщение rak »

зато на порядок быстрее;)
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

Re: мой первый проект на Yii

Сообщение alexk984 »

rak писал(а):зато на порядок быстрее;)
Представьте что вы показываете заказчику этот проект в качестве своего портфолио, он смотрит и видит набор букв и цифр, вы можете сколько угодно рассказывать про его гениальность, но думаю отношение будет уже совсем другое :)
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: мой первый проект на Yii

Сообщение rak »

alexk984 писал(а):
rak писал(а):зато на порядок быстрее;)
Представьте что вы показываете заказчику этот проект в качестве своего портфолио, он смотрит и видит набор букв и цифр, вы можете сколько угодно рассказывать про его гениальность, но думаю отношение будет уже совсем другое :)
ну если нужно не протестировать проект, а подготовить на показ заказчику - тогда другое дело:)
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

Re: мой первый проект на Yii

Сообщение alexk984 »

Еще проблема с которой столкнулся - не получилось объединить все фильтры в один запрос, сделал тупо, по каждому фильтру вытаскиваются все товары и потом выбирается пересечение этих множеств, такой вариант конечно никуда не годиться, может кто-то подскажет как их объединить, если там значение характеристики товара - отдельная строка таблицы?
Johnatan
Сообщения: 167
Зарегистрирован: 2010.10.27, 13:06
Откуда: Reino de España

Re: мой первый проект на Yii

Сообщение Johnatan »

Не совсем понял, что имеется в виду под "все фильтры в один запрос". Имеется в виду

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

Good::model()->recent()->brand(10)->till(250)->findAll(); 
?
Или имеется в виду поиск?

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

$good = new Good();
$good->attributes = $_POST['Good'];
$good->search(); 
Конференция: yii@conference.jabber.ru
Аватара пользователя
alexk984
Сообщения: 433
Зарегистрирован: 2010.10.21, 15:03
Контактная информация:

Re: мой первый проект на Yii

Сообщение alexk984 »

johnatanb писал(а):Не совсем понял, что имеется в виду под "все фильтры в один запрос".
Я имею ввиду основной метод который по пользовательским ограничениям возвращает нужную страницу результата. Например пользователь задал 2 ограничения на расширение монитора и на диагональ. Есть таблицы
----goods----
id-------name
1-----монитор1
2-----монитор2

----good_attr_value----
id-------good_id------attr_id------value
10---------1--------------1-----------21
11---------2--------------1-----------24
12---------1--------------2---------1024x768
13---------2--------------2---------1920x1280

примерно так (но не в точности). Тут attr_id=1 для диагонали и attr_id=2 для расширения, когда пытаешься объединить запросы то он возвращает список id из второй таблицы а не из первой.
Filsh
Сообщения: 77
Зарегистрирован: 2010.10.17, 11:00
Откуда: Днепропетровск
Контактная информация:

Re: мой первый проект на Yii

Сообщение Filsh »

Мне кажется для этих целей нужно использовать DAO то есть обычный sql
им проще написать сложные запросы и все получается понятней. Ну это мое мнение,
может я и не прав)
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: мой первый проект на Yii

Сообщение mitaichik »

Выражаю респект твоей работе.

Попробуй Good::model()->findBySql($sql)

с таким запросом:

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

SELECT
  t.item_id,
  t.title
FROM
  items AS t
  Inner Join test ON t.item_id = test.item_id AND test.attr_id = 1 AND test.value = 21
  Inner Join test AS test1 ON test.item_id = test1.item_id AND test1.attr_id = 2 AND test1.value = 1024
items - таблица товаров
test - таблица аттрибутов

Как видишь - для каждого фильтра inner join с таблицой аттрибутов. Первый join отсеевает по диагонали, второй - по расширению (условно написал 1024)

Но: 1 если для монитора не задан какой-то параметр - не найдет.
2. Возможно запрос не оптимальный (по производительности). Эт я быстренько набросал, так что над производительностью нужно подумать
Sasha_ch
Сообщения: 80
Зарегистрирован: 2011.04.10, 15:59
Контактная информация:

Re: мой первый проект на Yii

Сообщение Sasha_ch »

Если не трудно - плиз кусок кода, который заполняет `lft`, `rgt` в таблице `category`
Я про эту штуку здесь читал (если кому интерестно будет) http://alexvaleev.ru/margin-sections-bitrix/
..после того как подглядел в мюскле саму структуру таблицы каталога у битриксовцев )
CPU comparison platform: CPU Boss Multi language, Yii2 powered.
Аватара пользователя
pr_o
Сообщения: 65
Зарегистрирован: 2010.01.19, 02:20

Re: мой первый проект на Yii

Сообщение pr_o »

Поработав долгое время с 1С Битриксом мне ваша логика что-то напоминает :)
Sasha_ch
Сообщения: 80
Зарегистрирован: 2011.04.10, 15:59
Контактная информация:

Re: мой первый проект на Yii

Сообщение Sasha_ch »

а я к сожалению (или к радости) с битриксом не успел дело поиметь )
а до NestedSets добраться еще не успел (
CPU comparison platform: CPU Boss Multi language, Yii2 powered.
jackal
Сообщения: 19
Зарегистрирован: 2011.06.29, 16:11

Re: мой первый проект на Yii

Сообщение jackal »

извиняюсь, а что за программка такие красивые схемы БД рисует? http://www.yiiframework.ru/forum/viewto ... =10#p16688
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: мой первый проект на Yii

Сообщение rak »

jackal писал(а):извиняюсь, а что за программка такие красивые схемы БД рисует? http://www.yiiframework.ru/forum/viewto ... =10#p16688
mysql workbench
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: мой первый проект на Yii

Сообщение timlar »

Еще можно рисовать в Dia
Twitter: @timlar_ua
Ответить