Virtuemart не работает, когда ps_cart-> add () возвращает false - PullRequest
1 голос
/ 27 августа 2011

Я сталкиваюсь со странной небольшой проблемой, когда модифицирую модуль VM для кого-то.

Мы изменили функции класса ps_cart add () и update () следующим фрагментом кода: Однако мыВы заметили, что когда какая-либо из функций, проверяющих количество товара (отрицательный или алфавитный символ), на странице не отображается ошибка, как это должно быть в коде.

Вместо этого она выдает пользователюстраница со списком всех продуктов со следующей ссылкой: /index.php?keyword=&category_id=&limitstart=&page=shop.browse&option=com_virtuemart&Itemid=2

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

Кроме того, когда это происходит, Firebug сообщает "Не удалось загрузить источник для: http://[website]/index.php" в ответе на запрос POST, сгенерированныйдобавить в корзину "событие".

Кто-нибудь есть идеи, где оценивается возвращение ps_cart-> add (), чтобы мы моглиbleshoot, или у кого-нибудь есть идеи относительно причины?Ниже приведен код из ps_cart, возвращающий значение false, мы вставили среднее условие if, но, как я упоминал ранее, то же самое происходит с собственными проверками количества VM.

// Check for negative quantity
        if ($quantity < 0) {
            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) {
            vmRequest::setVar('product_id', $product_id );
            $vmLogger->warning( $VM_LANG->_('PHPSHOP_CART_ERROR_ONLY_ONE',false) );
            return False;
        }

        if ( !is_numeric($quantity) ) {
            vmRequest::setVar('product_id', $product_id );
            $vmLogger->warning( $VM_LANG->_('PHPSHOP_CART_ERROR_NO_VALID_QUANTITY',false) );
            return False;
        }

Подача этого сообщения об ошибке не будетэто было бы большим решением, так как у нас была сильно настроенная виртуальная машина, и обновление было бы огромной болью.

Любая помощь будет наиболее ценной.

1 Ответ

0 голосов
/ 28 августа 2011

После некоторых исследований мне удалось решить эту проблему.

Для всех тех, кто ищет дополнительную информацию о том, как 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, похоже, не обрабатывает ошибки, возвращаемые функциями]

Надеюсь, это было полезно для некоторых.

...