Вывести свойство в products.tpl

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

trainracing M
Аватара
trainracing M
Возраст: 27
Репутация: 11
Сообщения: 112
Зарегистрирован: 07.10.2016
С нами: 3 года 2 месяца
Сайт

Сообщение #1 trainracing » 11.10.2016, 13:52

Не могу вывести определенное свойстро в списке товаров.

код в products.tpl

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

 {foreach $product->features as $f}
{if $f->feature_id == '16'}
<span class="svoistvo1">{$f->value}Квт</span>
{/if}
{/foreach}


в view/productsview.php добавил:

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

$product->features = $this->features->get_product_options(array('product_id'=>$product->id));
         $features = $this->features->get_product_options($products_ids);
         foreach($features as &$feature)
         {
         $products[$feature->product_id]->features[] = $feature;
         }
   
         
         $properties = $this->features->get_options(array('product_id'=>$products_ids));
         foreach($properties as $property)
            $products[$property->product_id]->options[] = $property;
         




и не выводится ничего(( помогите плз правильным кодом

korshunov
korshunov
Репутация: 89
Сообщения: 1097
Зарегистрирован: 03.12.2015
С нами: 4 года
Skype

Сообщение #2 korshunov » 11.10.2016, 15:33

Ваш код выглядит так, как будет выискивали где могли что-то похожее и копировали до кучи без особого понятия...

И сами Ваши пояснения крайне небрежны. "в view/productsview.php добавил" - добавить можно очень по-разному.

Попробуйте для начала написать ТОЧНО, что и куда Вы вставили. Потом попробуйте объяснить, почему вставили именно это и именно туда, попробуйте понять, что делает каждая отдельная строка...

trainracing M
Аватара
trainracing M
Возраст: 27
Репутация: 11
Сообщения: 112
Зарегистрирован: 07.10.2016
С нами: 3 года 2 месяца
Сайт

Сообщение #3 trainracing » 12.10.2016, 09:02

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

код вставлял после строки 393:

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

foreach($options as $option) {
                if(isset($features[$option->feature_id])) {
                    $features[$option->feature_id]->options[] = $option;
                }
            }



Прошу подсказать, как выводить свойства товара в списке товаров. Не могу понять.

korshunov
korshunov
Репутация: 89
Сообщения: 1097
Зарегистрирован: 03.12.2015
С нами: 4 года
Skype

Сообщение #4 korshunov » 12.10.2016, 09:33

В Вашей вставке масса ошибок.
Чтобы написать правильный код, надо поработать точно и аккуратно, а не кое-как.
Если готовы оплачивать работу, обращайтесь в личку...

Vitaly
Аватара
Vitaly
Репутация: 20
Сообщения: 109
Зарегистрирован: 15.08.2016
С нами: 3 года 3 месяца

Сообщение #5 Vitaly » 13.10.2016, 14:24

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

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

{foreach $features as $key=>$f}
   {if $f->id == 16}
      {$f->name}<br>
      {foreach $f->options as $o}
         {$o->value}<br>
      {/foreach}
   {/if}
{/foreach}

Так можно вывести определенное свойство по id, с его значениями в products.tpl

trainracing M
Аватара
trainracing M
Возраст: 27
Репутация: 11
Сообщения: 112
Зарегистрирован: 07.10.2016
С нами: 3 года 2 месяца
Сайт

Сообщение #6 trainracing » 14.10.2016, 07:42

Так ничего не выводится((

Vitaly писал(а):Да, мало что понятно из вашего вопроса, но попытаюсь дать наводку

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

{foreach $features as $key=>$f}
   {if $f->id == 16}
      {$f->name}<br>
      {foreach $f->options as $o}
         {$o->value}<br>
      {/foreach}
   {/if}
{/foreach}

Так можно вывести определенное свойство по id, с его значениями в products.tpl

Vitaly
Аватара
Vitaly
Репутация: 20
Сообщения: 109
Зарегистрирован: 15.08.2016
С нами: 3 года 3 месяца

Сообщение #7 Vitaly » 14.10.2016, 07:55

trainracing писал(а):Так ничего не выводится((
Пишите нормально вопросы.
Куда вы вставляете код?
Существующий ли ID свойства указываете?

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

{foreach $features as $key=>$f}
      {$f->name}<br>
      {foreach $f->options as $o}
         {$o->value}<br>
      {/foreach}
{/foreach}

Что выводит такой код?

trainracing M
Аватара
trainracing M
Возраст: 27
Репутация: 11
Сообщения: 112
Зарегистрирован: 07.10.2016
С нами: 3 года 2 месяца
Сайт

Сообщение #8 trainracing » 14.10.2016, 08:34

в tiny_products.tpl после названия товара
Vitaly писал(а):
trainracing писал(а):Так ничего не выводится((
Пишите нормально вопросы.
Куда вы вставляете код?
Существующий ли ID свойства указываете?

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

{foreach $features as $key=>$f}
      {$f->name}<br>
      {foreach $f->options as $o}
         {$o->value}<br>
      {/foreach}
{/foreach}

Что выводит такой код?

id конечно существует, я ж не дебил.


по коду - выводит все названия и содержания свойств всех товаров, а не все свойства и содерж именно этого товара (выводит текст левого меню)

Снимок7.PNG

Vitaly
Аватара
Vitaly
Репутация: 20
Сообщения: 109
Зарегистрирован: 15.08.2016
С нами: 3 года 3 месяца

Сообщение #9 Vitaly » 14.10.2016, 10:32

trainracing писал(а):Не могу вывести определенное свойстро в списке товаров.
Предложенный мной код, есть ответ на этот вопрос. Второй вариант кода выводит все свойства, потому как убрано условие, которое проверяет ID свойства.
trainracing писал(а):выводит все названия и содержания свойств всех товаров, а не все свойства и содерж именно этого товара (выводит текст левого меню)
Ну извините, экстрасенсорику не практикую. Учитесь внятно задавать вопросы, получите нужные ответы.

trainracing M
Аватара
trainracing M
Возраст: 27
Репутация: 11
Сообщения: 112
Зарегистрирован: 07.10.2016
С нами: 3 года 2 месяца
Сайт

Сообщение #10 trainracing » 18.10.2016, 08:01

Vitaly писал(а):Ну извините, экстрасенсорику не практикую. Учитесь внятно задавать вопросы, получите нужные ответы.


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

m1hasik M
Аватара
m1hasik M
Возраст: 28
Репутация: 31
Сообщения: 200
Зарегистрирован: 12.11.2015
С нами: 4 года
Откуда: Днепр
Skype

Сообщение #11 m1hasik » 18.10.2016, 09:44

trainracing писал(а):
Vitaly писал(а):Ну извините, экстрасенсорику не практикую. Учитесь внятно задавать вопросы, получите нужные ответы.


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

Нужный код выделен комментарием /*Вывод свойств в каталоге*/
Вот в файле ProductsView.php сделайте вот так

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

$images = $this->products->get_images(array('product_id'=>$products_ids));
         foreach($images as $image)
            $products[$image->product_id]->images[] = $image;

         /*Вывод свойств в каталоге*/
         foreach ($products_ids as $p_id) {
            $properties = $this->features->get_product_options(array('product_id' => $p_id));

            foreach($properties as &$property)
               $products[$property->product_id]->options[] = $property;
         }
         /*Вывод свойств в каталоге*/

         foreach($products as &$product)
         {
            if(isset($product->variants[0]))
               $product->variant = $product->variants[0];
            if(isset($product->images[0]))
               $product->image = $product->images[0];
            /*Вывод свойств в каталоге*/
            if (isset($product->options[0]))
               $product->option = $product->options[0];
            /*Вывод свойств в каталоге*/
         }


А в файле шаблона работайте вот так

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

 {foreach $product->options as $o}
                    {if $o->feature_id == 'xx'}
                        {$o->value}
                    {/if}
                {/foreach}

korshunov
korshunov
Репутация: 89
Сообщения: 1097
Зарегистрирован: 03.12.2015
С нами: 4 года
Skype

Сообщение #12 korshunov » 18.10.2016, 11:10

m1hasik писал(а):Вот в файле ProductsView.php сделайте вот так

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

$images = $this->products->get_images(array('product_id'=>$products_ids));
         foreach($images as $image)
            $products[$image->product_id]->images[] = $image;

         /*Вывод свойств в каталоге*/
         foreach ($products_ids as $p_id) {
            $properties = $this->features->get_product_options(array('product_id' => $p_id));

            foreach($properties as &$property)
               $products[$property->product_id]->options[] = $property;
         }
         /*Вывод свойств в каталоге*/

         foreach($products as &$product)
         {
            if(isset($product->variants[0]))
               $product->variant = $product->variants[0];
            if(isset($product->images[0]))
               $product->image = $product->images[0];
            /*Вывод свойств в каталоге*/
            if (isset($product->options[0]))
               $product->option = $product->options[0];
            /*Вывод свойств в каталоге*/
         }



Работать-то оно будет. НО:
Код безобразно нерациональный и совершенно недопустимый.
1. Например, если на странице категории показываются 20 товаров, то этот код будет чудесным образом делать 20 запросов к БД. Ужасно большая нагрузка на БД! Это выглядит примерно как заказать 20 автомобилей такси, чтобы перевезти 20 порций пиццы из магазина по одному адресу...
2. Другой момент - выбираются из базы ВСЕ свойства, а используется в итоге одно. Это выглядит примерно столь же нерационально: заказать 50 блюд на обед одному ребенку, а все, что останется - выбросить. Зато у ребенка выбор будет...

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

m1hasik M
Аватара
m1hasik M
Возраст: 28
Репутация: 31
Сообщения: 200
Зарегистрирован: 12.11.2015
С нами: 4 года
Откуда: Днепр
Skype

Сообщение #13 m1hasik » 18.10.2016, 11:42

Работать-то оно будет. НО:
Код безобразно нерациональный и совершенно недопустимый.
1. Например, если на странице категории показываются 20 товаров, то этот код будет чудесным образом делать 20 запросов к БД. Ужасно большая нагрузка на БД! Это выглядит примерно как заказать 20 автомобилей такси, чтобы перевезти 20 порций пиццы из магазина по одному адресу...
2. Другой момент - выбираются из базы ВСЕ свойства, а используется в итоге одно. Это выглядит примерно столь же нерационально: заказать 50 блюд на обед одному ребенку, а все, что останется - выбросить. Зато у ребенка выбор будет...

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

Человеку надо просто, что бы работало. Не нравится не фыркайте. Лучше бы подсказали нормально.
Если докопаться то и windows плохо работает.

korshunov
korshunov
Репутация: 89
Сообщения: 1097
Зарегистрирован: 03.12.2015
С нами: 4 года
Skype

Сообщение #14 korshunov » 18.10.2016, 12:33

m1hasik писал(а):Человеку надо просто, что бы работало.

Сомневаюсь, чтобы человеку надо, чтобы работало настолько ПЛОХО, как предложено.
Мне приходится раза 3-4 в год оптимизировать подобные фрагменты кода после того, как владелец сайта жалуется, что работает медленно и даже переход на более мощный сервер мало помогает...

m1hasik писал(а):Лучше бы подсказали нормально.

Образец того, как надо делать, можно видеть в том же файле в стандартном коде аккурат рядышком с Вашей вставкой. Требуется лишь глаза разуть...

m1hasik писал(а):Если докопаться то и windows плохо работает.

Вот Вы докопайтесь и сообщайте ТОЧНЫЕ результаты, чтобы не трепаться впустую.
А пока Ваше отношение явно несерьезное: ничего страшного, что у меня сработано плохо, у других тоже бывает...

skull3d M
skull3d M
Репутация: 1
Сообщения: 8
Зарегистрирован: 12.05.2016
С нами: 3 года 6 месяцев

Сообщение #15 skull3d » 09.11.2016, 06:17

В ProductsView.php находим:

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

if(!empty($products))


и в конец первого цикла foreach($products as $product) добавляем строку:

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

$product->features = $this->features->get_product_options(array('product_id'=>$product->id));


Должно получиться так:

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

foreach($products as $product) {
  $product->variants = array();
  $product->images = array();
  $product->properties = array();
  $product->features = $this->features->get_product_options(array('product_id'=>$product->id));
}


Затем в tiny_products.tpl, выводим где угодно:

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

{foreach $product->features as $f}
 {if $f->feature_id == 3}
   <div>{$f->value}</div>
 {/if}
{/foreach}
фрилансер

korshunov
korshunov
Репутация: 89
Сообщения: 1097
Зарегистрирован: 03.12.2015
С нами: 4 года
Skype

Сообщение #16 korshunov » 09.11.2016, 10:34

skull3d, Ваше решение мало отличается от того, которое ранее предложил m1hasik.
Недостатки те же: формально работает, но имеет те же два СУЩЕСТВЕННЫХ недостатка, упомянутые ранее. В то же время недалеко от Вашей вставки в стандартном коде можно видеть образец того, как такое надо делать...

skull3d M
skull3d M
Репутация: 1
Сообщения: 8
Зарегистрирован: 12.05.2016
С нами: 3 года 6 месяцев

Сообщение #17 skull3d » 09.11.2016, 11:11

Мы всё ближе и ближе к правильному решению, давайте поднажмем ребята :)
фрилансер

korshunov
korshunov
Репутация: 89
Сообщения: 1097
Зарегистрирован: 03.12.2015
С нами: 4 года
Skype

Сообщение #18 korshunov » 09.11.2016, 15:39

Если Вы хорошо копируете плохие решения, это не есть "всё ближе и ближе"...

trainracing M
Аватара
trainracing M
Возраст: 27
Репутация: 11
Сообщения: 112
Зарегистрирован: 07.10.2016
С нами: 3 года 2 месяца
Сайт

Сообщение #19 trainracing » 21.11.2016, 13:11

korshunov писал(а):Если Вы хорошо копируете плохие решения, это не есть "всё ближе и ближе"...


Корс, я тут почитал все предложения, правильно было бы так?

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

$features = $this->features->get_options(array('product_id'=>$products_ids));
          foreach($features as $feature) {
          $products[$feature->product_id]->features[] = $feature; }

korshunov
korshunov
Репутация: 89
Сообщения: 1097
Зарегистрирован: 03.12.2015
С нами: 4 года
Skype

Сообщение #20 korshunov » 22.11.2016, 09:39

Это уже что-то осмысленное...

А если использовать
$features = $this->features->get_options(array('product_id'=>$products_ids, 'feature_id'=>16));
то получите выборку только одного свойства, будет экономнее...


Название раздела: Вопросы по работе с OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Вопросы по работе с OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость