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


Правила форума

Внимание!!! Если не можете скачать, пожалуйста ознакомьтесь с условиями получения доступа с файлам форума. Правила форума


Штатные ошибки ShopCMS, из коробки :).


Сообщений в теме: 38

#21 badisoft

    Продвинутый пользователь

  • VIP
  • 5 006 сообщений
Репутация: 766
Мастер

Отправлено 02 февраля 2016 - 16:01

Цитата

Очередная штатная ошибка, которая не понятно почему до сих пор никем не была замечена.
В user.js есть JS-функция _formatPrice, она форматирует цену товара исходя из заданного округления валюты.

Все ровно то же самое, но для PHP-функции _formatPrice в файле functions.php

  function _formatPrice($price, $rval = 2, $dec = '.', $term = ' ')
  {
# BEGIN исправление ошибки при "отрицательном" округлении в настройке валют
#	  return number_format($price, $rval, $dec, $term);
	  return number_format(round($price,$rval), $rval, $dec, $term);
# END исправление ошибки при "отрицательном" округлении в настройке валют
  }


http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#22 Robby

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 161 сообщений
Репутация: 75
Продвинутый

Отправлено 02 февраля 2016 - 22:30

Еще одна ошибка. В административной части переходим в обсуждение товаров, выбираем все товары (обсуждений должно быть больше лимита на страницу, чтобы появилась навигация), переходим на страницу отличную от первой (в адресной строке должно появиться кроме прочего &offset=). Теперь если в фильтре товаров выбрать любой товар, то получим циклическую переадресацию. Причина в неправильном адресе возврата после выбора товара.
В файле catalog_discuss.php есть функция function GetUrlToFind() исправляем ее
			    function GetUrlToFind()
			    {
					    $res = ADMIN_FILE."?dpt=catalog&sub=discuss";
					    # Fix циклическая переадресация в обсуждениях товаров
					    //if ( isset( $_GET["offset"] ) )
					    //	    $res .= "&offset=".$_GET["offset"];
					    if ( isset( $_GET["sort"] ) )
							    $res .= "&sort=".$_GET["sort"];
					    return $res;
			    }
Причина в $_GET["offset"] так как в строке присутствует &offset= то функция возвращает адрес с &offset= которого не существует из-за чего и получается циклическая переадресация.

#23 Robby

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 161 сообщений
Репутация: 75
Продвинутый

Отправлено 09 апреля 2016 - 12:30

Некритичная ошибка в admin.php. На странице редактирования товара или категории вместо правильного charset=windows-1251 будет charset={$smarty.const.DEFAULT_CHARSET}
Находим в двух местах строку
<meta http-equiv="content-type" content="text/html; charset={$smarty.const.DEFAULT_CHARSET}">
заменяем на:
<meta http-equiv="content-type" content="text/html; charset=<?php echo DEFAULT_CHARSET;?>">


#24 Robby

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 161 сообщений
Репутация: 75
Продвинутый

Отправлено 21 апреля 2016 - 21:47

Повтор кода в файле conf_currencies.php - два раза повторяется строка $val["curr_where"] = (int)$val["curr_where"];
						// update existing currencies
						foreach( $data as $key => $val )
						{
								if ( $val["curr_name"] == "" || $val["curr_currencyIso3"] == "" || $val["curr_code"] == "" )
										continue;
								$val["curr_value"] = (float)$val["curr_value"];
								$val["curr_sort"]  = (int)$val["curr_sort"];
								$val["curr_where"] = (int)$val["curr_where"];
								#$val["curr_where"] = (int)$val["curr_where"];
								$val["curr_roundval"] = (int)$val["curr_roundval"];
								if ( $val["curr_value"] < 0 )
										continue;
								currUpdateCurrency( $key, $val["curr_name"], $val["curr_code"], $val["curr_currencyIso3"],
																		$val["curr_value"], $val["curr_where"], $val["curr_sort"], $val["curr_roundval"] );
						}



#25 badisoft

    Продвинутый пользователь

  • VIP
  • 5 006 сообщений
Репутация: 766
Мастер

Отправлено 28 апреля 2016 - 13:12

Очередная штатная ошибка:

В шаблоне category.php есть код

if(isset($_GET["advanced_search_in_category"])){
$smarty->assign( "products_to_showc", count($products));
}else{
if ( $category["show_subcategories_products"] )
$smarty->assign( "products_to_showc", $category["products_count"]);
else $smarty->assign( "products_to_showc", catGetCategoryProductCount( $categoryID, true));
}


