Showing posts with label Magento 1. Show all posts
Showing posts with label Magento 1. Show all posts

Monday, August 22, 2016

Extending a Controller

Extending "Mage_Review_ProductController"

app/code/local/Primera/Review/etc/config.xml

<config>
    <frontend>
        <routers>
            <review>
                <args>
                    <modules>
                        <primera_review before="Mage_Review">Primera_Review</primera_review>
                    </modules>
                </args>
            </review>
        </routers>
    </frontend>
</config>

app/code/local/Primera/Review/controllers/ProductController.php

<?php
require_once 'Mage/Review/controllers/ProductController.php';

class Primera_Review_ProductController extends Mage_Review_ProductController
{
    /**     * Crops POST values     * @param array $reviewData     * @return array     */

    protected function _cropReviewData(array $reviewData)
    {
        $croppedValues = array();
        $allowedKeys = array_fill_keys(array('detail', 'title', 'nickname','email'), true);

        foreach ($reviewData as $key => $value) {
            if (isset($allowedKeys[$key])) {
                $croppedValues[$key] = $value;
            }
        }

        return $croppedValues;
    }
}


Set Sorting Direction / Order for a specifi Category when FPC is enabled


As we know, sorting option of a category is persistent on different categories. Which means if you select sorting option as "Price" for a Category 1 and go to Category 2 sorting option will be selected as "Price" though default sorting is selected as "Best Value".


Scenario:
Suppose there is a category as "New" and default category for "New" is "Product New from Date (news_from_date)" attribute.

When ever customer comes to New category, default sorting option should be selected as "New" (news_from_date), which means Sorting persistence should not affect New Category.

Step (1):
- Go to BO => Catalog => Categories => Manage Categories => Select Category "Niw"
- Under Display Settings Tab
---- Default Product Listing Sort By = "Set Product as New from Date"
- Under Custom Design Tab
---- Custom Layout Update:
 <reference name="product_list_toolbar">
  <action method="setDefaultDirection"><string>desc</string></action>
</reference>

Step (2):
app/code/local/ISM/New/etc/config.xml
<config>
<frontend>
    <events>
        <core_block_abstract_to_html_before>
            <observers>
                <ism_sorting_new_category>
                    <class>ism_new/observer</class>
                    <method>unsetSortingNewCategory</method>
                </ism_sorting_new_category>
            </observers>
        </core_block_abstract_to_html_before>
        <controller_action_postdispatch_catalog_category_view>
            <observers>
                <ism_disable_cache_for_new_category>
                    <class>ism_new/observer</class>
                    <method>disableCacheForNewCategory</method>
                </ism_disable_cache_for_new_category>
            </observers>
        </controller_action_postdispatch_catalog_category_view>
    </events>
</frontend>
</config>
Step (3):
app/code/local/ISM/New/Model/Observer.php
/** * Disable parameter memorizing and unset sorting order & category for category "Nieuwe"(New) * @param Varien_Event_Observer $observer * @return $this */
public function unsetSortingNewCategory(Varien_Event_Observer $observer)
{
    $block = $observer->getBlock();
    if ($block instanceof Mage_Catalog_Block_Product_List) {
        $category = Mage::registry('current_category');
        if ($category && $category->getDefaultSortBy() == 'news_from_date') {
            $sortingOrder = Mage::app()->getRequest()->getParam('order', false);
            $sortingDirection = Mage::app()->getRequest()->getParam('dir', false);

            if (!$sortingOrder && !$sortingDirection) {
                Mage::getSingleton('catalog/session')->unsSortOrder();
                Mage::getSingleton('catalog/session')->unsSortDirection();
            }
        }
    }

    return $this;
}

/** * Disable Cache for New (Nieuwe) category * @param Varien_Event_Observer $observer * @return $this */
public function disableCacheForNewCategory(Varien_Event_Observer $observer)
{
    $category = Mage::registry('current_category');

    if ($category && $category->getDefaultSortBy() == 'news_from_date') {
        $request = $observer->getEvent()->getControllerAction()->getRequest();
        $request->setParam('no_cache', true);
    }

    return $this;
}



