Добрый день, подскажите как реализовать такую задачу: При выборе цвета в карточке товара, необходимо сменять изображения на другие(выбранный цвет), а так же сменять дополнительные параметры(характеристики, текст) у продукта, которые могут отсутсвовать у продукта с другим цветом. С бд приходит многомерный ассоц. массив в основном массиве имеется 2 и более вложенных массивов, в каждом из них указан цвет, свои изображения и другие параметры. При выборе цвета соответсвенно один массив должен отображаться, остальные нет. Сделал на страницы списка товаров смену изображения при выборе цвета, а вот как с остальным контентом быть, как его сменять, незнаю. В js не силен. Заметил на алиэкспресе такую реализацию, при выборе цвета стекол, происходит замена изображений, пример: https://ru.aliexpress.com/item/Half.../1777368669.html?spm=a2g0s.9042311.0.0.eF7jMa
Ты логику работы понимаешь? напиши при изменение select или где у тебя цвет выводится отправлять ajax запрос на файл который будет тебе отдавать путь на новую картинку и потом заменяй старый путь на новый который получил. Профит
@AlexsaiL ну а чё ты не можешь на событие клика обратится к массиву на js и выбрать от туда нужный чтобы вывести его потом на экран append у jquery и innerHtml у js
Ну так прочитай про JS, в чём проблема? http://learn.javascript.ru/ Без него всё равно никуда. И потом, я тоже не силён, по большому счёту в JS в том смысле, что хотя я знаю практически все его возможности, я не все чувствую, JS весьма специфический язык, от которого мозги порой сворачиваются. Но написать достаточно сложную клиентскую часть сайта способен.
Благодарю, буду пробовать, другого пути нет) --- Добавлено --- Осваиваю потихоньку js, надо бы знать, а то копипастить не очень приятно.
Я имел ввиду что "другого пути нет..." это мне в любом случае надо выполнить такую задачу, как говориться: Умри, но сделай)). а перезагружать всю страницу ради одного изображения это считаю не правильно, у меня грубо говоря приходит 3 массива в массиве, где каждый массив имеет изображения 4 маленькие(превьюхи) и 4 большие, где большое появляется при нажатии на превьюху(скрипт просмотра изображений) + краткое описание, у модели разных цветов может отличатся описание(его тоже менять надо), (вот и думаю либо мне менять несколько элементов на странице, либо просто с помощью ajax менять кусок контента со всем содержимым) поэтому при выборе цвета(по клику) я должен обращатся к тому массиву где есть этот цвет, соответсвенно будет выводится содержимое этого массива в шаблонизаторе, остальные массивы скрыты. Вот как то так...))). Потихоньку буду сейчас двигатся, читать и пистаь скрипт. Мужики, Благодарю за советы!
можешь в кнопочках с цветами добавить атрибут data-img с url картинки и при нажатии на кнопочку брать этот url и вставлять в src картинки. И ajax запросов не надо)
хм..., допустим у меня 3 цвета, черный, красный, белый, есть изображения продукта по 4 фотографии больших и 4 маленьких(превьюх) черного цвета, а также по 4/4 красного, белого цвета, при нажатии на черный, беру url с кнопки, вставляю в url картинки и получается что для 8 изображений одного цвета будет один url пришедший с кнопки? Это же может повлиять на url адрес нужного изображения. Если бы было по одному изображения каждого цвета, то тут бы вродь отрабатывало нормально, может я не правильно понимаю из-за не полного представления сей картины... --- Добавлено --- Я с помощью PHP: $jsonZ = json_encode($rsProduct); присваиваю переменной в php, её передаю в smarty, в скрипте её принимаю и проверяю: Код (Javascript): var obj = ({$jsonZ}); console.log(obj); в коде tpl прокручиваю циклом HTML: {foreach $rsProduct as $item} массив, беру с каждого подмассива значение ключа- COLOR HTML: <a href="" class="colorImgs individOnClick" id="{$item['ID_PRODUCT']}"><span style="background-color: {$item['COLOR']};"></span></a> в id подставляю id подмассива. При клике по цвету беру id в который уже записано значение id с подмассива. Вопрос: Как можно в js проверить и вывести именно тот массив целиком, в котором ключ[id] имеет полученный id c клика, и вернуть этот массив в smarty?
написал такой скрипт Код (Javascript): <script> $(".individOnClick").click(function (event){ event.preventDefault(); var idClick; idClick = $(this).attr('id'); var obj = {$jsonZ}; function find(obj, value) { for (var i in obj) for (var j in obj[i]) if (obj[i][j] == value) return [obj[i], obj[i][j]]; return false; }; console.log(find(obj, idClick)); }); </script> на стороне сервера: PHP: $jsonZ = json_encode($rsProduct); Все отрабатывает, выдает нужный подмассив, осталось тольковернуть данные и вывести на сайт.
подскажите почему не могу передать данные на сервер, пишет ошибку: on line 80 "data: {'data': JSON.stringify(find(obj, idClick))}," - Unexpected ": ", expected one of: "}" <-- thrown in C:\OpenServer\domains... Код прописываю такой: Код (Javascript): $.post({ url: '?category=300&controller=product&id=444', data: {'data': JSON.stringify(find(obj, idClick))}, success: function (data) { console.log('Данные успешно отправлены.'); } }); но в php ничего не приходит...
Убрал, но данные все так же не приходят в php, в консоли выбранные данные отобразились... а дальше не идут
Сначало передаю в js: $jsonZ = json_encode($rsProduct); Вот весь скрипт: Код (Javascript): <script> $(".individOnClick").click(function (event){ event.preventDefault(); var idClick; idClick = $(this).attr('id'); var obj = {$jsonZ}; function find(obj, value) { for (var i in obj) for (var j in obj[i]) if (obj[i][j] == value) return [obj[i], obj[i][j]]; return false; }; $.post({ url: '?category=300&controller=product&id=444', data: {data: JSON.stringify(find(obj, idClick))}, success: function (data) { console.log('Данные успешно отправлены.'); } }); }); </script> на стороне сервера потом проверяю пришла пеерменная или нет: PHP: foreach($_POST as $name => $val) { d( $name . ' = ' . $val . '<br>'); } d($_POST['data']); дебагом проверяю.
@AlexsaiL, на всякий случай попробуйте абсолютный url: Код (Javascript): url: window.location.protocol + "//" + window.location.host + window.location.pathname + '?category=300&controller=product&id=444', или Код (Javascript): url: window.location.origin + window.location.pathname + '?category=300&controller=product&id=444',
... on line 82 "data: {data: massString}," - Unexpected ": ", expected one of: "}" <-- thrown in C:\OpenServer\domains..... это если строку передаю в дата data: Код (Javascript): data: {data: massString} ,
Неожиданный символ: "двоеточие". Как заметил @Maputo, исправлять наверняка надо то, что написано до символа "двоеточие". На всякий случай прочитайте: строки в js Особое внимание обратите на использование символов "кавычки"(") и "апостроф"(') внутри строки, в зависимости от символа, который пишется в качестве обрамляющего строку. А также на термин "экранирование".
Подскажите, вот я выбрал ассоц-й под-массив из массива в JS, как его через ajax правильно передать в data, чтобы этот ассоц массив получить и вывести на страницу? Строкой или объектом? читал что его лучше передавать строкой, так как он удаляет все лишние пробелы, делает его более компактным при передачи, Код (Javascript): JSON.stringify() у меня ассоц. массив переводится в строку и присваивается в переменную: Код (Javascript): var massString = JSON.stringify(mass); а в data записывается как data: massString, Так данные передаются, ошибка не вылетает, но на стороне сервера _POST не приходит, если передавать объект в data: то необходимо прописать фигурные скобки {} в которых указывается ключ и значение через двоеточие ), Код (Javascript): data: {data : mass}, // переменная mass это объект ==>> Код (Javascript): var mass = (find(obj, idClick)); но когда прописываю в ajax: Код (Javascript): data: {data : mass} он ругается на двоеточие или на какие нибудь еще знаки. Подскажите, или поделитесь ссылкой где описывается как правильно передать ассоц. массив и как его получить на стороне сервера.? Премного Благодарен!
Или не то обрабатываете, или все-таки ошибка есть, потому что не обрабатываете json полученную строку (в php: json_decode) --- Добавлено --- Продемонстрируйте весь код вызова $.ajax или $.post
На стороне сервера передаю данные(многомерный-ассоц. массив) в js : PHP: $jsonZ = json_encode($rsProduct); далее в js его ловлю: Код (Javascript): <script type="text/javascript"> $(".individOnClick").click(function (event){ event.preventDefault(); var idClick; idClick = $(this).attr('id'); // тут я по клику элемента присваиваю ему id var obj = {$jsonZ}; // тут получаю ассоц. массив с php, далее ниже я беру подмассив(ассоц) у которого имеется значение равное переменной idClick function find(obj, value) { for (var i in obj) for (var j in obj[i]) if (obj[i][j] == value) return [obj[i], obj[i][j]]; return false; }; var mass = (find(obj, idClick)); var massString = JSON.stringify(mass); // объект перевел в строку $.ajax({ async: true, type: 'POST', url: "ProductController.php?category=300&controller=product&id=444&lang=ru#_tabs-10", data: massString, success: function(data) { console.log('Данные успешно отправлены.'); } }); }); </script> Далее в консоле после клика по выбору цвета отображается то, что выбрали нужный ассоц.подмасив с имеющимся значением. Пишет Данные успешно отправлены. А в php я поймать не могу, даже в POST ничего не приходит. Его надо поймать в php и вернуть на страницу шаблонизатора не перезагружая страницы. Вот как то так код написал.