Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Смена главного изображения товара (https://javascript.ru/forum/misc/75099-smena-glavnogo-izobrazheniya-tovara.html)

_marisha 03.09.2018 08:26

Смена главного изображения товара
 
Вложений: 1
Доброго времени суток!
В карточке товара выводятся дополнительные фото (MORE_PHOTO) под главным изображением (скрин 1)
Необходимо, чтобы при нажатии на доп фото производилась смена главного изображения на выбранное.
Подскажите, пожалуйста, каким образом возможно сделать? Может есть примеры? Спасибо.

Здесь происходит вывод главного изображения:
foreach ($actualItem['MORE_PHOTO'] as $key => $photo)
                {?>                   
                  <div class="product-item-detail-slider-image<?=($key == 0 ? ' active' : '')?>" data-entity="image" data-id="<?=$photo['ID']?>" id="<?=$photo['ID']?>">
                    <img src="<?=$photo['SRC']?>" alt="<?=$alt?>" title="<?=$title?>"<?=($key == 0 ? ' itemprop="image"' : '')?> id="<?=$photo['ID']?>">
                  </div>
                  <?
                }


Ниже в шаблоне catalog.element происходит вывод дополнительных фото:
foreach ($offer['MORE_PHOTO'] as $keyPhoto => $photo)
                  {
                    ?><!--Доп фото-->
                    <!--Добавление класса active-->
                    <script>
                      $(function(){
                        $(".product-item-detail-slider-controls-image").click(function(){
                        $(".product-item-detail-slider-controls-image").removeClass("active");
                        $(this).addClass("active");
                      });});
                    </script>
                    <!--Добавление класса active конец-->
                    <!--Доп фото конец-->
                    <div class="product-item-detail-slider-controls-image<?=($keyPhoto == 0 ? ' active' : '')?>"
                      data-entity="slider-control" data-value="<?=$offer['ID'].'_'.$photo['ID']?>" data-id="<?=$photo['ID']?>">
                      <img src="<?=$photo['SRC']?>">
                    </div>
                    <? 
                  }

Если верно понимаю, то необходимо заменить путь изображения главного фото на путь доп фото, но каким образом это сделать, затрудняюсь...

laimas 03.09.2018 09:42

Нельзя JS скрипты помещать в цикл, вы их просто "размножаете".
Да, нужно менять src, но это временно для отображения на клиенте, а для реальной смены нужно изменять этот параметр на сервере.
И почему вывод главного тоже в цикле, их что тоже множество?

_marisha 03.09.2018 10:05

laimas, спасибо что откликнулись.
"Да, нужно менять src, но это временно для отображения на клиенте" - нет случайно примера каким образом это сделать?
"И почему вывод главного тоже в цикле, их что тоже множество?" - не множество. Это стандартный функционал cms.

laimas 03.09.2018 10:14

Цитата:

Сообщение от _marisha
не множество. Это стандартный функционал cms

Ну так почему же вы в цикле его выводите причем с одного и того же массива? Откуда эти данные? Если это из базы, отсортируйте данные запроса так, чтобы главное изображение было в этом массиве первым, то есть если это какой-то признак в таблице, значит сортируйте по этому полю. А затем один цикл, в котором проверяя значение этого поля, выводите код главного фото, иначе это вывод кода остальных фото.

Вывод JS сценария после цикла, причем не обязательно в $(function(){ ... }), достаточно одного обработчика.

Можно и пример написать, но для этого нужно знать структуру данных входного массива, ибо ваших два цикла вывода, это никуда не годится.

_marisha 03.09.2018 11:22

laimas, Ну так почему же вы в цикле его выводите причем с одного и того же массива? - это стандартный функционал cms. Как разработчики cms решили реализовать функционал, так он и есть )

При просмотре кода в главном изображении ссылки на изображение подставляются верные, также есть id элемента.
Пример главного изображения
<div class="product-item-detail-slider-image active" data-entity="image" data-id="527272">
                    <img src="//opt-1208453.ssl.1c-bitrix-cdn.ru/upload/iblock/12d/12df2af2e5c16efc0a77e757f459fd76.jpeg?1535898042160977" alt="&quot;Атлас стрейч одн.&quot;Жара&quot;&quot;" title="&quot;Атлас стрейч одн.&quot;Жара&quot;&quot;" itemprop="image">
                  </div>
- это изображение первого фото
<div class="product-item-detail-slider-image" data-entity="image" data-id="532948">
                    <img src="//opt-1208453.ssl.1c-bitrix-cdn.ru/upload/iblock/f95/f95fabeee85b209c6b04aab38098adeb.jpeg?1535954017383055" alt="&quot;Атлас стрейч одн.&quot;Жара&quot;&quot;" title="&quot;Атлас стрейч одн.&quot;Жара&quot;&quot;">
                  </div>