Set Sorting Direction / Order for a specifi Category when FPC is enabled


As we know, sorting option of a category is persistent on different categories. Which means if you select sorting option as "Price" for a Category 1 and go to Category 2 sorting option will be selected as "Price" though default sorting is selected as "Best Value".


Scenario:
Suppose there is a category as "New" and default category for "New" is "Product New from Date (news_from_date)" attribute.

When ever customer comes to New category, default sorting option should be selected as "New" (news_from_date), which means Sorting persistence should not affect New Category.

Step (1):
- Go to BO => Catalog => Categories => Manage Categories => Select Category "Niw"
- Under Display Settings Tab
---- Default Product Listing Sort By = "Set Product as New from Date"
- Under Custom Design Tab
---- Custom Layout Update:
 <reference name="product_list_toolbar">
  <action method="setDefaultDirection"><string>desc</string></action>
</reference>

Step (2):
app/code/local/ISM/New/etc/config.xml
<config>
<frontend>
    <events>
        <core_block_abstract_to_html_before>
            <observers>
                <ism_sorting_new_category>
                    <class>ism_new/observer</class>
                    <method>unsetSortingNewCategory</method>
                </ism_sorting_new_category>
            </observers>
        </core_block_abstract_to_html_before>
        <controller_action_postdispatch_catalog_category_view>
            <observers>
                <ism_disable_cache_for_new_category>
                    <class>ism_new/observer</class>
                    <method>disableCacheForNewCategory</method>
                </ism_disable_cache_for_new_category>
            </observers>
        </controller_action_postdispatch_catalog_category_view>
    </events>
</frontend>
</config>
Step (3):
app/code/local/ISM/New/Model/Observer.php
/** * Disable parameter memorizing and unset sorting order & category for category "Nieuwe"(New) * @param Varien_Event_Observer $observer * @return $this */
public function unsetSortingNewCategory(Varien_Event_Observer $observer)
{
    $block = $observer->getBlock();
    if ($block instanceof Mage_Catalog_Block_Product_List) {
        $category = Mage::registry('current_category');
        if ($category && $category->getDefaultSortBy() == 'news_from_date') {
            $sortingOrder = Mage::app()->getRequest()->getParam('order', false);
            $sortingDirection = Mage::app()->getRequest()->getParam('dir', false);

            if (!$sortingOrder && !$sortingDirection) {
                Mage::getSingleton('catalog/session')->unsSortOrder();
                Mage::getSingleton('catalog/session')->unsSortDirection();
            }
        }
    }

    return $this;
}

/** * Disable Cache for New (Nieuwe) category * @param Varien_Event_Observer $observer * @return $this */
public function disableCacheForNewCategory(Varien_Event_Observer $observer)
{
    $category = Mage::registry('current_category');

    if ($category && $category->getDefaultSortBy() == 'news_from_date') {
        $request = $observer->getEvent()->getControllerAction()->getRequest();
        $request->setParam('no_cache', true);
    }

    return $this;
}



Unset Sorting & Disable Cache for Newest Product Category

Recently we had a requirement to always show a particular Sorting Option (Newest Products - news_from_date) for a particular category page. (New Products)


We faced two issues.

(1) Sorting is Not always set to "newest products" sorting option when pointing back from different category.

This occurs when a customer selects a different sorting option on different category and moving back to Newest Product Category, products will sort according to the previously selected sorting option.

(2) Sorting is Not reset even after clearing parameters passing in Url on Newest Product Category.

Ex:
http://site_url/newest/?dir=asc&order=position

Even after clearing the GET params passing over URL, the sorting is Not reset for "newest_from_date" option.

These issue are specific to Magento Enterprise edition.

We can simply overcome the above two issues with following development.

