Перейти к содержимому

MOAB

- - - - -

Определение страницы каталога товара


  • Войдите, чтобы ответить
Сообщений в теме: 15

#1 AdisPrint

AdisPrint

    Почетный

  • Активный участник
  • PipPipPipPipPip
  • 2 711 сообщений
2 056

Отправлено 07 Август 2019 - 13:06

В админке имеется каталог товаров, сортировка по названию. Для удобства каталог разбит на страницы по 20 шт. Если нужно отредактировать товар, описание например, то все просто. Находим товар в каталоге, при этом в адресной строке присутствует номер страниц &page=.
На странице categories.php подключается страница new_product.php, в ней запросом $_GET['page'] выдергиваем номер страницы и после редактирования возвращаемся на ту же страницу каталога.
Но если название товара меняется или создается новый товар, то все гораздо сложнее. Допустим был товар Апельсин на первой странице, мы его открыли и изменили на Яблоко, выдернули номер страницы Апельсина и вернули Яблоко на первую страницу. Но Яблока там нет, оно на последней странице. Т.е. дальше добавленный товар приходится искать, чтобы сопутствующий товар например прицепить, а если товаром много, страниц соответственно тоже и товары похожи, то искать довольно заебисто. Особенно когда много товаров добавляется или меняется.

Пока что мне пришло в голову. На php выдергиваем названия товаров соответствующей категории из базы и стоим массив. Это не сложно.
$category_querycont = "select * from " . TABLE_PRODUCTS_TO_CATEGORIES . " p, " . TABLE_PRODUCTS_DESCRIPTION . " p2c
					   where p.categories_id = '".$_cPath."'					  
					   and p.products_id = p2c.products_id
					   ORDER BY p2c.products_name ASC";				
	 $products_query_cont = vamDBquery($category_querycont);
	 while ($child_categories = vam_db_fetch_array($products_query_cont,true)) {			  
	   $array[] =  $child_categories['products_name'];
}
Далее нужно отследить текст который вводится в input поле products_name. И это на аяксе тоже не сложно.
$("input[name='products_name[1]']").keyup(function() {  
   products_new = $("input[name='products_name[1]']").val();
});

А вот дальше голову сломал. Нужно новое название товара которое мы выдергиваем аяксом добавить в массив который мы создали ранее на php. т.е. впихнуть JS переменную products_new в php массив $array. Отсортировать новый массив по алфавиту. Далее определить порядковый номер нового товара в массиве и зная количество товаров на странице можно рассчитать на какой странице должен будет оказаться новый товар, после его создания.
Т.е. все нужно проделать на странице new_product.php без ее перезагрузки. Т.е. нужно на лету передавать данные из JS в PHP и обратно.

Перепробовал разные варианты, но глухо. Это вообще возможно?
СНПЧ, чернила, картриджи, фотобумага для принтеров и МФУ - AdisPrint.ru

#2 Матумба

Матумба

    во имя матана

  • Участник
  • PipPipPipPipPip
  • 5 126 сообщений
6 461
  • ИзКрии

Отправлено 08 Август 2019 - 01:48

Как-то дофига непонятных действий.
Если проигнорировать два простых решения:
  • выводить 10к товаров + CTRL+F
  • выводить перед большим листингом 5-10 последних изменённых
Остаётся только:
  • создать/обновить товар
  • получить из бд его номер в запросе для листинга с ограничением по знаку, типа count(1) FROM tab WHERE STRCMP(name, str) < 0 - тут знак точно не помнил никогда, можно попробовать поменять, если промахнулся
  • разделить на 20 и кинуть на нужную страницу
Ну и в какой-то момент, насколько понял, к товару приделывается номер страницы где-то внутри. Тогда можно создать/обновить товар (и запомнить id), вызвать эту магию и вытащить товар обратно уже с номером страницы. В общем, в мире бесконечно много глупых решений.

В идеале попутно хорошо бы освоить в SQL оператор REPLACE гораздо более удобный чем INSERT+UPDATE. Если это будет работать медленно, то надо освоить ещё индексы, оптимизацию индексов и проверку плана исполнения запроса через EXPLAIN {sql}

Городить тут какие-то аяксы вообще ни к чему.
"Они не могут ничего, у них лапки котят"

#3 Valek

Valek

    ВСтатусе

  • Активный участник
  • PipPipPipPip
  • 1 413 сообщений
