动态创建每个最终可配置选项的添加到购物车块
-
16-10-2019 - |
题
我正在从事一个项目,在产品页面上而不是普通配置的选项上,有一些可配置的选项,然后查询数据库以查看特定供应商是否携带产品。然后,它通过JavaScript显示供应商列表,如下所示。
我希望将添加到购物车块出现在每个供应商旁边。因为这些都是动态创建的,所以我必须将供应商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