После некоторых исследований мне удалось решить эту проблему.
Для всех тех, кто ищет дополнительную информацию о том, как virtuemart обрабатывает фактическое добавление в корзину, я объясню процесс окончательного определения проблемы.,Однако решение довольно простое.
Форма
Вы, возможно, заметили, что большинство форм VM используют PHP_SELF в качестве действия формы.Форма фактически представляет загрузку данных, которые вы не можете видеть через скрытые поля ввода, чтобы предоставить необходимую информацию странице PHP_SELF, говоря: «пользователь хочет сделать это [addCart] с этими [продуктами]».Пример из addtocartform.tpl.php, который представляет собой небольшую форму, состоящую из кнопки «добавить в корзину» и элементов управления количеством, если они включены:
<form action="<?php echo $mm_action_url ?>index.php" method="post" name="addtocart" id="addtocart<?php echo $i ?>" class="addtocart_form" <?php if( $this->get_cfg( 'useAjaxCartActions', 1 ) && !$notify ) { echo 'onsubmit="handleAddToCart( this.id );"'; } ?>>
<?php echo $ps_product_attribute->show_quantity_box($product_id,$product_id); ?><br />
<input type="submit" class="<?php echo $button_cls ?>" value="<?php echo $button_lbl ?>" title="<?php echo $button_lbl ?>" />
<input type="hidden" name="category_id" value="<?php echo @$_REQUEST['category_id'] ?>" />
<input type="hidden" name="product_id" value="<?php echo $product_id ?>" />
<input type="hidden" name="prod_id[]" value="<?php echo $product_id ?>" />
<input type="hidden" name="page" value="shop.cart" />
<input type="hidden" name="func" value="cartadd" />
<input type="hidden" name="Itemid" value="<?php echo $sess->getShopItemid() ?>" />
<input type="hidden" name="option" value="com_virtuemart" />
<input type="hidden" name="set_price[]" value="" />
<input type="hidden" name="adjust_price[]" value="" />
<input type="hidden" name="master_product[]" value="" />
Итак, вместе с элементами управления количеством (добавленный show_quantity_box ()) и кнопкой отправки, вы можете увидеть множество других передаваемых данных.Среди этих данных - func = "cartadd" и product_id = [идентификатор продукта].
Обработка формы
В отличие от простой формы POST, где вы ожидаете только данные из одной предварительно определенной формы, VMиспользует файл с именем "virtuemart_parser.php".Этот файл проверяет отправленный «func», чтобы проверить, что именно пытается сделать пользователь.Затем анализатор проверит, была ли зарегистрирована функция как таковая (помните, что вы можете добавить свои собственные функции в конфигурацию виртуальной машины), и если это так, он выполнит ее.[virtuemart_parser.php строка 215-274]
Теперь, когда в нашем случае вызываемая функция возвращает логическое значение false, синтаксический анализатор выполнит следующий код:
$last_page = vmGet( $_SESSION, 'last_page' );
if( $last_page != HOMEPAGE && !empty( $last_page ) && empty($_REQUEST['ignore_last_page']) ) {
$page = $last_page;
}
В основном он проверяетпоследняя страница в $ _SESSION.В нашем случае мы пришли из shop.browse, но обнаруженная нами «last_page» на самом деле была установлена как shop.productdetails, поэтому мы перенаправили нас к списку продуктов без каких-либо предупреждений.
Решение
Таким образом, решение было довольно простым, мы просто установили переменную last_page, оставив нам следующий модифицированный код:
// Check for negative quantity
if ($quantity < 0) {
$_SESSION['last_page'] = 'shop.browse';
vmRequest::setVar('product_id', $product_id );
$vmLogger->warning( $VM_LANG->_('PHPSHOP_CART_ERROR_NO_NEGATIVE',false) );
return False;
}
if ($quantity > 1 || $_SESSION['cart']["idx"] >= 1) {
//$_SESSION['last_page'] = 'shop.browse';
vmRequest::setVar('product_id', $product_id );
$vmLogger->warning( $VM_LANG->_('PHPSHOP_CART_ERROR_ONLY_ONE',false) );
return False;
}
if ( !is_numeric($quantity) ) {
$_SESSION['last_page'] = 'shop.browse';
vmRequest::setVar('product_id', $product_id );
$vmLogger->warning( $VM_LANG->_('PHPSHOP_CART_ERROR_NO_VALID_QUANTITY',false) );
return False;
}
ps_cart-> add () устанавливает $ _SESSION ['last_page'] = "shop.productdetails "автоматически [строка 109].Мы изменили его на
$_SESSION['last_page'] = $_SESSION['last_page']=="shop.product_details" ? $_SESSION['last_page'] : 'shop.browse';
Таким образом, вы решаете, добавил ли клиент продукт со страницы сведений или страницы просмотра категории.Если клиент добавил продукт со страницы brwosing - именно там будет отображаться ошибка, если он добавил продукт со страницы product_details, он получит ошибку на странице shop.cart.[product_details, похоже, не обрабатывает ошибки, возвращаемые функциями]
Надеюсь, это было полезно для некоторых.