2 029
  • ИзРоссии :(

Отправлено 08 Август 2019 - 04:23

Не понял в чем загвоздка? Получить номер страницы, если массив уже есть, или ридеректнутся без перезагрузки
Отличный хостинг низкие цены, высокое качество и SSL Ссылка на сайт

#4 AdisPrint

AdisPrint

    Почетный

  • Активный участник
  • PipPipPipPipPip
  • 2 711 сообщений
2 056

TC Отправлено 09 Август 2019 - 19:15

Матумба, Главная беда программистов, это когда они не знают, что нужно сделать, они точно знают как это нужно сделать. :)

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

Получить название товара можно вернувшись на страницу каталога, запомнив предварительно его название на странице редактирования, либо через куки, либо создать новое поле в БД.
А дальше да, можно отыскать этот товар и сделать редирект. Но это не совсем правильное решение. Кроме того есть еще кнопка отменить, т.е. зашел, посмотрел и не стал редактировать товар.

Правильнее все же на странице new_product.php стразу предварительно определить позицию товара, чтобы вернуться на categories.php уже на нужную страницу.
Есть мысли писать в куки, в третьем файле куки читать, делать вычисления и писать куки. Только блин проблема на ровном месте setcookie почему-то перестала писать куки.
Для эксперимента создал php страницу с единственным кодом setcookie ('test', 'test'); Захожу на нее и теоретически я же должен видеть новую куку, но нет ее. Или я что-то не понимаю. Вроде я раньше в ряде файлов так делал и куки писались.
Или еще вариант передавать на третью страницу инфу посредством

 $(document).ready ( function(){     
   $("input[name='products_name[1]']").keyup(function() {  
    var products_name =  $("input[name='products_name[1]']").val();       
     $.ajax({
        type: 'POST',
        url: 'new_product_page.php',
        data: { products_name_cont: products_name },
        success: function(data)
        {
            $('#curriculum').html(data);
        }
    });     
   }); 
});     