In app/code/local/<package>/<module_name>/etc/config.xml file:
(app/code/local/ISM/New/etc/config.xml)
 <config>   
    <frontend>
        <events>
            <core_block_abstract_to_html_before>
                <observers>
                    <ism_sorting_new_category>
                        <class>ism_new/observer</class>
                        <method>unsetSortingNewCategory</method>
                    </ism_sorting_new_category>
                </observers>
            </core_block_abstract_to_html_before>
            <controller_action_postdispatch_catalog_category_view>
                <observers>
                    <ism_disable_cache_for_new_category>
                        <class>ism_new/observer</class>
                        <method>disableCacheForNewCategory</method>
                    </ism_disable_cache_for_new_category>
                </observers>
            </controller_action_postdispatch_catalog_category_view>
        </events>
    </frontend>
</config>


In app/code/local/<package>/<module_name>/Model/Observer.php file:
(app/code/local/ISM/New/Model/Observer.php)
/** 
* Disable parameter memorizing and unset sorting order & category for New(Nieuwe) category 
* @param Varien_Event_Observer $observer 
* @return $this 
*/
public function unsetSortingNewCategory(Varien_Event_Observer $observer)
{
    $block = $observer->getBlock();
    if ($block instanceof Mage_Catalog_Block_Product_List) {
        $category = Mage::registry('current_category');
        if ($category && $category->getDefaultSortBy() == 'news_from_date') {
            $sortingOrder = Mage::app()->getRequest()->getParam('order', false);
            $sortingDirection = Mage::app()->getRequest()->getParam('dir', false);

            if (!$sortingOrder && !$sortingDirection) {
                Mage::getSingleton('catalog/session')->unsSortOrder();
                Mage::getSingleton('catalog/session')->unsSortDirection();
            }
        }
    }

    return $this;
}

/** 
* Disable Cache for New (Nieuwe) category 
* @param Varien_Event_Observer $observer 
* @return $this 
*/
public function disableCacheForNewCategory(Varien_Event_Observer $observer)
{
    $category = Mage::registry('current_category');

    if ($category && $category->getDefaultSortBy() == 'news_from_date') {
        $request = $observer->getEvent()->getControllerAction()->getRequest();
        $request->setParam('no_cache', true);
    }

    return $this;
}




Unset Sorting & Disable Cache for Newest Product Category

Recently we had a requirement to always show a particular Sorting Option (Newest Products - news_from_date) for a particular category page. (New Products)


We faced two issues.

(1) Sorting is Not always set to "newest products" sorting option when pointing back from different category.

This occurs when a customer selects a different sorting option on different category and moving back to Newest Product Category, products will sort according to the previously selected sorting option.

(2) Sorting is Not reset even after clearing parameters passing in Url on Newest Product Category.

Ex:
http://site_url/newest/?dir=asc&order=position

Even after clearing the GET params passing over URL, the sorting is Not reset for "newest_from_date" option.

These issue are specific to Magento Enterprise edition.

We can simply overcome the above two issues with following development.

In app/code/local/<package>/<module_name>/etc/config.xml file:
(app/code/local/ISM/New/etc/config.xml)
 <config>   
    <frontend>
        <events>
            <core_block_abstract_to_html_before>
                <observers>
                    <ism_sorting_new_category>
                        <class>ism_new/observer</class>
                        <method>unsetSortingNewCategory</method>
                    </ism_sorting_new_category>
                </observers>
            </core_block_abstract_to_html_before>
            <controller_action_postdispatch_catalog_category_view>
                <observers>
                    <ism_disable_cache_for_new_category>
                        <class>ism_new/observer</class>
                        <method>disableCacheForNewCategory</method>
                    </ism_disable_cache_for_new_category>
                </observers>
            </controller_action_postdispatch_catalog_category_view>
        </events>
    </frontend>
</config>


