Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Связанные опции.


7up

Recommended Posts

А реализовывал ли кто, такую штуку, когда опции товара связаны/зависящие друг от друга?

т.е. при смене одной опции в других некоторые пункты могут меняться.

Например есть товар красный синий и зеленый с объемом памяти 4 и 8 гб, но зеленого только 4гб. Что бы при выборе цвета зеленый один из ваиантов опции "объем памяти" менялся.

Ну а данные о наличии уже синхронизировать с 1с например - это уже вторая история... это пытаюсь реализовать через модуль импорта/экспорта.

  • +1 1
Надіслати
Поділитися на інших сайтах


любые изменения кода несут за собой последствия. и очень часто не хорошие.

я не видел пока ни одного работающего на OCstore магазина по описанному Вами принципу. Мой магазин работает с одним свойством, код менялся. Цвета товара делю просто на разные товары.

Надіслати
Поділитися на інших сайтах


я не видел пока ни одного работающего на OCstore магазина по описанному Вами принципу. Мой магазин работает с одним свойством, код менялся. Цвета товара делю просто на разные товары.

А это одно свойство у вас динамическое? т.е. зависит от остатков товара? Подгружаете его с 1с?
Надіслати
Поділитися на інших сайтах


  • 5 months later...

ок. попытаюсь объяснить своим языком, если будут вопросы прокомментирую....

Реализовал загрузку данных в магазин из 1с, посему админкой не пользуюсь, т.е. решение не представляет собой модуль :(

В админке опции храняться как ( или правильнее сказать в базе хранятся, а в админке видны):

Наименование опции | значение

Цвет:размер | Синий: 10, 20, 30

Цвет:размер | Красный: 20, 30, 40

Цвет:размер | Зеленый: 50, 60, 70

Использовал поле radio, т.е. если в значении type будет стоять другие типы опций, как например select, то они будут отрабатываться как обычно. Можно было использовать например тип текст и хранить все значения в одном поле, но в таком случае не будет работать изменение цены в зависимости от выбора опции.

Двоеточие использую как разделитель. В названии до разделителя наименование первого списка(или radio как в моем случае), наименование второго списка(меняющегося в зависимости от первого) после разделителя.

В значениях опций до разделителя наименования для первого списка, а после разделителя через другой разделитель (запятую) значения который будут в втором списке.

в product.tpl разделаю все эти параметры и используя Jquery строю связь двух списков.

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

Выглядит примерно так:

Изображение

Куски кодов выкладывать?

P.S.

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

Надіслати
Поділитися на інших сайтах


product.tpl - часть кода отвечающая за смену опций:

Переменная $o отвечает за присутствие в товаре связной опции, при нажатии купить, если она равна 1, то в корзину добавляются значения с скрытого поля, если равна 0, то все как обычно...

<?php if ($option['type'] == 'radio') { $o=1;?>

<div id="option-<?php echo $option['product_option_id']; ?>" class="option">

<table border="0" cellpadding="5" cellspacing="1" bgcolor="#cccccc">

<tr>

<td nowrap bgcolor="#FDFFEA">

<?php if ($option['required']) { ?>

<span class="required">*</span>

<?php } ?>

<b><?php list($name1, $name2) = explode(":", $option['name']); echo $name1; ?>:</b><br />

<script>

function izm(ch){

<?php

foreach ($option['option_value'] as $option_value) {

list($nmm, $sz) = explode(":", $option_value['name']);

echo "if(ch==".$option_value['product_option_value_id']."){ document.calc.master200.options.length=0;";

$szz = explode(",", $sz);

$ii="0";

foreach ($szz as $szzz) {

echo 'document.calc.master200.options['.$ii.']=new Option("'.$szzz.'", ", '.$name2.': '.$szzz.'", true, true);';

$ii++;

}

echo '}';

}?>

}

</script>

<style type="text/css">

p:hover {

background-color: #BBFFBB;

margin: 0;

padding: 0;

}

p:selected {

background-color: #BBFFBB;

margin: 0;

padding: 0;

}

p {

margin: 0;

padding: 0;

}

</style>

<form name="calc">

<?php foreach ($option['option_value'] as $option_value) { ?>

<?php list($n, $s) = explode(":", $option_value['name']); ?>

<p><input type="radio" id="<?php echo $option_value['product_option_value_id']; ?>" name="<?php echo $name1; ?>" value="<?php echo $option_value['product_option_value_id']; ?>" onclick="izm(this.value), document.getElementById('val2').value='<?php echo $option_value['product_option_value_id'],"|"; echo $name1; echo ": "; echo $n; ?>';"><label for="<?php echo $option_value['product_option_value_id']; ?>"><?php echo $n; ?>

<?php if ($option_value['price']) { ?>

(<?php echo $option_value['price_prefix']; ?><?php echo $option_value['price']; ?>)

<?php } ?>

</label></p>

<?php } ?>

</td>

<td align="center" valign="top" bgcolor="#FDFFEA">

<span class="required">*</span>

<b><?php echo $name2,":"; ?></b><br />

<select name="<?php echo $name2; ?>" id="master200" size="1">

<option value="">---</option>

</select>

<input name="val2" id="val2" type="hidden" value="">

<input name="option[<?php echo $option['product_option_id']; ?>]" id="val" type="hidden" value="">

</td>

</form>

</tr>

</table>

</div>

<br />

<?php } ?>

В чистовик никак не переделаю, поэтому в этом варианте некоторые переменные названы как попало :) прошу прощения, программисты эстеты меня бы побили :)

