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

[Решено] Вывод аналогичных по параметру товаров


VladSiy

Recommended Posts

Даже не знаю, с чего начать, и как попонятнее объяснить :)

У меня есть форма заказа товара, куда клиент может вписать нужные ему параметры. Один из параметров - размеры. Каждому товару присвоен размер, который заполняется в админке: А - B - C. Так вот, вопрос: как можно сделать, чтобы, когда клиент, заполняя форму, вписывает нужные ему размеры, вывести ему на страницу ссылки на товары с аналогичными размерами, но допустимым отклонением сторон (А и B на 1-2 мм в большую или меньшую стороны, пример на рис.
 

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

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

Скажите, пожалуйста, сильно ли все это сложно и трудо-/ время-затратно? Правильно ли я представляю решение этой задачи? На самом деле все сложнее или есть решения проще? И, все-таки задам, на всякий случай, этот вопрос: нет ли готового решения (модуля) :) 

 

post-678807-0-81948700-1447600768_thumb.jpg

Змінено користувачем VladSiy
Надіслати
Поділитися на інших сайтах


Когда на сайт добавляется товар, во вкладке "Данные" есть возможность добавить "Размеры (длина x ширина x высота):" Если нужного, для клиента, товара нет на сайте, у меня есть страница с товаром, с опциями, где клиент может сделать заказ с интересующими его размерами. А когда клиент введет свои размеры, мне рядом с формой нужно вывести похожие по размерам товары, с погрешностью +-2 мм. Похожие по размерам товары выбираются из поля "Размеры (длина x ширина x высота):" , которые заполняются при добавлении товара. Их нужно вывести в карточке товара.

post-678807-0-82623400-1447793815_thumb.jpg

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


понятно.

Правильно ли я представляю решение этой задачи?

правильно.

Скажите, пожалуйста, сильно ли все это сложно и трудо-/ время-затратно?

нет.

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

  • 2 weeks later...

Могли бы подсказать, как добавить значение из input в сессию... без GET и POST, по событию (клик и т.д.), чтобы использовать эту сессию в model-е при select-e из БД. Вот input:

var size_a = $('input[name=\'option[242]\']').val();

А также, как можно вызвать метод из контроллера в tpl файле? 

Змінено користувачем VladSiy
Надіслати
Поділитися на інших сайтах


...как добавить значение из input в сессию... без GET и POST, по событию (клик и т.д.), чтобы использовать эту сессию в model-е при select-e из БД...

эээ...

как можно вызвать метод из контроллера в tpl файле?

jquery.ajax, jquery.load, итпд

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

VladSiy, смотрите в этой теме

Спасибо, эта тема будет шагом №2, и надеюсь она мне поможет, но сейчас я не могу понять, как добавить value из input в сессию, для меня проблема в том, что не будет отправки формы (GET, POST), нужно на ходу подхватить значения и занести их в сессию, например по событию keyup. А потом эту сессию использовать при select в модели. Т.е. если клиент в input ввел цифру, в моделе должно сработать ...

... WHERE (length BETWEEN '".($len-2)."' AND '".($len+2)."' ) ...

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

Сейчас почти работает, но я вручную добавил значения:

$len = 260;

$wid = 318; 

а нужно, чтобы в этих переменных находились значения из сессий.

Пробую вот так...

<?php $_SESSION['len'] ?> = $('input[name=\'option[242]\']').val();

в интернете, кажется используют такой вариант, но у меня не получается.

 

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


- используй Силу, Люк! (с)  :-) 

 

читайте по ссылке, пример в 12 посте

 

и зачем вам непременно хочется использовать сессию?

недостаточно просто передавать данные по цепочке из шаблона в контроллер, из контроллера в модель и обратно?

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

Нет, мне не важно что именно использовать :)

Уточните, пожалуйста, без отправки формы методом POST или GET и без сессий возможно перенести данные в контроллер? Мне почему-то, из-за этого $this->request->post['name'] стало казаться, что не возможно.

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


