Страница 1 из 2

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

Добавлено: 11.10.2016, 13:52
trainracing
Не могу вывести определенное свойстро в списке товаров.

код в 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;
         




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

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

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

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

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

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

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

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



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

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

Добавлено: 13.10.2016, 14:24
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

Добавлено: 14.10.2016, 07:42
trainracing
Так ничего не выводится((

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

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

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

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

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

Добавлено: 14.10.2016, 08:34
trainracing
в 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

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

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


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

Добавлено: 18.10.2016, 09:44
m1hasik
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}

Добавлено: 18.10.2016, 11:10
korshunov
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 блюд на обед одному ребенку, а все, что останется - выбросить. Зато у ребенка выбор будет...

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

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

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

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

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

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

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

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

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

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

Добавлено: 09.11.2016, 06:17
skull3d
В 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}

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

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

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

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


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

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

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

Добавлено: 22.11.2016, 09:39
korshunov
Это уже что-то осмысленное...

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