In app/code/local/<package>/<module_name>/Model/Observer.php file:
(app/code/local/ISM/New/Model/Observer.php)
/** 
* Disable parameter memorizing and unset sorting order & category for New(Nieuwe) category 
* @param Varien_Event_Observer $observer 
* @return $this 
*/
public function unsetSortingNewCategory(Varien_Event_Observer $observer)
{
    $block = $observer->getBlock();
    if ($block instanceof Mage_Catalog_Block_Product_List) {
        $category = Mage::registry('current_category');
        if ($category && $category->getDefaultSortBy() == 'news_from_date') {
            $sortingOrder = Mage::app()->getRequest()->getParam('order', false);
            $sortingDirection = Mage::app()->getRequest()->getParam('dir', false);

            if (!$sortingOrder && !$sortingDirection) {
                Mage::getSingleton('catalog/session')->unsSortOrder();
                Mage::getSingleton('catalog/session')->unsSortDirection();
            }
        }
    }

    return $this;
}

/** 
* Disable Cache for New (Nieuwe) category 
* @param Varien_Event_Observer $observer 
* @return $this 
*/
public function disableCacheForNewCategory(Varien_Event_Observer $observer)
{
    $category = Mage::registry('current_category');

    if ($category && $category->getDefaultSortBy() == 'news_from_date') {
        $request = $observer->getEvent()->getControllerAction()->getRequest();
        $request->setParam('no_cache', true);
    }

    return $this;
}




Sunday, April 10, 2016

Set different sorting direction for a Category

In here following code can be used for 2 purposes.
  1. Set default direction of the Sorting on a particular Category
  2. Disable parameter memorizing and reset sorting when moving to different Category
NOTE:
Following options will NOT work when Full Page Cache (FPC) is enabled in Enterprise version.
This issue will address on different blog post.

Option 01:
Put the following code either in local.xml or catalog.xml

<layout version="0.1.0">
    <default>
        <catalog_category_default translate="label">
            <reference name="product_list_toolbar">
                <action method="setDefaultDirection"><string>desc</string></action>
                <action method="disableParamsMemorizing" />
            </reference>
        </catalog_category_default>
    </default>
</layout>


Option 02:
Go to Catalog => Categories and select the Category you want to set default direction. Under "Custom Design => Custom Layout Update" add the following content.
<reference name="product_list_toolbar">
    <action method="setDefaultDirection"><string>desc</string></action>
    <action method="disableParamsMemorizing" />
</reference>


Monday, January 18, 2016

Adding CMS Static Block to Footer

Add following content on local.xml


<layout>
    <default>
        <reference name="head">
            <action method="addItem">
              <type>skin_js</type><name>js/ism/string-truncate.js</name>
           </action>
        </reference>
        <reference name="footer">
            <block type="cms/block" name="footer_shipping_icon" as="footer_shipping_icon">
                <action method="setBlockId">
                    <block_id>footer_shipping_icon</block_id>
                </action>
            </block>
        </reference>
    </default>
</layout>
Call the CMS/Block on PHTML file. (ex: footer.phtml)
<div class="footer-shipping-icon">
    <?php echo $this->getChildHtml('footer_shipping_icon'); ?></div>

Wednesday, January 13, 2016

Delete Product Attribute Programatically

<?phpdefine('MAGENTO_ROOT', getcwd());
$mageFilename = MAGENTO_ROOT . '/app/Mage.php';
require_once $mageFilename;
Mage::setIsDeveloperMode(true);
ini_set('display_errors', 1);
Mage::app();

echo "Begining...."."\n";
try{
$model = new Mage_Eav_Model_Entity_Setup('core_setup');
// your attribute code here
$attribute_id = 'salelabel'
// Remove Product Attribute
$model->removeAttribute('catalog_product', $attribute_id);
echo "Done"."\n";
}catch(Exception $e)
{
  echo "An exception occured.".$e->getMessage();      
}
echo "Ending...."."\n";

Re-index Magento via SSH

How to do:
1. Login to Server using SSH
> pwd
> ls -al

2. Move to ROOT/shell folder
> cd shell/
> ls -al

3. Get help from “indexer.php” script
> php -f indexer.php help