....стили вставлены сюда же, для наглядности....

  • +1 1
Надіслати
Поділитися на інших сайтах


Теперь вот сижу, ломаю голову, как бы сделать три связные опции :) например "Тип, Цвет, Размер". Цвет зависит от Типа, а размер соответственно от Цвета.

Надіслати
Поділитися на інших сайтах


Изучив еще немного jquery понял что все это можно было сделать только на нем :(

Получилось сделать даже три связные опции, причем одна из которых например "Цвет" в виде картинок :)

Изображение

Добавил еще эффекты, теперь квадратики с цветами красиво выезжают после выбора фасона и при клике по ним мигают )))))

  • +1 2
Надіслати
Поділитися на інших сайтах


7up, друг спасибо тебе за то что поделился наработками мне нужно как говорится "еще на вчера", но как говорят: "сказал А говори и Б")) шучу конечно, как говорится: "в каждой шутке... Если честно, поделись пожалуйста jquery решением можно без мигающих даже цветов, чтоб просто цвет размер и остаток на складе был связан ооочень надаа, друг спасибо
Надіслати
Поділитися на інших сайтах


7up, друг спасибо тебе за то что поделился наработками мне нужно как говорится "еще на вчера", но как говорят: "сказал А говори и Б")) шучу конечно, как говорится: "в каждой шутке... Если честно, поделись пожалуйста jquery решением можно без мигающих даже цветов, чтоб просто цвет размер и остаток на складе был связан ооочень надаа, друг спасибо

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

