我正在从事一个项目,在产品页面上而不是普通配置的选项上,有一些可配置的选项,然后查询数据库以查看特定供应商是否携带产品。然后,它通过JavaScript显示供应商列表,如下所示。

enter image description here

我希望将添加到购物车块出现在每个供应商旁边。因为这些都是动态创建的,所以我必须将供应商ID传递给我创建的“添加到购物车”脚本。我采用了原始的应用程序/design/frontend/base/base/default/template/catalog/product/view/addtocart.phtml,并如下所示。以下PHP文件通过AJAX调用。原始的addtocart.phtml有一堆$ $ this变量。我需要模拟此$(无论是什么型号,指的是什么型号),以便该块有效。我没有太大的成功。有人可以看到我做错了什么,或者我能做些什么?非常感谢!

    <?php require_once('/var/www/Staging/public_html/app/Mage.php'); ?>
<?php umask(0); Mage::app();?>
<?php $value = $_POST['value'];?>

<?php $block = Mage::getModel('catalog/product');?>
<?php $_product =  Mage::registry('current_product'); ?>
<?php //if($_product->isSaleable()): ?>
    <div class="add-to-cart">
        <?php //if(!$_product->isGrouped()): ?>
        <label for="qty"><?php echo $block->__('Qty:') ?></label>
        <input type="text" name="qty" id="qty" maxlength="12" value="<?php echo $block->getProductDefaultQty() * 1 ?>" title="<?php echo $block->__('Qty') ?>" class="input-text qty" />
        <?php //endif; ?>
        <button type="button" title="<?php echo $buttonTitle ?>" class="button btn-cart" id='$value'><span><span><?php echo $buttonTitle ?></span></span></button>
        <?php echo $block->getChildHtml('', true, true) ?>
        </div>
    <?php //endif; ?>
有帮助吗?

解决方案

让我们扎根您要问的内容:

我需要模拟此$(无论是什么型号,指的是什么型号),以便该块有效。我没有太大的成功。

AddTocart.phtml视图通过App/design/frontend/base/base/default/layout/catalog.xml中的此XML声明来调用。

<block type="catalog/product_view" name="product.info.addtocart" as="addtocart" template="catalog/product/view/addtocart.phtml"/>

这意味着 $this 您指的是模型 catalog/product_view. 。假设没有重写,应转换为类文件 Mage_Catalog_Block_Product_View, ,在App/Code/Core/Mage/Catalog/Block/Product/View.php中找到。

因此,除此之外,您想要 $this 表现得好像是从块中调用的。假设您仍在使用通过Ajax称为的独立脚本,则应替换 $this$block - 将其作为上面引用的块模型的新实例加载。这可能会导致不希望的效果 - 例如 - $block->getProduct() 行不通。

编辑独立的addtocart.phtml:

根据您的编辑,我更新了此答案:

<?php

require_once('/var/www/Staging/public_html/app/Mage.php');
umask(0);
Mage::app();

//ensure that the value is legitimate
if($_POST && is_numeric($_POST['value'])){
    $value = $_POST['value'];
}

//pass this in your ajax call for the add button
if($_POST && is_numeric($_POST['product_id'])){
    $product_id = $_POST['product_id'];
}

$helper = Mage::helper('core'); //for translation
$block = new Mage_Catalog_Block_Product_View(); // not best practice, but neither are standalones
$product =  Mage::getModel('catalog/product')->load($product_id); // no need to use the _ here, it's not protected/private; additonally Mage::registry won't work because you're technically not on a product detail page

$buttonTitle = ''; //you are using this, but it isn't set

?>
<div class="add-to-cart">
    <label for="qty"><?php echo $helper->__('Qty:') ?></label>
    <input type="text" name="qty" id="qty" maxlength="12" value="<?php echo $block->getProductDefaultQty($product) * 1 ?>" title="<?php echo $helper->__('Qty') ?>" class="input-text qty" />
    <button onclick="window.location = '<?php echo Mage::helper('checkout/cart')->getAddUrl($product);?>'" type="button" title="<?php echo $buttonTitle ?>" class="button btn-cart" id='$value'><span><?php echo $buttonTitle ?></span></button>
</div>

其他一些想法:

您正在使用 $_GET['value'] - 不要接受用户未经过滤的输入。您将其直接放入添加到购物车按钮中。任何人都可以通过URL将其注入页面上。这就是称为XSS的 - 在此处阅读更多: http://phpmaster.com/php-security-cross-site-scripting-attacks-xss/

如果 $_GET['value'] 是您的供应商,请考虑使用 vendor - 语义。

我将如何实现这一点:

因此,您的方法不是 错误的, ,本身;它会起作用。但这就是我的方式:

  • 创建一个供应商插件
  • 创建一个自定义控制器操作,该操作参与 vendor, , 使用 $this->getRequest()->getParams() - 哪个邪恶的东西本地过滤
  • 将控制器的输出类型设置为文本/HTML,设置为没有脚本或布局元素(结构块等)的空白主题

或者,使用自己尝试做的事情的Unirgy Marketplace插件,而不是自己滚动,而是做得很好!

http://www.unirgy.com//products/umarketplace/magento-multi-dendor-marketplace

许可以下: CC-BY-SA归因
scroll top