Тема: Вывод информации из другой таблицы в шаблоне

Добрый день. Возникла необходимость вывести в шаблоне модуля информацию из другой таблицы.
Иными словами я гружу информацию в шаблоне из таблицы, в которой у меня есть поле product_id, а мне необходимо вместо id вывести название этого товара с ссылкой на него.
Пробовал несколько вариантов но что-то так и не пришел к умозаключению. Заранее спасибо.

Повысить оценку Понизить оценку

Re: Вывод информации из другой таблицы в шаблоне

Добрый день.
Ну чтож, тут есть сразу не сколько решений. Давайте Рассмотрим всё по порядку:

Вариант 1
Нами к smarty(шаблонозатор системы) написан плагин, который позволяет вызывать статический метод  у любого класса системы прямо в шаблоне, главное чтобы это был метод public static
Т.е. допустим у Вас имеется свой собственный класс по пути \Custom\Model\CustomApi и метод loadInfo. Чтобы его вызвать нужно воспользоваться следующей конструкцией:

В шаблоне

{* $list - список Ваших объектов *}
{$list}

{* Вызов метода loadInfo в \Custom\Model\CustomApi *}
{static_call var=new_list callback=['\Custom\Model\CustomApi','loadInfo'] params=[$list]}

Таким образом мы сделаем аналог вызова функции вот так:

$new_list = \Custom\Model\CustomApi::loadInfo($list);

Т.е. в шаблоне все данные, которые будут возвращены в шаблон, возвратятся в $new_list

В Вашем классе надо будет сделать так

/**
*
* @param array $list - массив входящих объектов
*/
public static function loadInfo($list){
    //Пройдёмся в цикле по списку
    foreach ($list as $k=>$item){
       //Получим объект товара сделав запрос к таблице товаров через \RS\ORM\Request 
       $product = \RS\ORM\Request::make()
                             ->from(new \Catalog\Model\Orm\Product()) //Укажем что запрос будет в таблицу товаров
                             ->where(array(
                                   'id' => $item['product_id'] 
                             ))
                             ->object(); //Получим объект \Catalog\Model\Orm\Product
       
       //Ну или вот так ещё короче $product= new \Catalog\Model\Orm\Product($item['product_id']);
        
       $list['product_title'] = $product['title']; //Создаём новый ключ массива, куда и запишем значение названия товара
       //Или можно записать весь объект
       $list['product'] = $product;
       return $list;
    }
}

Получить ссылку на товар можно тогда так:

{$new_list.0.product->getUrl()}
{*
   Аналог
   $new_list[0]['product']->getUrl();
*}

Подробнее метод static_call описани в документации


Вариант 2
Если используете блок контроллер или front контроллер, то можно прямо в контроллере подгрузить эти сведения о товаре. Например через join.
Рассмотрим на примере:
Допустим Вы запросом получаете сведения из одной таблицы, и вам нужно прикрепить данные из другой таблицы.

//Получим список комплектаций с подгруженным полем из товара
$list = \RS\Orm\Request::make()
                 ->select('O.*, P.title as product_title') //Выбрать только все поля таблицы комплектаций и одно поле товара
                 ->from(new \Catalog\Model\Orm\Offer(),'O')  //Запрос к такблице комплектаций с алиасом O
                 ->join(new \Catalog\Model\Orm\Product(),'O.product_id=P.id','P') //Join к таблице товаров с алиасом P
                 ->where("O.product_id>0") // WHERE  O.product_id>0
                 ->objects();

Re: Вывод информации из другой таблицы в шаблоне

Ну что получилось?

Re: Вывод информации из другой таблицы в шаблоне

Да, все получилось реализовать первым способом, второй хоть и попроще, но из-за особенности исполнения модуля не получится им реализовать.
Спасибо огромное за подробное и комментированное объяснение.

Повысить оценку Понизить оценку

Re: Вывод информации из другой таблицы в шаблоне

Не за что)