<?php if ($option['type'] == 'radio') { $o=1;?>

<div id="option-<?php echo $option['product_option_id']; ?>" class="option">

<table border="0" cellpadding="7" cellspacing="1">

<tr valign="top">

<td nowrap bgcolor="#FDFFEA">

<?php if ($option['required']) { ?>

<span class="required">*</span>

<?php } ?>

<b><?php list($name1, $name2, $name3) = explode(":", $option['name']); echo $name1,", ", $name2,", ", $name3; ?>:</b><br />

<style type="text/css">

p:hover {background-color: #CCCCCC;margin: 0; padding: 0;}

p:selected { background-color: #BBFFBB; margin: 0; padding: 0; }

p { margin: 0; padding: 0; }

</style>

<form name="calc">

<?php foreach ($option['option_value'] as $option_value) { ?>

<?php list($n, $s) = explode(":", $option_value['name']); ?>

<p><input type="radio" id="<?php echo $option_value['product_option_value_id']; ?>" name="<?php echo $name1; ?>" value="<?php echo $option_value['product_option_value_id']; ?>" onclick="colors(this.value), document.getElementById('val2').value='<?php echo $option_value['product_option_value_id'],"|"; echo $n; ?>';"><label for="<?php echo $option_value['product_option_value_id']; ?>"><?php echo $n; ?>

<?php if ($option_value['price']) { ?>

(<?php echo $option_value['price_prefix']; ?><?php echo $option_value['price']; ?>)

<?php } ?>

</label></p>

<?php } ?>

</td>

<td align="left" valign="top" width="150" bgcolor="#FDFFEA">

<div id="colors" class="sell"></div>

<select class="sel" id="sel" name="sel"></select>

</td>

</form>

</tr>

</table> </div> <br />

<input name="val2" id="val2" type="hidden" value="">

<input name="val3" id="val3" type="hidden" value="">

<input class="val" name="option[<?php echo $option['product_option_id']; ?>]" type="hidden" id="val" value="">

<script type="text/javascript" src="malsup.github.com/jquery.form.js"></script>

<script>

function colors(what) {

$("#sel").empty();

<?php foreach ($option['option_value'] as $option_value) {

list($nmm, $sz) = explode(":", $option_value['name']);

$vls = explode ("|", $sz); ?>

if (what==<?php echo $option_value['product_option_value_id']; ?>) {

$("#colors").html('<?php foreach ($vls as $vlss) { list($clrs, $szs)=explode("-", $vlss); echo "<img border="1" class="col" id="",$clrs,"" onclick="sizes('",$szs,"'), addcolor('",$clrs,"')" src="",$clrs,".png">"; } ?>')

$("#sizes").html(" ")

$("#colors").show("slide", {direction: "up"}, 700);

$('#val').val('');

}

<?php } ?>

};

function addcolor(what3) {

$("#"+what3).effect("pulsate", { times: 1 }, 700);

document.getElementById('val3').value = document.getElementById('val2').value+" "+what3;

}

function sizes(what2) {

$("#sel").empty();

$("#sel").effect("pulsate", { times: 1 }, 700);

rr = what2.split(",");

for(var i = 0; i < rr.length; i++) $("#sel").append( $('<option value="'+rr+'">'+rr+'</option>'));

}

</script>

<style>

.col { border-color: #5D5D5D; margin: 3px; position: relative; }

.sel { display: none; margin: 0px; width: 50px; position: relative; }

.sell { display: none; margin: 0px; position: relative; }

</style>

<?php } ?>

Остатки опций связанные например с цветами и размерами опенкарт не учитывает, 1с выгружает только те опции, которые есть в остатке. В опенкарте если включить "списывать со склада" то списываться будет только первый(верхний) уровень опции. Ели нужно списывать все варианты, нужно немного переделать код....

Надіслати
Поділитися на інших сайтах


Я 1с импортом не пользуюсь, делаю свой и у меня нужно остатки цвето-размеров учитывать совсем не соображу да и с jquery совсем еще не знаком а делать надо быстро чтото, может друг дугу поможем (если тебе нужен импорт прайса например с остатками и чем тока хошь)...... надо наверное поспать...

Надіслати
Поділитися на інших сайтах


Столкнулся с похожей проблемой.

Есть у меня товар. К примеру – пиджак. Этот пиджак бывает размеров: 46, 48, 50, 52, 54. Также, этот пиджак бывает следующих цветов: черный, коричневый, синий.

Я создаю группы опций:

  • Размер: 46, 48, 50, 52, 54
  • Цвет: черный, коричневый, синий

Иными словами у меня в принципе может быть 15 вариантов пиджаков – по три цвета каждого размера. НО! На складе у меня есть:

- 46 размера - черный, коричневый, синий (итого – 3 шт.)

- 48 размера - черный, коричневый (итого – 2 шт.)

- 50 размера – черный (итого – 1 шт.)

- 52 размера – синий (итого – 1 шт.)

- 54 размера – коричневый (итого – 1 шт.)

Итого:

- вообще синих пиджаков – 2 шт. (46 и 52)

- вообще черных пиджаков – 3 шт. (46, 48, 50)

- вообще коричневых пиджаков – 2 шт. (46 и 48)

В каждой опции ввожу соответственное количество каждого цвета и размера. В товаре у меня становятся доступными два выпадающих списка: размер и цвет пиджака. НО! Из-за того, что оба выпадающих списка доступны, покупатель может «сконструировать» такой пиджак, которого у меня на складе – НЕТ! Например, он выберет – размер 54, а цвет – синий! А у меня то такого на складе нет!

Опции размер и цвет – СВЯЗАНЫ! Если я выбираю 54 размер, то у меня в списке ЦВЕТ должен оставаться только один цвет – коричневый. Но на практике есть возможность выбрать все цвета. Вообще в OpenCart как-то получается, что опции какие-то независимые друг от друга, сами по себе. Выходит, что товар конкретного размера и конкретного цвета – не может иметь уникального артикула. Не заводить же как отдельный товар пиджак размера 46 и придавать ему опцию цвета. Потом заводить такой же пиджак, но уже другого размера и т.п. Это как-то неправильно….

Других решений нету? Потому как ваш способ - тоже полумера какая то. Если товаров много, или разного цвета (у меня в магазине одежды - 38 цветов и 5 размеров) - будет расти количество опций под каждый товар. Меняется наличие на складе - нужно редактировать значение.

Надіслати
Поділитися на інших сайтах


да я тоже все еще в раздумиях, но мысли такие приходят... Делаем еще одну колонку в таблице бд чтоб в размерах указать цвет данных размеров, тоесть у нас получается опция цветоразмер. Далее создаем две опции. Первая цвета они просто служат для выбора там можно ни остатки не учитывать ничего, а вот вторая опция размеры и тут уже в бд записывается размер-цвет и когда мы выбираем цвет в магазине (опция размер-цвета еще не доступна) делается запрос к бд (аяксом) и выводится только те размеры которым соответствует выбранный цвет и опция цветоразмера становится доступной и кол-во списывается именно с нее. Но незнаю ни аякс не яву не jquery и пока что это для меня сдерживающий фактор, но делать надо кто хочет может присоединятся

Надіслати
Поділитися на інших сайтах


да, в магазе все эти аттрибуты (Количество, Вычитать со склада, Цена, Баллы, Вес) можно присвоить только конкретной опции.

вот что пришло в голову: создать сущность Группа опций товара, у которой и будут эти аттрибуты. опции конкретного товара буду добавляться не товару, а этой группе.

например товар: пиждак

группа: синий_48 (кол-во 10, вычитать "да", цена 500, баллы 0, вес 0.5)

опции: цвет синий, размер 48.

Надіслати
Поділитися на інших сайтах

тоже интересный вариант тоже думал о нем (опции сделать как атрибуты), но программинг пока не самая моя сильная сторона (никак не перейду к полноценному ООП) поэтому хочется обойтись без глобальных решений а так временный костылек, но если кто будет браться готов всячески содействовать чем смогу как говорится а также поделюсь собственными модулями и наработками при удачном исходе дела

Надіслати
Поділитися на інших сайтах


У меня происходит выбор каждой опции только после выбора предыдущей, а до выбора этой опции последующие скрыты, т.е. выбор происходит лесенкой, по этапно..... (это я к посту о пиджаках)

Надіслати
Поділитися на інших сайтах


  • 1 month later...

Не получилось реализовать. Секцию с radio закомментировал в product.tpl, вставил код с предыдущей страницы, больше страницы не грузились. Вообще это достаточно логичная функция, может есть готовый модуль?

Надіслати
Поділитися на інших сайтах


Да красивее думаю было бы сразу в админке иметь возможность назначать несколько значений одной опции или как то связывать их по типу атрибутов (тоесть группу) с указанием как бы главной опции но к сожалению мои познания в ООП довольно скудны чтоб реализовать это на нормальном уровне готов закинуть 400-600 рубасов если кто возьмется сделать

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.