он задает смарти-переменную products_to_showc в трех разных случаях - для расширенного поиска, для категории в случае показа с подкатегориями и для категории в случае показа без подкатегорий.
В случае показа категории с подкатегориями этой переменной присваивается значение $category["products_count"], т.е. (исходно) значение, содержащееся в одноименном поле SQL-таблицы CATEGORIES_TABLE.
Вот тут-то и кроется ошибка. Это поле содержит суммарное количетво товаров в этой категории плюс все дочерние. Вроде бы, все хорошо и правильно. Но!
1. Пусть имеется категория ААА (7 товаров), а в ней две дочерние категории BBB и CCC (тоже по 7 товаров).
2. Пусть имеет товар А, находящийся в категории DDD и ему добавлены BBB и ССС как дополнительные категории.
При выводе категорий ААА, BBB и CCC без подкатегорий все будет правильно, в каждой будет показано по 7 товаров, а переменная products_to_showc будет содержать правильное количество товаров.
А вот если вывести категорию ААА с подкатегориями, то товар А будет показан только один раз (и это правильно), хотя есть в двух категориях. А products_to_showc будет содержать неверное значение (21 вместо 20).
Повторюсь, ошибка вылезает только тогда, когда категория показывается с подкатегориями и в дочерних категориях есть дублирующиеся за счет доп.категорий товары.

Исправление:
Из кода видно, что в случае расширенного поиска (advanced_search_in_category) эта переменная принимает значение количества товаров на текущей странице, а в случае показа категории (с подкатегориями и без) - полное количество товаров, а не на текущей странице.
В том же файле category.php есть переменная $count. Если проследить ее до места задания, то это окажется самый конец функции prdSearchProductByTemplate:

$count_row = isset($callBackParam["extraParametrsTemplate"])?$i:$products_count;


Эта переменная как раз и содержит то, что нам надо - при поиске количество товаров на странице ($i), а в остальных случаях полное количество товара ($products_count). Причем как раз именно правильное количество, а не сумму товаров во всех категориях.
Соответственно, весь этот развесистый if else if else можно заменить одной строкой, получив при этом правильное значение products_to_showc вне зависимости от вышеописанных условий.

/*
if(isset($_GET["advanced_search_in_category"])){
$smarty->assign( "products_to_showc", count($products));
}else{
if ( $category["show_subcategories_products"] )
$smarty->assign( "products_to_showc", $category["products_count"]);
else $smarty->assign( "products_to_showc", catGetCategoryProductCount( $categoryID, true));
}
*/
$smarty->assign( "products_to_showc", $count);


http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#26 Robby

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 161 сообщений
Репутация: 75
Продвинутый

Отправлено 23 мая 2016 - 21:28

Небольшое исправление:
в файле russian.php в константе ADMIN_PRODUCT_INSTOCK первая буква в слове Склад - английская. Нужно изменить на русскую.
define('ADMIN_PRODUCT_INSTOCK', 'Cклад');

Константа используется при импорте и экспорте, вызовет проблему из-за того, что колонка Склад не будет найдена при импорте.

#27 badisoft

    Продвинутый пользователь

  • VIP
  • 5 006 сообщений
Репутация: 766
Мастер

Отправлено 23 мая 2016 - 21:34

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

в файле russian.php в константе ADMIN_PRODUCT_INSTOCK первая буква в слове Склад - английская. Нужно изменить на русскую. define('ADMIN_PRODUCT_INSTOCK', 'Cклад');
Не нужно. Проблем будет больше. Там по всему shopCMS в соответствующих местах "Склад" с английской буквой. Либо надо везде и менять. И держать этот момент в голове, т.к. старые выгруженные CSV уже не подойдут автоматически.

PS. Хотя нет, оно ж везде оттуда и подставляется. В общем, я года три назад об этом уже писал, но помню, что там был какой-то подвох с заменой на правильное написание слова "Склад". Но в чем эта несовместимость - уже не помню.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#28 badisoft

    Продвинутый пользователь

  • VIP
  • 5 006 сообщений
Репутация: 766
Мастер

Отправлено 30 июня 2016 - 16:55

Хех... Очередная штатная ошибка :).
Если в "Управление блоками" в поле "Выбранные товары" вводить ID товаров так, как указано в хелпе, т.е.
--------
Укажите ID товаров разделяя их знаком ":".
Например - 112:231:6544:3342:22:534
--------
то сохранится только первый ID, т.к. на самом деле отделять номера надо Enter-ом, т.е. заполнять так:
112
231
6544
3342
22
534