почему нет?

через jquery в связке с ajax можно выдернуть данные на странице (например из обычного поля ввода), передать их в контроллер, контроллер обрабатывает, передает в модель, модель формирует данные для ответа, возвращает их обратно в контроллер, в контроллере ответ модели обработать и через json вернуть обратно, чтобы уже на странице вывести, через тот же jquery

 

согласен, по-началу - голова кругом :ugeek:

но когда разберетесь будет значительно проще, самый лучший способ изучить - на примере страниц движка

 

как относительно простой вариант, попробуйте разобраться с генерацией номера счета при просмотре заказа в админке

(в файле admin\view\template\sale\order_info.tpl ищите по invoice-generate и дальше по цепочке) ;)

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

Еще не решено :)
Прошу, помогите. Я, конечно, очень рад, что уже неделю вожусь над этим, многому научился, но сейчас меня поджимает время :)
 
tpl

$('input[name=\'option[242]\']').bind('keyup', function() {
	$.ajax({
		type: 'POST',
		url: 'index.php?route=product/product/index',
		data: 'size_a=' + encodeURIComponent($('input[name=\'option[242]\']').val()),
		success: function(data){
			$('.productAnalog').load('.productAnalog');
		    }
        });
});

controller:

...
$this->request->post['size_a']; // я так понимаю здесь должны быть данные из value, но, почему-то не работает. Или в контроллер не попадают или отсюда в модель не доходят.

$results = $this->model_catalog_product->getProductAnalog($this->request->get['product_id'],$this->request->post);
...
$this->request->post['size_a'] = 258; // если вручную вводить - работает...

model

public function getProductAnalog($product_id, $data) {

$query = $this->db->query("SELECT DISTINCT *, pd.name AS name FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) WHERE (length BETWEEN '".($data['size_a']-2)."' AND '".($data['size_a']+2)."' ) AND (...)");

...

}

 
А может быть я в самом tpl неправильно success: оформил? в Блоке .productAnalog у меня выводятся подходящие размеры, если ввожу их вручную в контроллере, а мне бы хотелось, чтобы по нажатии каждой цифры в поле, шла выборка из этих цифр и отображалась в .productAnalog. Я подумал, что по каждому следующему вводу цифры будут обновляться размеры в блоке, а для этого нужно обновить сам блок  .productAnalog...

Змінено користувачем VladSiy
Надіслати
Поділитися на інших сайтах


Вот теперь вопрос можно считать решенным :)

 

Надо же, понадобился месяц, чтобы решить такую пустяковую задачу, вот чем обошелся

 

tpl

$.post(
				  "index.php?route=product/product/analogFilters",
				  {
					size_a: size_a,
					size_b: size_b
				  },
				  onAjaxSuccess
				);
				 
				function onAjaxSuccess(data)
				{
					///////
				}
Надіслати
Поділитися на інших сайтах


controller

    public function analogFilters() {
        
        if (isset($this->request->post['size_a']) && isset($this->request->post['size_b'])) {
            $_SESSION['size_a'] = $_POST['size_a'];
            $_SESSION['size_b'] = $_POST['size_b'];
        }
        
    } 

model

... WHERE (length BETWEEN '".($_SESSION['size_a']-2)."' ...

 И смешно и обидно :)

Змінено користувачем VladSiy
Надіслати
Поділитися на інших сайтах


воу-воу

$_POST
$_SESSION
нельзя так.

у тебя тут же выше пример правильного обращения к POST-данным

$this->request->post
хочешь с сессией работать

$this->session->data
но тебе она не нужна.

пришел POST - передавай его в модель (либо "как есть"; либо через промежуточную переменную-массив, типа "$filter_size").

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

  • 3 weeks later...

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

Например, я совершаю заказ с параметрами:

A - 333

B - 222

C - 111