4. Get the list of indexers which you can execute
> php -f indexer.php info

Ex:
catalog_product_attribute     Product Attributes
catalog_product_price         Product Prices
//===============================================
catalog_url                   Catalog Url Rewrites
//===============================================
catalog_product_flat          Product Flat Data
catalog_category_flat         Category Flat Data
catalog_category_product      Category Products
catalogsearch_fulltext        Catalog Search Index
cataloginventory_stock        Stock status

cataloginventory_stock        Stock Status
catalog_product_price         Catalog product price
catalog_url_category          Category URL Rewrites
catalog_url_product           Product URL Rewrites
//===============================================
url_redirect                  URL Redirects
//===============================================
catalog_category_product      Catalog Category/Product Index
catalogsearch_fulltext        Catalog Search Index
tag_summary                   Tag Aggregation Data
catalog_product_attribute     Product Attributes


5. you can reindex any of the indexers one by one.
> php indexer.php --reindex   <<reindexer_name>>
Ex:
> php indexer.php --reindex catalog_url_category

6. If you want to reindex everything at once, use the below command
> php indexer.php -reindexall

Run Magento Cron programatically

<?php
define('MAGENTO_ROOT', getcwd());
$mageFilename = MAGENTO_ROOT . '/app/Mage.php';
require_once $mageFilename;
Mage::setIsDeveloperMode(true);
ini_set('display_errors', 1);
Mage::app();

echo "Begining...."."\n";
try{
$observer = Mage::getModel("ism_import/cron_stock");
$vall = $observer->importStock();
print_r($vall);
}catch(Exception $e)
{
  echo "An exception occured.".$e->getMessage();      
}
echo "Ending...."."\n";

Install Script to add Product "Drop down" attribute

<?php
/* @var $model Mage_Eav_Model_Entity_Setup */$model = Mage::getModel('eav/entity_setup','core_setup');

$model->startSetup();

$data = array(
    'type'              =>  'varchar',
    'input'             =>  'select',
    'label'             =>  'Sale Label',
    'global'            =>  Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_WEBSITE,
    'required'          =>  '0',
    'comparable'        =>  '0',
    'searchable'        =>  '0',
    'is_unique'         =>  '1',
    'is_configurable'   =>  '1',
    'user_defined'      =>  true,
    'group'             =>  'Kixx online',
    'attribute_set'     =>  'Producten');

$model->addAttribute('catalog_product', 'salelabel', $data);


$attributeId        =   $model->getAttribute('catalog_product','salelabel');
$attributeSetId     =   $model->getAttributeSetId('catalog_product','Producten');
/** Get attribute group info */$attributeGroupId   =   $model->getAttributeGroup('catalog_product',$attributeSetId,'Kixx online');
/** Add attribute to a set */$model->addAttributeToSet('catalog_product',$attributeSetId,$attributeGroupId,$attributeId);

$model->endSetup();

Set Base Image on Thumbnail Image

<?php
require_once '../app/Mage.php';

Mage::setIsDeveloperMode(true);
ini_set('display_errors', 1);
umask(0);
Mage::app('admin');

Mage::register('isSecureArea', 1);
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

set_time_limit(0);
ini_set('memory_limit','1024M');

$connection = Mage::getSingleton('core/resource')->getConnection('core_write');

$sqlSp = "select entity_id from catalog_product_entity_varchar where `value` like '%https:%' and attribute_id = 87";
$res = $connection->fetchAll($sqlSp);

foreach ($res as $v) {
    $entityID = $v["entity_id"];
    $sqlURL = "select `value` from catalog_product_entity_varchar where entity_id = ? and attribute_id = 86";
    $url = $connection->fetchOne($sqlURL, $entityID);
    echo $entityID . " - " . $url . PHP_EOL;
    $sqlUpdte = "UPDATE catalog_product_entity_varchar SET `value` = ? where entity_id = ? and attribute_id = 87";
    $connection->query($sqlUpdte, array($url, $entityID));
}