На данной странице считывать инфу $_POST['products_name_cont'] делать вычисления и отправлять обратно на страницу new_product.php, через $.ajax({
type: 'POST', это кстати возможно? или как-то по другому. я ХЗ пока.


Просмотр сообщенияValek сказал:

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

Просмотр сообщенияValek сказал:

или ридеректнутся без перезагрузки
Массив с нужным элементом есть только после возврата на страницу категорий. Редиректнуть ее можно наверное, но я пока не знаю как, но это я могу найти. Вопрос в другом, а каково условие для редиректа? Вот допустим мы на нее первый раз зашли, сразу будет редирект, куда? Кстати перехода на страницу new_product.php как такового нет, в categories.php есть include (DIR_WS_MODULES.'new_product.php'). И адрес выглядит так categories.php?cPath=10_31&pID=733&action=new_product. Т.е. нужно прописывать либо какое-то условие редиректа при возврате ..... не знаю как. Либо на new_product.php писать какой-то флаг и БД или куку и редиректиться если такой флаг есть. Но его так же где-то нужно будет и обнулять. Может время задействовать, в new_product.php писать время, а в categories.php читать текущее и если допустим разница 1-2 сек, то редиректится... В общем я ХЗ пока как именно нужно сделать.
СНПЧ, чернила, картриджи, фотобумага для принтеров и МФУ - AdisPrint.ru

#5 Матумба

Матумба

    во имя матана

  • Участник
  • PipPipPipPipPip
  • 5 126 сообщений
6 461
  • ИзКрии

Отправлено 09 Август 2019 - 20:53

Просмотр сообщенияAdisPrint сказал:

Правильнее все же на странице new_product.php стразу предварительно определить позицию товара, чтобы вернуться на categories.php уже на нужную страницу.
Т. е. сделать два запроса в одном месте - это плохо, а городить огород из всего с чем познакомился за последние полгода - это то, что нужно.. ну ок, все так и начинают с закрепления материала, а не решения задачи.

Просмотр сообщенияAdisPrint сказал:

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

#6 AdisPrint

AdisPrint

    Почетный

  • Активный участник
  • PipPipPipPipPip
  • 2 711 сообщений
2 056

TC Отправлено 09 Август 2019 - 22:34

Просмотр сообщенияМатумба сказал:

1.создать/обновить товар
2.получить из бд его номер в запросе для листинга с ограничением по знаку, типа count(1) FROM tab WHERE STRCMP(name, str) < 0 - тут знак точно не помнил никогда, можно попробовать поменять, если промахнулся
3.разделить на 20 и кинуть на нужную страницу
Ок. Я заполняю поле products_name на странице categories.php?cPath=ХХХ&pID=ХХХ&action=new_product. Но что туда вписано PHP узнает только после того как я нажму кнопку Сохранить и перемещусь на страницу categories.php?cPath=ХХХ&page=0&pID=ХХХ Только тогда этот товар окажется в базе, но тут уже поздно пить боржоми, я уже на неверной странице.
На странице categories.php?cPath=ХХХ&pID=ХХХ&action=new_product. значение поля products_name я могу только аяксом вытащить без перезагрузки. А вот как дальше передать переменную из js в php не покидая страницу я нефига не могу понять. Я сейчас так пытаюсь.
<script>
							  
$(document).ready ( function(){	
	$('form').submit(function() {
	  
	var url = document.location.href;  
	var products_name = $("input[name='products_name[1]']").val();  
     
	 $.ajax({
		type: 'POST',
		url: url,
		data: { products_name_cont: products_name },
		success: function(data)
		{
			$('#curriculum').html(data);
		},
	  error: function (xhr, ajaxOptions, thrownError) {
		alert(xhr.status);
		alert(thrownError);
	  }
	});
	
   });
});
	  
</script>	
	  
<?php  
if (isset($_POST['products_name_cont'])) $dfsdfdsf =   $_POST['products_name_cont'];

Только $_POST['products_name_cont']; пустое место.
СНПЧ, чернила, картриджи, фотобумага для принтеров и МФУ - AdisPrint.ru

#7 Valek

Valek

    ВСтатусе

  • Активный участник
  • PipPipPipPip
  • 1 413 сообщений
2 029
  • ИзРоссии :(

Отправлено 10 Август 2019 - 01:39

Я так понял
Получается контентная часть и код php в одном файле , который в данный момент отображается в браузере categories.php.
И естественно
....
if (isset($_POST['products_name_cont'])) $dfsdfdsf =   $_POST['products_name_cont'];
пусто. Так как там было пусто в момент генерации страницы.
Когда сабмитете форму происходит сохранении и обновление страницы, и это проблема... адрес не тот

В js коде submit(function() { применить event.preventDefault() что б обновление не происходило после нажатии кнопки
и тогда обрабатывается post в php формируете адрес и передаете уже в js и с помощью success: function(data) {...} меняете адрес

Если, как понял, контент совмещен с кодом обработчиком, придется попариться, что бы выдрать с формированный адрес из всего выданного контента.
Отличный хостинг низкие цены, высокое качество и SSL Ссылка на сайт

#8 Матумба

Матумба

    во имя матана

  • Участник
  • PipPipPipPipPip
  • 5 126 сообщений
6 461
  • ИзКрии

Отправлено 10 Август 2019 - 02:40

Просмотр сообщенияAdisPrint сказал:

Я заполняю поле products_name на странице categories.php?cPath=ХХХ&pID=ХХХ&action=new_product. Но что туда вписано PHP узнает только после того как я нажму кнопку Сохранить и перемещусь на страницу categories.php?cPath=ХХХ&page=0&pID=ХХХ
Если ты найдёшь место, где товар сохраняется, то легко допишешь описанный выше функционал со своим редиректом куда тебе надо сразу после момента сохранения.
Редирект делается так: header('Location: categories.php?cPath=ХХХ&page=0&pID=ХХХ', true, 302); exit;
"Они не могут ничего, у них лапки котят"

#9 AdisPrint

AdisPrint

    Почетный

  • Активный участник
  • PipPipPipPipPip
  • 2 711 сообщений
2 056

TC Отправлено 10 Август 2019 - 14:43

Просмотр сообщенияМатумба сказал:

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

На счет этого не совсем уверен. Это работает конечно, но может можно как то поэлегантнее сделать?
Это когда новый товар добавляется. Сначала ищем позицию элемента в массиве и если элемента в массиве нет, то элемент в массив добавляется, далее массив сортируется и снова производится поиск позиции элемента в массиве.
$key_namber = array_search(товар, массив);
		  if (!$key_namber) {
		  array_push(массив, товар);
		  sort(массив);
		  $key_namber = array_search(товар, массив);  
		  }

СНПЧ, чернила, картриджи, фотобумага для принтеров и МФУ - AdisPrint.ru

#10 Матумба

Матумба

    во имя матана

  • Участник
  • PipPipPipPipPip
  • 5 126 сообщений
6 461
  • ИзКрии

Отправлено 10 Август 2019 - 22:04

Просмотр сообщенияAdisPrint сказал:

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

Просмотр сообщенияAdisPrint сказал:

Это когда новый товар добавляется.
Эта логика никак не должна влиять на действие. Добавляешь или изменяешь - у тебя остаётся ID сущности (товара, статьи, раздела), вот по этому ID и делается дальнейшая работа. Логика должна быть привязана только к этой переменной.

Просмотр сообщенияAdisPrint сказал:

Сначала ищем позицию элемента в массиве и если элемента в массиве нет, то элемент в массив добавляется, далее массив сортируется и снова производится поиск позиции элемента в массиве.
Не надо так. Есть база данных, надо научиться ей пользоваться. Псевдокод SQL привёл выше. Нужно только одно число - кол-во элементов до нужного, его и надо искать. Сортировки и поиски, тем более с линейным временем, будут больно бить, если встретишься с серьёзными данными. Свои сортировки кажутся более простым решением, но тут экономия 10 минут на поиске правильного решения, которая потом может вылиться в недели боли.

 $key_namber = array_search(товар, массив);
if (!$key_namber) {
Тем более такой код не будет работать для первого (key = 0) элемента массива. Надо делать if ($key_namber !== false) или по гайдам вордпресса (false !== $key_namber)
"Они не могут ничего, у них лапки котят"

#11 AdisPrint

AdisPrint

    Почетный

  • Активный участник
  • PipPipPipPipPip
  • 2 711 сообщений
2 056

TC Отправлено 11 Август 2019 - 18:03

Просмотр сообщенияМатумба сказал:

Не надо так. Есть база данных, надо научиться ей пользоваться
Не получается так. В третьем файле который к слову тоже называется categories.php и расположен в папке classes/categories.php есть функция function insert_product. Именно к этой функции идет обращение из categories.php

case 'insert_category' :
   $catfunc->insert_category($_POST, $current_category_id);
   break;
  case 'update_product' :
   $catfunc->insert_product($_POST, $current_category_id, 'update');  
   break;

А вот кусок самой функции в classes/categories.php

foreach ($languages AS $lang) {
$language_id = $lang['id'];
$sql_data_array = array ('products_name' => vam_db_prepare_input($products_data['products_name'][$language_id]), 'products_description' => vam_db_prepare_input($products_data['products_description_'.$language_id]), 'products_short_description' => vam_db_prepare_input($products_data['products_short_description_'.$language_id]), 'products_keywords' => vam_db_prepare_input($products_data['products_keywords'][$language_id]), 'products_url' => vam_db_prepare_input($products_data['products_url'][$language_id]), 'products_meta_title' => vam_db_prepare_input($products_data['products_meta_title'][$language_id]), 'products_meta_description' => vam_db_prepare_input($products_data['products_meta_description'][$language_id]), 'products_meta_keywords' => vam_db_prepare_input($products_data['products_meta_keywords'][$language_id]));

if ($action == 'insert') {			  
$insert_sql_data = array ('products_id' => $products_id, 'language_id' => $language_id);
$sql_data_array = vam_array_merge($sql_data_array, $insert_sql_data);
vam_db_perform(TABLE_PRODUCTS_DESCRIPTION, $sql_data_array);
}
elseif ($action == 'update') {
vam_db_perform(TABLE_PRODUCTS_DESCRIPTION, $sql_data_array, 'update', 'products_id = \''.vam_db_input($products_id).'\' and language_id = \''.$language_id.'\'');
}		  
}
Название товара вот это vam_db_prepare_input($products_data['products_name'][$language_id])
И если добавляется новый товар, то внутри функции его еще нет в БД, я проверял. В конце функции вытаскивал массив. Я не программист, но ИМХО запись в БД произойдет только после возврата функции?

Именно поэтому пришлось вытаскивать массив, проверять есть ли ли там новый элемент, если нет то добавлять. Кроме того приводить все в нижний регистр иначе sort не правильно работает, но работает, а всякие там natcasesort() вообще не работают, элемент как последним был добавлен так после natcasesort последним и остается. Потом считать в цикле каким по счету является элемент и уже отсюда вычислять страницу. От этого
$key_namber = array_search(товар, массив);
Пришлось отказаться, потому что возвращается ключ, а не порядковый номер.
И кстати да, для первого элемента не сработало. Пришлось добавить.
if ($key_namber < 0) {
			  $key_namber = 0;
		  }

А еще пришлось учесть вставляется новый товар или редактируется старый и от этого запускать цикл подсчета порядкового номера либо с i=0; либо c i=-1;
А еще полдня трахал себе мозг выясняя почему не работает, то что должно работать, пока не допер, что запрос к БД кэшируется, а в данном случае это не нужно.
СНПЧ, чернила, картриджи, фотобумага для принтеров и МФУ - AdisPrint.ru

#12 Матумба

Матумба

    во имя матана

  • Участник
  • PipPipPipPipPip
  • 5 126 сообщений
6 461
  • ИзКрии

Отправлено 11 Август 2019 - 22:08

Просмотр сообщенияAdisPrint сказал:

И если добавляется новый товар, то внутри функции его еще нет в БД, я проверял. В конце функции вытаскивал массив. Я не программист, но ИМХО запись в БД произойдет только после возврата функции?
Там надо смотреть эти функции, что они делают. Запись будет готова либо после mysql_query(), либо, если используются транзакции, после mysql_query("COMMIT");

Т.е товар будет в базе уже после возврата из vam_db_perform(TABLE_PRODUCTS_DESCRIPTION, $sql_data_array); и имея название товара, можно уже соблюсти API с именами функций и дописать своих или просто сделать свою функцию, которая будет обращаться к БД за COUNT(1) FROM `tab` WHERE STRCMP(`name`, `str`) < 0 ORDER BY `name` и редиректить куда надо.

Просмотр сообщенияAdisPrint сказал:

Кроме того приводить все в нижний регистр иначе sort не правильно работает, но работает, а всякие там natcasesort() вообще не работают, элемент как последним был добавлен так после natcasesort последним и остается.
Надо освоить uasort($arr, "func")
"Они не могут ничего, у них лапки котят"

#13 AdisPrint

AdisPrint

    Почетный

  • Активный участник
  • PipPipPipPipPip
  • 2 711 сообщений
2 056

TC Отправлено 12 Август 2019 - 13:51

Просмотр сообщенияМатумба сказал:

Там надо смотреть эти функции, что они делают.
Блин я и так уже нырнул в кроличью нору на неделю почти. Не хочу нырять еще глубже, интересно конечно, но времени нет. Остальные дела встали. Сегодня забросил все на боевой, сижу добавляю товар. Залил уже около полсотни позиций и пока не одного промаха с попаданием на нужную страницу нет при различных вариациях добавления товара. Тормозов лишних вроде тоже не ощутил. .
СНПЧ, чернила, картриджи, фотобумага для принтеров и МФУ - AdisPrint.ru

#14 Матумба

Матумба

    во имя матана

  • Участник
  • PipPipPipPipPip
  • 5 126 сообщений
6 461
  • ИзКрии

Отправлено 12 Август 2019 - 14:10

AdisPrint,в нашем деле главное - чтобы работало :)
"Они не могут ничего, у них лапки котят"

#15 AdisPrint

AdisPrint

    Почетный

  • Активный участник
  • PipPipPipPipPip
  • 2 711 сообщений
2 056

TC Отправлено 12 Август 2019 - 14:17

Потихоньку собираюсь с духом перевести сайт на PHP 7.3 и по этому поводу вопрос. Может есть какая-нибудь софтинка или php скрипт для автоматической проверки на совместимость.
СНПЧ, чернила, картриджи, фотобумага для принтеров и МФУ - AdisPrint.ru

#16 Матумба

Матумба

    во имя матана

  • Участник
  • PipPipPipPipPip
  • 5 126 сообщений
6 461
  • ИзКрии

Отправлено 12 Август 2019 - 15:12

Просмотр сообщенияAdisPrint (12 Август 2019 - 14:17) писал:

Потихоньку собираюсь с духом перевести сайт на PHP 7.3 и по этому поводу вопрос. Может есть какая-нибудь софтинка или php скрипт для автоматической проверки на совместимость.
Может и есть, но нормально работают только логи и включенные ошибки. Мне вот пришлось переписывать mysql-коннекторы с mysql на mysqli для текущей своей cms. Для прошлой версии, ещё под пхп4 и всяких сеошных инструментов, пришлось дописать в классы нормальные конструкторы и изменить имена классов.

В целом это не очень страшно, если следить за руками и логами и оно таки того стоит.
"Они не могут ничего, у них лапки котят"



Похожие темы


Количество пользователей, читающих эту тему: 3

0 пользователей, 3 гостей, 0 анонимных



© 2019 SMO&SEO форум «WEBIMHO» — продвижение и создание сайтов, интернет-маркетинг

По вопросам рекламы на форуме и цены на рекламу
Все материалы SEO форума разрешены к копированию только с установкой гиперактивной ссылки на webimho.ru,
тем, кто этого не сделает, мы оторвем руки и ноги и поменяем местами,
а когда выйдем из тюрьмы, опять оторвем и опять поменяем.


Россия, г. Москва

Мы в соцсетях: twitter | вконтакте | facebook | livejournal