- это изображение второго фото (в миниатюре белое)
<div class="product-item-detail-slider-image" data-entity="image" data-id="532949">
                    <img src="//opt-1208453.ssl.1c-bitrix-cdn.ru/upload/iblock/b9c/b9ce63003808a31d76c42ce226d42ffd.jpeg?1535954017327525" alt="&quot;Атлас стрейч одн.&quot;Жара&quot;&quot;" title="&quot;Атлас стрейч одн.&quot;Жара&quot;&quot;">
                  </div>
- это изображение 3 (в миниатюре зеленое)

Если просмотреть код миниатюры:
1)
<div class="product-item-detail-slider-controls-image active" data-entity="slider-control" data-value="18798_527272" data-id="527272">
                      <img src="//opt-1208453.ssl.1c-bitrix-cdn.ru/upload/iblock/12d/12df2af2e5c16efc0a77e757f459fd76.jpeg?1535898042160977">
                    </div>

2)
<div class="product-item-detail-slider-controls-image" data-entity="slider-control" data-value="18798_532948" data-id="532948">
                      <img src="//opt-1208453.ssl.1c-bitrix-cdn.ru/upload/iblock/f95/f95fabeee85b209c6b04aab38098adeb.jpeg?1535954017383055">
                    </div>

3)
<div class="product-item-detail-slider-controls-image" data-entity="slider-control" data-value="18798_532949" data-id="532949">
                      <img src="//opt-1208453.ssl.1c-bitrix-cdn.ru/upload/iblock/b9c/b9ce63003808a31d76c42ce226d42ffd.jpeg?1535954017327525">
                    </div>

Первой полной картинке изначально добавляется класс active. Эксперимент: если вручную убрать класс active (product-item-detail-slider-image active) у первого главного изображения и добавить класс active второму главному изображению, то картинка главная меняется.

Вопрос: возможно ли сделать так, чтобы класс active добавлялся главному изображению при нажатии на соответствующую миниатюру? Может как-то возможно сопоставить по data-id?

laimas 03.09.2018 11:27

Какой-то кошмар, ей богу. Ладно, пусть там кто-то написал эту муть, и сменить изображение/стиль, это не проблема. Но ведь это здесь меняется, а надо определить его для вывода на страницах, значит на сервер нужно передать некий параметр, который определяет изображение по умолчанию. Чем это определяется и передается ли уже такое на сервер?

laimas 03.09.2018 11:43

А сам скрипт смены класса, это так:

<script>
var small = $(".product-item-detail-slider-controls-image:not(:first)").click(function(){
    small.removeClass("active"); //у большой картинки класс active всегда
    $(this).addClass("active");
})
</script>


Если при этом изменяется фото, значит какой-то обработчик уже есть.

_marisha 03.09.2018 12:47

"нужно передать некий параметр, который определяет изображение по умолчанию" - по коду не наблюдаю никакого параметра.
Единственно, есть условие, при котором добавляется класс active и на основании данного условия отображается главное фото.
Пример:
Если вместо 0 поставить 2 ($key == 2), то главным изображением будет 3-яя миниатюра, т.е. зеленая.
Если убрать <?=($key == 0 ? ' active' : '')?>, то главное фото не отображается.
foreach ($actualItem['MORE_PHOTO'] as $key => $photo)
                {?>                   
                  <div class="product-item-detail-slider-image<?=($key == 0 ? ' active' : '')?>" data-entity="image" data-id="<?=$photo['ID']?>" id="<?=$photo['ID']?>">
                    <img src="<?=$photo['SRC']?>" alt="<?=$alt?>" title="<?=$title?>"<?=($key == 0 ? ' itemprop="image"' : '')?> id="<?=$photo['ID']?>">
                  </div>
                  <?
                }

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

laimas 03.09.2018 13:05

Насколько можно понять из написанного, нет никакого главного изображения, а это некий слайдер на страницах, так? Тогда и передавать на сервер ничего не надо.

А $key, это просто индексы вложенных массивов массива $actualItem['MORE_PHOTO']. Если вы пишите, что при ручной смене индекса выбранная миниатюра отображается первой (большое фото), значит уже имеется или JS сценарий этого, или это решается средствами CSS.

Боксу большого изображения также назначается класс active, значит зачем же постоянно назначать, пусть будет всегда, а выбранной миниатюре назначаем как я показал. И этот скрипт должен выводиться один раз, после второго цикла.

_marisha 03.09.2018 13:09

laimas,"Если при этом изменяется фото, значит какой-то обработчик уже есть" - фото не меняется.

laimas 03.09.2018 13:13

А как же это?

Цитата:

Сообщение от _marisha
Эксперимент: если вручную убрать класс active (product-item-detail-slider-image active) у первого главного изображения и добавить класс active второму главному изображению, то картинка главная меняется.