Нажимаю добавить в корзину, и в корзине отображается мой заказ с этими параметрами.
Потом я делаю еще один, точно такой же заказ, он попадает в корзину, а в корзине увеличивается только его кол-во, т.к. параметры идентичные. Если я делаю еще один заказ с параметрами:
A - 444

B...

C... 

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

model/product методом getProductOptions() ... Но, не могу никак разобраться. 

 

Дело в том, что у меня установлена скидка на заказ товара от 2-х штук. - 6% , от 3 шт. - 8%  и т.д. Но, нужно, чтобы скидка распространялась только на заказ с определенными параметрами, т.е. в приведенному выше примере у меня в корзине находится 3 товара (2 товара с идентичными параметрами и 1 с другими параметрами) в итоге скидка начисляется, как за 3 товара, а должно быть за 2 товара, а 3-й должен считаться по полной сумме, потому что заказан в единичном кол-ве

 

Я не понимаю до конца, как это можно сделать, но предположил, что можно как-то сделать проверку на идентичность параметров. если товаров с одинаковыми параметрами меньше 2-х шт, то скидку не подключать...

Могли бы что-нибудь посоветовать/подсказать?

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


значит, пилить скидку - помимо количества товаров учитывать еще и опции

смотрите как сделано в движке на примере корзины при оформлении в catalog\controller\checkout\cart.php и system\library\cart.php

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

значит, пилить скидку - помимо количества товаров учитывать еще и опции

смотрите как сделано в движке на примере корзины при оформлении в catalog\controller\checkout\cart.php и system\library\cart.php

Спасибо, перед тем, как написать на форуме, я как раз и разбирался в тех файлах, которые вы привели, разобраться, похоже, не смог. Вы не могли бы уточнить, в каком файле нужно вносить изменения для скидок? Еще опции нужно учитывать в контроллере или в моделе при selecte? где-то здесь...

$product_discount_query = $this->db->query("SELECT price FROM " . DB_PREFIX . "product_discount WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id . "' AND quantity <= '" . (int)$discount_quantity . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY quantity DESC, priority ASC, price ASC LIMIT 1");

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

Змінено користувачем VladSiy
Надіслати
Поділитися на інших сайтах


Ой, устал. Немного конкретнее попрошу помощи, не уверен точно, но, кажется пилить нужно здесь :) 

 

system\library\cart.php

где-то в районе 180 строки есть запрос

$product_discount_query = $this->db->query("SELECT price FROM " . DB_PREFIX . "product_discount WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id .	"'
 AND quantity <= '" . (int)$discount_quantity . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY quantity DESC, priority ASC, price ASC LIMIT 1");

а ниже условие

if ($product_discount_query->num_rows) {
 $price = $product_discount_query->row['price'];
}

Кажется, если по sql запросу все устраивает, то он присваивает скидку. 

 

значит, с помощью подсказки, я решил, что можно в sql запрос, добавить еще и проверку на опции, в итоге я сделал вот так

$product_discount_query = $this->db->query("SELECT price FROM "
. DB_PREFIX . "product_discount LEFT JOIN " 
. DB_PREFIX . "product_option_value pov LEFT JOIN "
. DB_PREFIX . "option_value ov ON (pov.option_value_id = ov.option_value_id)  WHERE product_id = '" . (int)$product_id . "'
 AND pov.product_option_value_id = '" . (int)$option_value . "'
 AND pov.product_option_id = '" . (int)$product_option_id . "'
 AND quantity <= '" . (int)$discount_quantity . "'
 AND ((date_start = '0000-00-00' OR date_start < NOW())
 AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY quantity DESC, priority ASC, price ASC LIMIT 1");

... но, получаю ошибку:

 

Notice: Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE product_id = '2419' AND pov.product_option_value_id = '27' AND p' at line 1
Error No: 1064

....

 

Подскажите, пожалуйста, как правильно нужно написать запрос?

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


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

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

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

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

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

Вхід

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

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

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

×
×
  • Створити...

Important Information

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