Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamically create add to cart block for each final configurable option, Helper for $this

I am working on a project where on the product page instead of the normal configurable options, there are some configurable options and then the database is queried to see if particular vendors carry the product. It then displays the list of vendors via javascript as shown below.

enter image description here

I want the add to cart block to show up next to EACH vendor. Because this is all dynamically created, I had to pass the vendor ID to an "add to cart" script that I created. I took the original app/design/frontend/base/default/template/catalog/product/view/addtocart.phtml and made my own as seen below. The following php file is called via ajax. The original addtocart.phtml had a bunch of $this variables. I need to simulate $this (whatever model, helper its referring to) so that this block works. I am without much success. Can someone see what I am doing wrong or what I could do differently? Thanks so much!

<?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_Blockproduct_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>
like image 315
CaitlinHavener Avatar asked Oct 21 '22 12:10

CaitlinHavener


2 Answers

Mage_Catalog_Blockproduct_View is the error you're getting currently. Remember Magento class names are reflective of the directory structure.

I believe you are wanting Mage_Catalog_Block_Product_View

However, technically you would not want to initiate a block here, but I realize it is to get around the $this-> references. Also I would not reinitialize the full stack again. A better approach is to create a new module and use a custom controller for the add to cart action.

<?php
require_once Mage::getModuleDir('controllers', 'Mage_Checkout') . DS . 'CartController.php';

class NS_AjaxCart_CartController extends Mage_Checkout_CartController
{
    public function addAction()
    {
        $params = $this->getRequest()->getParams();
...

You would then create a new Block in your module with a simple constructor to set the template you are going to be using in your block. Similar to:

public function __construct()
{
        parent::__construct();
        $this->setTemplate('catalog/vendoraddtocart.phtml');
}

To dynamically create a block, as $this would be accessible:

$this->getLayout()->createBlock('cms/block')->setBlockId('vendor_add_to_cart')->toHtml()

Consider reading and better understand the toHtml method, and how blocks and layouts all work:

  • http://codemagento.com/2011/03/how-blocks-and-phtml-work-together/
  • http://adeptasoftware.co.uk/blog/magento-ajax-add-cart-extension/
  • http://store.pulsestorm.net/products/no-frills-magento-layout
  • http://www.excellencemagentoblog.com/magento-add-product-to-cart-ajax
  • Magento override controller

Hope this helps.

like image 107
B00MER Avatar answered Oct 24 '22 03:10

B00MER


$this->getProduct() return a product loaded from Mage_Catalog_Model_Product
So it not a registry So cant be used as Mage::registry('current_product')

Use something as

$_product = Mage::getModel('catalog/product')=>load(prodid)

Your approach seems wrong :(

like image 36
Sandeep Avatar answered Oct 24 '22 03:10

Sandeep