Либо надо исправить "/n" на ":" в в файле blocks_functions.php в функциях
blockspgUpdateblocksPage
blockspgAddblocksPage
blockspgAddblocksPageFile
и цикл
{section name=z loop=$blocks_edit.products}
{$blocks_edit.products[z]}
{/section}
в файле conf_blocks_edit.tpl.html
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#29 kery

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 128 сообщений
Репутация: 16
Начинающий

Отправлено 18 июля 2016 - 21:08

еще несколько ошибок в импорте csv файла всплыло:
1. не обрабатывает обратный слеш \ в наименовании товаров - если в наименовании присутствует обратный слеш \ и задана идентификация по наименованию то одинаковые товары из файла он считает как новые
2. не знаю баг или нет но импорт как то по особенному обрабатывает идентификацию по наименованию - если в каталоге присутствуют в разных категориях товары с одинаковым названием то как я понял изменяются только первый добавленный в базу к примеру: есть категория 1 уровня - "каталог по Москве" в ней категория 2-го уровня "Табак" и в ней 10 товаров, такая же категория первого уровня "Каталок по Курску" и в ней категория 2-го уровня "Табак" и аналогичные 10 товаров. Если импортировать файл и указать идентификацию по наименованию то только в "Каталоге по Москве" обновятся товары из категории "Табак" (она первая залита в базу) а в категории "Каталог по Курску" товары не изменятся.

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

#30 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 207 сообщений
Репутация: 54
Продвинутый

Отправлено 03 августа 2016 - 13:50

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

Не ошибка, просто упрощаем код: 1. в файле cart.php заменяем
Сразу и не сообразил, как это упрощение применить при установленных модулях "Подарки к заказу" и "Корзина в модальном окне".

