Придется выносить объект комментариев из объекта или есть решение?

Nicki

Новичок
Придется выносить объект комментариев из объекта или есть решение?

Подскажите пожалуйста как быть, буду очень благодарен. Сейчас пишу движек для магазина. Магазин имеет особенность в том, что у нескольких товаров совпадает часть данных: название, описание, производитель, а отличия между ними в объеме и соответственно цене. Чтоб было нагляднее можно посмотреть страницу http://oui.ru/good.php?vendor_id=166 - на этот сайт мне сказали ориентироватся. Модель получилась такой:
PHP:
class Group
{
    ... другие общие свойства всех Commodities 
    protected $Commodities = null;              // объект коллекции товаров
    protected $Commentaries = null;             // объект коллекции отзывов о товаре
}
т.е. объект группы товаров, который описывает модель общих для всех товаров данных, содержит и двасвойства в которых записываются объекты-коллекции (массив я не стал использовать в данном случае).

Чтобы ускорить генерацию страницы и снизить нагрузку на БД стал прикручивать кэш, но вознакла ситуация, и как быть не знаю, т.к. опыта мало у меня. Чтобы уменьшить временные затраты решил создавать как можно меньше объектов. В итоге получился такой алгоритм: после выборки данных из БД необходимой группы (или групп) проверяю, есть ли готовый html для вывода данной группы или нет. Если есть, то не создаются объекты этих групп, а так же, соответственно и объекты товаров в них, комментариев, производителя и т.д. При этом в коллекцию добавляется не объект, а просто id группы:
PHP:
// создаем объект коллекцию для списка групп. Этот объект потом передается в шаблонизатор 
// для вывода списка товарных групп.
$Groups = new List_Iterator;
// я использую ADODB. $result - это объект ADORecordSet
if (0 != $result->RecordCount()) 
{
    while ($data = $result->FetchRow())
    {
        // если есть в кэше готоый html
        if ($this->Cache->hasCaching('groups', $data['groupId'], 'html_for_admin'))
            // добавляем в коллекцию только id группы, а не объект группы
            $Groups->append($data['groupId'], $data['groupId']);
        // html кода нет - значит создаем объекты добавляя их в коллекцию
        else { 
            if ($Group = $this->createObjectGroup($data))
                $Groups->append($Group);
        }
    }
}

return $Objects;
Дальше коллекция попадает в шаблонизатор итам происходит такая вот проверка:
PHP:
// создание html кода для вывода групп
while ($Group = $Groups->getNext())
    $groupsHtml[] = _getHtml($Group);

function _getHtml($Group)
{
    $Cache = Core::getCache();
    
    // берем данные  из кэша
    $groupId = (is_object($Group)? $Group->getId():$Group);
    if (false !== ($data = $Cache->get('groups', $groupId, 'html_for_admin')))
        return $data;

    // генерация html
    $out = '...  ...';
    
    // сохранение в кэше и возврат
    $Cache->save($out, 'groups', $groupId, 'html_for_admin');
    return $out;
}
Проблема в том, что html код генерируется без вывода списка комментариев к товарам и если юзер откроет страницу с комментариями (как по ссылке выше), то скрипт, найдя готовый html для вывода группы, добавит в коллекцию не объект группы, а только ее id, и при добавлении объекта коллекции комментариев в дальнейшем произойдет ошибка, т.к. объекта группы нет в коллекции объектов...
Как быть? Сейчас у меня для получения списка товаров и комментариев в группе используются методы (единообразный стиль):

PHP:
// получаем объект коллекцию товаров в группе
$Commodities = $Group->getCommodities();

// получаем объект коллекцию комментариев к товарам в группе
$Commentaries = $Group->getCommentaries();
А теперь не знаю как быть с коллекцией комментариев для тех групп, html которых уже существует, но без комментариев. Генерировать html сразу с комментариями не вариант - они нужны только если просматривается не список групп товаров, а какая то одна группа. И делать два варианта тоже не хочу (с комментариями и без), т.к. если комментов много нужен постраничный вывод... короче не вариант. У меня пока одна мысль - вынести объект коллекции комментпариев совсем из группы, и работать с комментариями отдельно от групп. Но... очень этого не хочется...

Подскажите пожалуйста как быть. Может совсем изменить как то реализацию отношений между объектами, или еще что...
Пожалуйста не пинайте сильно, т.к. опыта мало пока при работе с объектами. :confused:
 

Alexandre

PHPПенсионер
1) просьба убрать ссылку в подписи...
Я понимаю, если бы это был OpenSource, например mzz

2) тебе надо сделать группировку и опыт работы с объектами здесь не причем...
вводишь еще один уровень уровень:
- список групп наименований
- список товаров одной группы наименования
те делаешь два цикла, надеюсь шаблонизатор может воспринимать вложенные данные, или делавешь двойной рендеринг...
 

Nicki

Новичок
А можно чуть поподробнее, а то не понял куда этот уровень вводить... если можно с примером, хотя бы чуть-чуть. Пожалуйста.

Заранее спасибо большое!
 

Alexandre

PHPПенсионер
алгоритм группировки приблизительно следующий
работает если выборка отсортирована по имени товара
Код:
1) берем данные...из БД, кеша или еще откуда-то
2) $old=''; $groups=array();
3) пробегаемся циклом по всем товарам;
4) if (  $title!= $old ) then{
   // здесь еще проверка на певую итерацию
   if ( $old !='' )
       $groups[] = array( 'title' => $title, 'items' =>$items  );
   $items = array();
   $old=$title;
  }
 // идет обработка данных
 $item[]=array(  'price' => $price, 'vol'=> $vol , etc...)
5) полученный массив передаешь в шаблонизатор
array(
0=> array (
     'title' => товар 1
     'items' => array (   
        0 => array (  'price'=> 10,6  'vol' => 125  ),
        1 => array (  'price'=> 8,6  'vol' => 100  ),
        2 => array (  'price'=> 6,9  'vol' => 50  ),
                )
  )
1=> array (
     'title' => товар 2
     'items' => array (   
        0 => array (  'price'=> 25  'vol' => 25  ),
        1 => array (  'price'=> 35  'vol' => 50  ),
        2 => array (  'price'=> 50  'vol' => 100  ),
                )
  )
)
5) на уровне шаблонизатора пробегаемся по первому уровню массива и строим шабон для товара и комемтария
6) далее пробегаемся циклом по внутреннему массиву и выводим цену и объем или иную характеристику.
 
Сверху