Перейти к содержанию
VladSiy

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

Рекомендуемые сообщения

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

У меня есть форма заказа товара, куда клиент может вписать нужные ему параметры. Один из параметров - размеры. Каждому товару присвоен размер, который заполняется в админке: А - 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

понятно.

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

правильно.

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

нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Могли бы подсказать, как добавить значение из 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, смотрите в этой теме

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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").

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.