Только вы путаетесь с главными, коих у вас видимо точно нет. Что значит первый, второй и т.д. "главный", это вы только о миниатюрах или первое "главное", это большое фото?

Dilettante_Pro 03.09.2018 13:38

Попытка вангования
<style>
.product-item-detail-slider-image {
     display:none;
     width:300px;
     height:100px;
     overflow:hidden;
}
.product-item-detail-slider-controls-image {
     display:inline-block;
     width:30px;
     height:30px;
     overflow:hidden;
}
.active {
     display:inline-block;
     border:2px solid green;
}
</style>
<div>
<div class="product-item-detail-slider-image active" data-entity="image" data-id="527272">
                    <img src="//opt-1208453.ssl.1c-bitrix-cdn.ru/upload/iblock/12d/12df2af2e5c16efc0a77e757f459fd76.jpeg?1535898042160977" alt="&quot;Атлас стрейч одн.&quot;Жара&quot;&quot;" title="&quot;Атлас стрейч одн.&quot;Жара&quot;&quot;" itemprop="image">
                  </div>

<div class="product-item-detail-slider-image" data-entity="image" data-id="532948">
                    <img src="//opt-1208453.ssl.1c-bitrix-cdn.ru/upload/iblock/f95/f95fabeee85b209c6b04aab38098adeb.jpeg?1535954017383055" alt="&quot;Атлас стрейч одн.&quot;Жара&quot;&quot;" title="&quot;Атлас стрейч одн.&quot;Жара&quot;&quot;">
                  </div>
<div class="product-item-detail-slider-image" data-entity="image" data-id="532949">
                    <img src="//opt-1208453.ssl.1c-bitrix-cdn.ru/upload/iblock/b9c/b9ce63003808a31d76c42ce226d42ffd.jpeg?1535954017327525" alt="&quot;Атлас стрейч одн.&quot;Жара&quot;&quot;" title="&quot;Атлас стрейч одн.&quot;Жара&quot;&quot;">
                  </div>
</div>
<div>
<div class="product-item-detail-slider-controls-image active" data-entity="slider-control" data-value="18798_527272" data-id="527272">
                      <img src="//opt-1208453.ssl.1c-bitrix-cdn.ru/upload/iblock/12d/12df2af2e5c16efc0a77e757f459fd76.jpeg?1535898042160977">
                    </div>

<div class="product-item-detail-slider-controls-image" data-entity="slider-control" data-value="18798_532948" data-id="532948">
                      <img src="//opt-1208453.ssl.1c-bitrix-cdn.ru/upload/iblock/f95/f95fabeee85b209c6b04aab38098adeb.jpeg?1535954017383055">
                    </div>

<div class="product-item-detail-slider-controls-image" data-entity="slider-control" data-value="18798_532949" data-id="532949">
                      <img src="//opt-1208453.ssl.1c-bitrix-cdn.ru/upload/iblock/b9c/b9ce63003808a31d76c42ce226d42ffd.jpeg?1535954017327525">
                    </div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
var big = $(".product-item-detail-slider-image");
var small = $(".product-item-detail-slider-controls-image").click(function(){
    small.removeClass("active"); 
    $(this).addClass("active");
    big.removeClass("active");
    $(".product-item-detail-slider-image[data-id=" + $(this).data('id') +"]").addClass("active");
     
})
</script>

_marisha 03.09.2018 13:47

laimas, "первое "главное", это большое фото" - главное это большое фото (которое в рамке :) Например: скрин 2 - главное фото розовое, скрин 4 - главное фото белое)
При просмотре кода есть ссылка на большое фото, которое становится главным (т.е. в рамку) если есть класс active
Скрин 2 - ссылка на большое фото, а также класс active
Скрин 3 - ссылка на большое фото, а класса active нет
Скрин 4 - у розового фото убираем класс active и добавляем класс active белому большому фото. После чего фото становится главным, т.е. в рамке.

_marisha 03.09.2018 13:48

Вложений: 3
Скрины во вложении

laimas 03.09.2018 14:13

_marisha, нет у вас никаких главных фото, от этого термина кроме путаницы ничего. Главное или фото по умолчанию, это параметр, который определяет фото по умолчанию при выводе списка товаров (не в карточке товара).

У вас же обычный слайдер и щелчком по миниатюре она отображается увеличенной. И судя по тому что вы писали ранее, а также по классам элементов на представленных фото, код и CSS слайдера у вас уже есть. Если сейчас вам писать примеры и вы их реализуете, то возможны путаница или конфликты. Поэтому нужно просто проанализировать имеющееся и выполнить код согласно описанию вашего слайдера.

Я так думаю.


Часовой пояс GMT +3, время: 09:41.