Цвета товара по типу Связанные товары

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

Julius123 M
Julius123 M
Репутация: 20
Сообщения: 225
Зарегистрирован: 05.02.2017
С нами: 7 лет 2 месяца

Сообщение #1 Julius123 » 25.09.2017, 19:42

Сделал цвета товара по аналогии со связанными товарами, в карточке каждого товара указывается цвет, добавляются товары так же как в связанные товары и на странице выводится блок со списком других цветов этого товара. Но хочу чтобы в title цвета при наведении выводить есть товар в наличии или нет. Вставляю код в тайтл он выводит для всех значение только открытого товара сейчас. Подскажите как выбирать в наличии товар или нет по другим товарам тоже а не только открытого?
код из ProductView.php

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

// Цвета товара
      $self_ids = array();
      $self_products = array();
      foreach($this->products->get_self_products($product->id) as $p)
      {
         $self_ids[] = $p->related_id;
         $self_products[$p->related_id] = null;
      }
      if(!empty($self_ids))
      {
         foreach($this->products->get_products(array('id'=>$self_ids, 'in_stock'=>1, 'visible'=>1)) as $p)
            $self_products[$p->id] = $p;
         
         $self_products_images = $this->products->get_images(array('product_id'=>array_keys($self_products)));
         foreach($self_products_images as $self_product_image)
            if(isset($self_products[$self_product_image->product_id]))
               $self_products[$self_product_image->product_id]->images[] = $self_product_image;
         $self_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($self_products), 'in_stock'=>1));
         foreach($self_products_variants as $self_product_variant)
         {
            if(isset($self_products[$self_product_variant->product_id]))
            {
               $self_products[$self_product_variant->product_id]->variants[] = $self_product_variant;
            }
         }
         foreach($self_products as $id=>$s)
         {
            if(is_object($s))
            {
               $s->image = &$s->images[0];
               $s->variant = &$s->variants[0];
            }
            else
            {
               unset($self_products[$id]);
            }
         }
         $this->design->assign('color_products', $self_products);
      }


Вот так вывожу в шаблоне

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

{* Цвета товара *}
           {if $color_products}
                {foreach $color_products as $color_product}
                  {if $color_product->variant->hex_color}
              <li><a href="/products/{$color_product->url|escape}" title="{if $product->variant->stock > 0}Нет в наличии{else}В наличии{/if}"  style="background: #{$color_product->variant->hex_color}"></a></li>
       {/if}
                {/foreach}
              {/if}


в какую сторону копать?

пару скриншотов чтобы было понятнее
1. https://prnt.sc/gpm50w
2. https://prnt.sc/gpm5ad
3. https://prnt.sc/gpm5fv

OkayCMS M
Администратор
Аватара
OkayCMS M
Администратор
Репутация: 216
Сообщения: 1627
Зарегистрирован: 12.11.2015
С нами: 8 лет 5 месяцев
Сайт Skype

Сообщение #2 OkayCMS » 25.09.2017, 20:47

Посмотрите как это сделано в связанных товарах. Туда не выводятся товары которых нет в наличии вообще.

Julius123 M
Julius123 M
Репутация: 20
Сообщения: 225
Зарегистрирован: 05.02.2017
С нами: 7 лет 2 месяца

Сообщение #3 Julius123 » 26.09.2017, 05:35

OkayCMS писал(а):Посмотрите как это сделано в связанных товарах. Туда не выводятся товары которых нет в наличии вообще.
Все верно. Я сделал вот так, убрав 'in_stock'=>1 . Тогда товары не в наличии выводятся но как выбирать в цикле товары в наличии или нет всех связанных товаров подскажите пожалуйста?

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

// Цвета товара
      $self_ids = array();
      $self_products = array();
      foreach($this->products->get_self_products($product->id) as $p)
      {
         $self_ids[] = $p->related_id;
         $self_products[$p->related_id] = null;
      }
      if(!empty($self_ids))
      {
         foreach($this->products->get_products(array('id'=>$self_ids, 'visible'=>1)) as $p)
            $self_products[$p->id] = $p;
         
         $self_products_images = $this->products->get_images(array('product_id'=>array_keys($self_products)));
         foreach($self_products_images as $self_product_image)
            if(isset($self_products[$self_product_image->product_id]))
               $self_products[$self_product_image->product_id]->images[] = $self_product_image;
         $self_products_variants = $this->variants->get_variants(array('product_id'=>array_keys($self_products)));
         foreach($self_products_variants as $self_product_variant)
         {
            if(isset($self_products[$self_product_variant->product_id]))
            {
               $self_products[$self_product_variant->product_id]->variants[] = $self_product_variant;
            }
         }
         foreach($self_products as $id=>$s)
         {
            if(is_object($s))
            {
               $s->image = &$s->images[0];
               $s->variant = &$s->variants[0];
            }
            else
            {
               unset($self_products[$id]);
            }
         }
         $this->design->assign('color_products', $self_products);
      }

korshunov
korshunov
Репутация: 148
Сообщения: 1862
Зарегистрирован: 03.12.2015
С нами: 8 лет 4 месяца
Skype

Сообщение #4 korshunov » 26.09.2017, 06:48

Если в товарах один вариант, то примерно так

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

{if $color_products}
                {foreach $color_products as $color_product}
                  {if $color_product->variant->hex_color && $color_product->variant->stock > 0}
                           Выбран цвет {$color_product->variant->hex_color}
                  {/if}
                {/foreach}
              {/if}


В общем случае, если в товарах более одного варианта, то несколько сложнее.

Julius123 M
Julius123 M
Репутация: 20
Сообщения: 225
Зарегистрирован: 05.02.2017
С нами: 7 лет 2 месяца

Сообщение #5 Julius123 » 26.09.2017, 10:44

korshunov писал(а):Если в товарах один вариант, то примерно так
Вы наверное не поняли. У меня например циклом foreach выводится 5 цветов товара, у каждого прописан title и в тайтле нужно указать есть этот цвет в наличии или нет, а сейчас во всех title выводится только информация открытого сейчас товара. Например если я открыл цвет который есть в наличии то и все тайл будут в наличии.

Пример:
Открыт третий цвет, который в наличии, первого цвета в наличии нет и соответственно тайл у всех в наличии стоит, не выбирается товар в наличии или нет а просто показывается открытый товар сейчас.
http://prntscr.com/gpufmq

Julius123 M
Julius123 M
Репутация: 20
Сообщения: 225
Зарегистрирован: 05.02.2017
С нами: 7 лет 2 месяца

Сообщение #6 Julius123 » 26.09.2017, 18:16

никто не подскажет? :(

korshunov
korshunov
Репутация: 148
Сообщения: 1862
Зарегистрирован: 03.12.2015
С нами: 8 лет 4 месяца
Skype

Сообщение #7 korshunov » 27.09.2017, 06:08

Чтобы получить полезную подсказку, надо вопрос ставить понятно. А Вы делаете что-то весьма нестандартное, сообщаете о своих действиях кое-как небрежно. Например,
"например циклом foreach выводится 5 цветов товара, у каждого прописан title и в тайтле нужно указать есть этот цвет в наличии или нет" - Если прописан title, то уже и ПРОПИСАН. Что еще указывать-то? Если надо изменить то, как прописан, то надо говорить про это определенно...
"если я открыл цвет" - на сайте открываются страницы, например товаров, а не цвета. Если у Вас открываются именно цвета, надо пояснять точно, а не абы как...


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

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


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

   

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

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

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