当ps_cart-> add()返回false时,Virtuemart失败

时间:2011-08-27 16:46:51

标签: php joomla-extensions virtuemart

我在为某人修改VM模块时遇到了一个奇怪的小问题。

我们用以下代码改变了ps_cart类函数add()和update(): 但是,我们注意到,当任何函数验证产品的数量(负数或字母字符)时,页面不会显示代码中应该出现的错误。

相反,它会将用户引导到列出具有以下链接的所有产品的页面: /index.php?keyword=&category_id=&limitstart=&page=shop.browse&option=com_virtuemart&Itemid=2

我们添加了if-conditional检查购物车中的产品数量,但是当您使用负数或字母数量时,VM也会这样做。

此外,当发生这种情况时,Firebug在添加到购物车“事件”生成的POST的响应中报告“无法加载源:http:// [website] /index.php”。

有没有人知道ps_cart-> add()的返回在哪里被评估,所以我们可以排除故障,或者是否有人对原因有任何想法? 以下是来自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 :(得分:0)

经过一番研究后,我设法解决了这个问题。

对于所有那些寻求更多关于virtmart如何处理实际添加到购物车的信息的人,我将解释我最终如何确定问题的过程。解决方案很简单。

表格

您可能已经注意到大多数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 = [product id]。

处理表格

与简单的表单POST不同,您希望只有一个预定形式的数据,VM使用名为“virtuemart_parser.php”的文件。此文件检查提交的“func”以检查用户正在尝试执行的操作。然后解析器将检查这样的函数是否已注册(记住你可以在VM配置中添加自己的函数),如果是,它将执行它。 [virtuemart_parser.php第215-274行]

现在,在我们的情况下,调用的函数返回boolean false,解析器将执行以下代码:

$last_page = vmGet( $_SESSION, 'last_page' );
if( $last_page != HOMEPAGE && !empty( $last_page ) && empty($_REQUEST['ignore_last_page']) ) {
$page = $last_page;
}

基本上它会检查$ _SESSION中的last_page。在我们的例子中,我们来自shop.browse,但我们发现的'last_page'实际上设置为shop.productdetails,因此将我们重定向到产品列表而没有任何警告。

解决方案

所以解决方案很简单,我们只是自己设置last_page var,给我们留下以下修改过的代码:

// 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-&gt; 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似乎没有对函数返回的错误进行任何处理]

希望这对某些人有所帮助。