П.С. Даже, вообще, не сообразил (

#31 badisoft

    Продвинутый пользователь

  • VIP
  • 5 006 сообщений
Репутация: 766
Мастер

Отправлено 03 августа 2016 - 19:17

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

Сразу и не сообразил, как это упрощение применить при установленных модулях
А что там соображать?
1. Описанные изменения просто убирают лишний код, т.к. все рассчитываемые в коде данные уже и так есть в результате выполнения вышерасположенной строки
$resCart = cartGetCartContent();

2. Этот "лишний" код практически тот же, что и в функции cartGetCartContent(), т.е. если при установке какого-то модуля (дополнения) вносились изменения в этот код, то такие же изменения должны были вноситься и в функцию.

Другими словами, я не вижу причин, по которым нельзя было бы закомментировать этот же кусок кода даже если в него внесены какие-то изменения.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#32 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 207 сообщений
Репутация: 54
Продвинутый

Отправлено 03 августа 2016 - 20:44

badisoft, приведу пример двух участков кода при установленном модуле подарков к заказу:
условие в cart.php
	if ( isset ( $_SESSION["log"] ))
			  //taking products from database
			  {
			  $q = db_query("select itemID, Quantity FROM ".SHOPPING_CARTS_TABLE." WHERE customerID=".( int ) regGetIdByLogin($_SESSION["log"]));
			  while ( $row = db_fetch_row($q)) {
				  $q1 = db_query("select productID from ".SHOPPING_CART_ITEMS_TABLE." where itemID=".( int ) $row["itemID"]);
				  $r1 = db_fetch_row($q1);
				  $variants = GetConfigurationByItemId($row["itemID"]);
				  $k += GetPriceProductWithOption($variants, $r1["productID"]) * $row["Quantity"];
				  $cnt += $row["Quantity"];
			  }
		  }
		  else
			  if ( isset ( $_SESSION["gids"] ))
				  //...session vars
				  {
				  for ( $i = 0; $i < count($_SESSION["gids"]); $i++ ) {
					  if ( $_SESSION["gids"][$i] ) {
# BEGIN Present
/*
$t = db_query("select Price FROM ".PRODUCTS_TABLE." WHERE productID=".( int ) $_SESSION["gids"][$i]);
$rr = db_fetch_row($t);
$sum = $rr["Price"];
// $rr["Price"]
foreach ( $_SESSION["configurations"][$i] as $varconf ) {
		$q1 = db_query("select price_surplus from ".PRODUCTS_OPTIONS_SET_TABLE." where variantID=".( int ) $varconf." AND productID=".( int ) $_SESSION["gids"][$i]);
		$r1 = db_fetch_row($q1);
		$sum += $r1["price_surplus"];
}
*/
$sum = GetPriceProductWithOption($_SESSION["configurations"][$i],$_SESSION["gids"][$i]);
# END Present
						  $k += $_SESSION["counts"][$i] * $sum;
						  $cnt += $_SESSION["counts"][$i];
					  }
				  }
			  }

условие в файле shopping_cart_info.php
		if (isset($_SESSION["log"])) //taking products from database
		{
				$q = db_query("select itemID, Quantity FROM ".SHOPPING_CARTS_TABLE.
								" WHERE customerID=".regGetIdByLogin($_SESSION["log"]));
				while ($row = db_fetch_row($q))
				{
						$q1=db_query("select productID from ".SHOPPING_CART_ITEMS_TABLE.
								" where itemID=".$row["itemID"]);
						$r1=db_fetch_row($q1);
						if($r1["productID"]){
						$variants=GetConfigurationByItemId( $row["itemID"] );
						$k += GetPriceProductWithOption($variants, $r1["productID"])*$row["Quantity"];
						$cnt+=$row["Quantity"];
						}
				}
		}
		else
		if (isset($_SESSION["gids"])) //...session vars
		{
				for ($i=0; $i<count($_SESSION["gids"]); $i++)
				{
						if ($_SESSION["gids"][$i])
						{
# BEGIN Present
/*
$t = db_query("select Price FROM ".PRODUCTS_TABLE." WHERE productID=".(int)$_SESSION["gids"][$i]);
$rr = db_fetch_row($t);
$sum=$rr["Price"];
// $rr["Price"]
foreach( $_SESSION["configurations"][$i] as $vars )
		{
		$q1=db_query("select price_surplus from ".PRODUCTS_OPTIONS_SET_TABLE.
				" where variantID=".(int)$vars." AND productID=".(int)$_SESSION["gids"][$i]);
		$r1=db_fetch_row($q1);
		$sum+=$r1["price_surplus"];
		}
*/
$sum = GetPriceProductWithOption($_SESSION["configurations"][$i],$_SESSION["gids"][$i]);
# END Present
								$k += $_SESSION["counts"][$i]*$sum;
								$cnt += $_SESSION["counts"][$i];
						}
				}
		}


#33 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 207 сообщений
Репутация: 54
Продвинутый

Отправлено 04 августа 2016 - 00:29

Вместо:

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

/*
if(isset($_GET["advanced_search_in_category"])){
$smarty->assign( "products_to_showc", count($products));
}else{
if ( $category["show_subcategories_products"] )
$smarty->assign( "products_to_showc", $category["products_count"]);
else $smarty->assign( "products_to_showc", catGetCategoryProductCount( $categoryID, true));
*/
$smarty->assign( "products_to_showc", $count);
должно быть (пропущена закрывающая скобка):
/*
if(isset($_GET["advanced_search_in_category"])){
$smarty->assign( "products_to_showc", count($products));
}else{
if ( $category["show_subcategories_products"] )
$smarty->assign( "products_to_showc", $category["products_count"]);
else $smarty->assign( "products_to_showc", catGetCategoryProductCount( $categoryID, true));
}
*/
$smarty->assign( "products_to_showc", $count);
Ошибка приводила к белому экрану, поэтому нужно исправить.

#34 Salp

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 207 сообщений
Репутация: 54
Продвинутый

Отправлено 12 августа 2016 - 08:59

В админке при подсчете заказов сегодня/вчера и за месяц не учитывается часовой пояс, установленный в общих настройках.
Исправление - файл totals.php
//orders today
#$curr_time = time();
$curr_time = time() + intval(CONF_TIMEZONE)*3600;
#$YESTERDAY = strftime( "%Y-%m-%d 00:00:00", time()-24*3600);
$YESTERDAY = strftime( "%Y-%m-%d 00:00:00", time()-24*3600 + intval(CONF_TIMEZONE)*3600 );


#35 badisoft

    Продвинутый пользователь

  • VIP
  • 5 006 сообщений
Репутация: 766
Мастер

Отправлено 26 марта 2017 - 15:18

Проблемы с DMARC

С 18 мая 2016 года администрацией mail.ru была включена строгая политика DMARC для всех почтовых ящиков в доменах почтового сервиса mail.ru, таких как
*@(mail.ru/list.ru/inbox.ru/bk.ru/mail.ua).

По этой причине сообщения с заголовками From (От кого) и указанием ящиков почтового сервиса mail.ru, отправляемые не с почтового сервера mail.ru, к примеру, с использованием скриптов Вашего сайта, сразу отклоняются использующими проверку DMARC-политики серверами получателей и не могут быть доставлены.
На текущий момент проверка DMARC производится на таких почтовых сервисах как yandex.ru, mail.ru, gmail.com, yahoo.com и других.

С течением времени политику DMARC начинает применять все большее количество сервисов, что приводит к невозможности доставки писем с некорректным полем From (От кого)

Более полно: https://habrahabr.ru...ru/blog/282602/

Решение: в файле /core/functions/functions.php в функциях xMailTxtHTML и xMailTxtHTMLDATA


вместо

$mail->From = $castmail;


вставляем

# BEGIN исправляем отправку email
#$mail->From = $castmail;
$mail->From = CONF_GENERAL_EMAIL;
$mail->Sender = CONF_GENERAL_EMAIL;
# END исправляем отправку email


Сообщения будут приходить от email магазина, но с именем клиента (в заголовке From будет email магазина)
Но ответ на них (при нажатии кнопки "Ответить") будет идти на email клиента, т.к. он берется из заголовка Reply-To.

Для наглядности можно добавить Имя и email клиента в первую строку сообщения.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#36 makki

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 146 сообщений
Репутация: 7
Начинающий

Отправлено 27 марта 2017 - 15:47

Просмотр сообщенияbadisoft (26 марта 2017 - 15:18) писал:

Проблемы с DMARC
Другой вариант решения проблемы: отправлять через SMTP.

#37 badisoft

    Продвинутый пользователь

  • VIP
  • 5 006 сообщений
Репутация: 766
Мастер

Отправлено 27 марта 2017 - 16:51

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

Другой вариант решения проблемы: отправлять через SMTP.
Это весьма не самый простой вариант.
Ведь через бесплатный SMTP-сервер mail.ru (или yandex, или gmail) получится отправлять только если во From будет стоять соответствующий домен (мэйлрушный, яндексовый, жемэйловый). А многие (люди, не сервисы) совершенно справедливо криво смотрят на ситуацию, когда развесистый магазин со своим доменом почему-то работает через почтовый ящик бесплатного сервиса.

Идея-то у DMARC проста. Каждый доменовладелец (например, mail.ru) вводит правила, по которым письмо с его доменом во from может войти в сеть. Ведь будет странным, если во from будет стоять vasya@mail.ru, а письмо непарольно (!) войдет в сеть с IP 123.123.123.123, который к домену mail.ru никаким боком. По парольному протоколу - пожалуйста.

Можно зарегистрировать MX-запись для своего домена на yandex.ru (https://pdd.yandex.ru/ - почта для домена) или в аналогичной службе Гугла, но я не уверен, что после этого письма с доменом mail.ru или gmail.com в поле From станут доходить. Хотя, если я правильно понял написанное по ссылке, то должны.

В общем, мне кажется, что исправлять надо причину (некорректный по нынешним реалиям email во From), а не пытаться это обойти.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#38 makki

    Продвинутый пользователь

  • Assistent vsupport.ru
  • PipPipPip
  • 146 сообщений
Репутация: 7
Начинающий

Отправлено 27 марта 2017 - 17:10

Просмотр сообщенияbadisoft (27 марта 2017 - 16:51) писал:

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

Другой вариант решения проблемы: отправлять через SMTP.
Это весьма не самый простой вариант.
Это может быть непростой вариант и почта уходит не так быстро как через серверную функцию mail(), но если все правильно настроено, это гарантированный метод доставки ваших писем даже на привередливый gmail.

Цитата

Ведь через бесплатный SMTP-сервер mail.ru (или yandex, или gmail) получится отправлять только если во From будет стоять соответствующий домен (мэйлрушный, яндексовый, жемэйловый). А многие (люди, не сервисы) совершенно справедливо криво смотрят на ситуацию, когда развесистый магазин со своим доменом почему-то работает через почтовый ящик бесплатного сервиса.
Я использую SMTP-сервер хостинг провайдера с настроенной DKIM для домена.
Прикрепленный файл  smtp.png   20,2К   7 Количество загрузок:

#39 badisoft

    Продвинутый пользователь

  • VIP
  • 5 006 сообщений
Репутация: 766
Мастер

Отправлено 27 октября 2017 - 15:58

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

В файле setting_constants.sql почему-то у всех численных констант функция задана как
'setting_TEXT_BOX(0,'
а надо
'setting_TEXT_BOX(2,'
Из-за этого в численные константы (минимальная сумма заказа и другие) можно вписать любой текст или вообще ничего.
Параметр функции (она находится в setting_functions.php) задает, в какой вид преобразовать введенную в поле строку.
0 - текстовая строка, 1 - float, 2-int.

Исправлять надо ДО инсталляции, т.к. setting_constants.sql это то, что при инсталляции прописывается в SQL-таблицу xxx_settings и берется потом оттуда.
На работающем сайте исправлять надо уже в самой таблице.
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)