Monday, August 22, 2016

How to add a ContactUs Form

Magento includes contact form functionality by default. A link to a contact form can usually be found in the footer of your Magento installation.
Of course, you can add a contact form on any page. All you need to do is:
  • Log in to the administrator area.
  • Go to CMS > Pages.
  • Select the page you want to edit or create a new page.
Paste the following code using the HTML option of the WYSIWYG editor:

<!– CONTACT FORM CODE BEGIN–>{{block type='core/template' name='contactForm' template='contacts/form.phtml'}}<!– CONTACT FORM CODE END–>

Save the changes and the contact form will appear on the desired page.

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;
}