Sunel
Sunel

Reputation: 51

How to add state drop down based on country selected in magento product form

Hi i want to display state drop down based on country select in magento product from in admin can any one please given an idea how to do this.i have googled it but in vain .

Upvotes: 2

Views: 11811

Answers (4)

rishbah
rishbah

Reputation: 1

    Hi Santosh Pal Sir...
    i am writing my whole code , please try it on your system... When i  choose country then loding process is complete but no value is feteching in the state dropdown.
    **app/code/local/Mage/Adminhtml/Block/Customer/Edit/Tab/Account.php** ,please find my custome code
    <?php

    class Mage_Adminhtml_Block_Customer_Edit_Tab_Account extends Mage_Adminhtml_Block_Widget_Form
   {
      /**
           * Initialize block
        */
public function __construct()
{
    parent::__construct();
}

/**
 * Initialize form
 *
 * @return Mage_Adminhtml_Block_Customer_Edit_Tab_Account
 */
public function initForm()
{
    $form = new Varien_Data_Form();
    $form->setHtmlIdPrefix('_account');
    $form->setFieldNameSuffix('account');

    $customer = Mage::registry('current_customer');

    /** @var $customerForm Mage_Customer_Model_Form */
    $customerForm = Mage::getModel('customer/form');
    $customerForm->setEntity($customer)
        ->setFormCode('adminhtml_customer')
        ->initDefaultValues();

    $fieldset = $form->addFieldset('base_fieldset', array(
        'legend' => Mage::helper('customer')->__('Account Information')
    ));

    $attributes = $customerForm->getAttributes();
    foreach ($attributes as $attribute) {
        /* @var $attribute Mage_Eav_Model_Entity_Attribute */
         $attribute->setFrontendLabel(Mage::helper('customer')->__($attribute->getFrontend()->getLabel()));
        $attribute->unsIsVisible();
    }

    $disableAutoGroupChangeAttributeName = 'disable_auto_group_change';
    $this->_setFieldset($attributes, $fieldset, array($disableAutoGroupChangeAttributeName));

    $form->getElement('group_id')->setRenderer($this->getLayout()
        ->createBlock('adminhtml/customer_edit_renderer_attribute_group')
        ->setDisableAutoGroupChangeAttribute($customerForm->getAttribute($disableAutoGroupChangeAttributeName))
        ->setDisableAutoGroupChangeAttributeValue($customer->getData($disableAutoGroupChangeAttributeName)));

    if ($customer->getId()) {
        $form->getElement('website_id')->setDisabled('disabled');
        $form->getElement('created_in')->setDisabled('disabled');
    } else {
        $fieldset->removeField('created_in');
        $form->getElement('website_id')->addClass('validate-website-has-store');

        $websites = array();
        foreach (Mage::app()->getWebsites(true) as $website) {
            $websites[$website->getId()] = !is_null($website->getDefaultStore());
        }
        $prefix = $form->getHtmlIdPrefix();

        $form->getElement('website_id')->setAfterElementHtml(
            '<script type="text/javascript">'
            . "
            var {$prefix}_websites = " . Mage::helper('core')->jsonEncode($websites) .";
            Validation.add(
                'validate-website-has-store',
                '" . Mage::helper('customer')->__('Please select a website which contains store view') . "',
                function(v, elem){
                    return {$prefix}_websites[elem.value] == true;
                }
            );
            Element.observe('{$prefix}website_id', 'change', function(){
                Validation.validate($('{$prefix}website_id'))
            }.bind($('{$prefix}website_id')));
            "
            . '</script>'
        );
    }
    $renderer = $this->getLayout()->createBlock('adminhtml/store_switcher_form_renderer_fieldset_element');
    $form->getElement('website_id')->setRenderer($renderer);

  //        if (Mage::app()->isSingleStoreMode()) {
  //            $fieldset->removeField('website_id');
 //            $fieldset->addField('website_id', 'hidden', array(
 //                'name'      => 'website_id'
  //            ));
    //             $customer->setWebsiteId(Mage::app()->getStore(true)->getWebsiteId());
    //        }

    $customerStoreId = null;
    if ($customer->getId()) {
        $customerStoreId = Mage::app()->getWebsite($customer->getWebsiteId())->getDefaultStore()->getId();
    }

    $prefixElement = $form->getElement('prefix');
    if ($prefixElement) {
        $prefixOptions = $this->helper('customer')->getNamePrefixOptions($customerStoreId);
        if (!empty($prefixOptions)) {
            $fieldset->removeField($prefixElement->getId());
            $prefixField = $fieldset->addField($prefixElement->getId(),
                'select',
                $prefixElement->getData(),
                $form->getElement('group_id')->getId()
            );
            $prefixField->setValues($prefixOptions);
            if ($customer->getId()) {
                $prefixField->addElementValues($customer->getPrefix());
            }

        }
    }

    $suffixElement = $form->getElement('suffix');
    if ($suffixElement) {
        $suffixOptions = $this->helper('customer')->getNameSuffixOptions($customerStoreId);
        if (!empty($suffixOptions)) {
            $fieldset->removeField($suffixElement->getId());
            $suffixField = $fieldset->addField($suffixElement->getId(),
                'select',
                $suffixElement->getData(),
                $form->getElement('lastname')->getId()
            );
            $suffixField->setValues($suffixOptions);
            if ($customer->getId()) {
                $suffixField->addElementValues($customer->getSuffix());
            }
        }
    }


  // my Custome code for country and state  

    $country = $fieldset->addField('country', 'select', array(

        'name' => 'country',

        'label' => Mage::helper('customer')->__('Country'),

        'values' => Mage::getModel('adminhtml/system_config_source_country')->toOptionArray(),

        'class' => 'required-entry',

        'required' => true,

        'onchange' => 'getstate(this)',

    ));



     //Edit action pass your custom table to country id and get state

    $storeId = $this->getRequest()->getParam('id');

    if ($storeId != ''):

        $editState = $stateCollection = Mage::getModel('directory/region')->load($storeId);

        $stateCollection = Mage::getModel('directory/region')->getResourceCollection()->addCountryFilter($editState->getCountry())->load();

        $state = "";

        foreach ($stateCollection as $_state) {

            $state[] = array('value' => $_state->getCode(), 'label' => $_state->getDefaultName());

        }

        $fieldset->addField('state', 'select', array(

            'label' => Mage::helper('customer')->__('State'),

            'required' => false,

            'name' => 'state',

            'selected' => 'selected',

            'values' => $state,

        ));

    else:

        //New action

        $fieldset->addField('state', 'select', array(

            'name' => 'state',

            'required' => false,

            'label' => Mage::helper('customer')->__('State'),

            'values' => '--Please Select Country--',

        ));

    endif;

   $url = Mage::getBaseUrl();
    $country->setAfterElementHtml("<script type=\"text/javascript\">
     function getstate(selectElement){
    var reloadurl = '".$url.'admin/customer/state/' . "country/' + selectElement.value;
    new Ajax.Request(reloadurl, {
        method: 'POST',
        onComplete: function(){
        },
        success: function (response) {
        alert(response)
        }
    });
   }
     </script>");

    /*



    /* end my code country and state
       */    




    if ($customer->getId()) {
        if (!$customer->isReadonly()) {
            // Add password management fieldset
            $newFieldset = $form->addFieldset(
                'password_fieldset',
                array('legend' => Mage::helper('customer')->__('Password Management'))
            );
            // New customer password
            $field = $newFieldset->addField('new_password', 'text',
                array(
                    'label' => Mage::helper('customer')->__('New Password'),
                    'name'  => 'new_password',
                    'class' => 'validate-new-password'
                )
            );
             $field->setRenderer($this->getLayout()->createBlock('adminhtml/customer_edit_renderer_newpass'));

            // Prepare customer confirmation control (only for existing customers)
            $confirmationKey = $customer->getConfirmation();
            if ($confirmationKey || $customer->isConfirmationRequired()) {
                $confirmationAttribute = $customer->getAttribute('confirmation');
                if (!$confirmationKey) {
                    $confirmationKey = $customer->getRandomConfirmationKey();
                }
                $element = $fieldset->addField('confirmation', 'select', array(
                    'name'  => 'confirmation',
                    'label' => Mage::helper('customer')->__($confirmationAttribute->getFrontendLabel()),
                ))->setEntityAttribute($confirmationAttribute)
                    ->setValues(array('' => 'Confirmed', $confirmationKey => 'Not confirmed'));

                // Prepare send welcome email checkbox if customer is not confirmed
                // no need to add it, if website ID is empty
                if ($customer->getConfirmation() && $customer->getWebsiteId()) {
                    $fieldset->addField('sendemail', 'checkbox', array(
                        'name'  => 'sendemail',
                        'label' => Mage::helper('customer')->__('Send Welcome Email after Confirmation')
                    ));
                    $customer->setData('sendemail', '1');
                }
            }
        }
    } else {
        $newFieldset = $form->addFieldset(
            'password_fieldset',
            array('legend'=>Mage::helper('customer')->__('Password Management'))
        );
        $field = $newFieldset->addField('password', 'text',
            array(
                'label' => Mage::helper('customer')->__('Password'),
                'class' => 'input-text required-entry validate-password',
                'name'  => 'password',
                'required' => true
            )
        );
        $field->setRenderer($this->getLayout()->createBlock('adminhtml/customer_edit_renderer_newpass'));

        // Prepare send welcome email checkbox
        $fieldset->addField('sendemail', 'checkbox', array(
            'label' => Mage::helper('customer')->__('Send Welcome Email'),
            'name'  => 'sendemail',
            'id'    => 'sendemail',
        ));
        $customer->setData('sendemail', '1');
        if (!Mage::app()->isSingleStoreMode()) {
            $fieldset->addField('sendemail_store_id', 'select', array(
                'label' => $this->helper('customer')->__('Send From'),
                'name' => 'sendemail_store_id',
                'values' => Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm()
            ));
        }
    }

    // Make sendemail and sendmail_store_id disabled if website_id has empty value
    $isSingleMode = Mage::app()->isSingleStoreMode();
    $sendEmailId = $isSingleMode ? 'sendemail' : 'sendemail_store_id';
    $sendEmail = $form->getElement($sendEmailId);

    $prefix = $form->getHtmlIdPrefix();
    if ($sendEmail) {
        $_disableStoreField = '';
        if (!$isSingleMode) {
            $_disableStoreField = "$('{$prefix}sendemail_store_id').disabled=(''==this.value || '0'==this.value);";
        }
        $sendEmail->setAfterElementHtml(
            '<script type="text/javascript">'
            . "
            $('{$prefix}website_id').disableSendemail = function() {
                $('{$prefix}sendemail').disabled = ('' == this.value || '0' == this.value);".
                $_disableStoreField
            ."}.bind($('{$prefix}website_id'));
            Event.observe('{$prefix}website_id', 'change', $('{$prefix}website_id').disableSendemail);
            $('{$prefix}website_id').disableSendemail();
            "
            . '</script>'
        );
    }

    if ($customer->isReadonly()) {
        foreach ($customer->getAttributes() as $attribute) {
            $element = $form->getElement($attribute->getAttributeCode());
            if ($element) {
                $element->setReadonly(true, true);
            }
        }
    }

    $form->setValues($customer->getData());
    $this->setForm($form);
    return $this;
}

   /**
    * Return predefined additional element types
    *
   * @return array
   */
   protected function _getAdditionalElementTypes()
    {
    return array(
        'file'      => Mage::getConfig()->getBlockClassName('adminhtml/customer_form_element_file'),
        'image'     => Mage::getConfig()->getBlockClassName('adminhtml/customer_form_element_image'),
        'boolean'   => Mage::getConfig()->getBlockClassName('adminhtml/customer_form_element_boolean'),
    );
}

}

    ////////////////////////////////////////////////////////////////////// Now i    add stateAction() in 
app/code/core/Mage/Adminhtml/controllers/CustomerController.php, just  after saveAction() method finish 


  public function stateAction() {
   $countrycode = $this->getRequest()->getParam('country');
   $state = "<option value=''>Please Select</option>";
    if ($countrycode != '') {
    $statearray =  Mage::getModel('directory/region')->getResourceCollection() ->addCountryFilter('US')->load();
    foreach ($statearray as $_state) {
        $state .= "<option value='" . $_state->getCode() . "'>" .  $_state->getDefaultName() . "</option>";
           }
        }
    echo $state;
      }

Upvotes: 0

Santosh Pal
Santosh Pal

Reputation: 1

/*
* Add Ajax to the Country select box html output
*/
$url = Mage::getBaseUrl();
$country->setAfterElementHtml("<script type=\"text/javascript\">
    function getstate(selectElement){
        var reloadurl = '".$url.'admin/customer/state/' . "country/' + selectElement.value;
        new Ajax.Request(reloadurl, {
            method: 'POST',
            onComplete: function(){
            },
            success: function (response) {
            alert(response)
            }
        });
    }
</script>");

Upvotes: 0

Rishabh
Rishabh

Reputation: 1

//        if (Mage::app()->isSingleStoreMode()) {
//            $fieldset->removeField('website_id');
//            $fieldset->addField('website_id', 'hidden', array(
//                'name'      => 'website_id'
//            ));
//            $customer->setWebsiteId(Mage::app()->getStore(true)->getWebsiteId());
//        }
//        $fieldset->addField('country', 'select', array(
//                            'name'  => 'country',
//                            'label' => 'Country',
//                            'values' => Mage::getModel('adminhtml/system_config_source_country')->toOptionArray(),  
//            ));
//       
//        $fieldset->addField('state', 'select', array(
//            'name'  => 'state',
//            'label'     => 'State',
//            'values'    => Mage::getModel('adminhtml/system_config_source_region')->getResourceCollection(),
//        ));

 

        $country = $fieldset->addField('country', 'select', array(

            'name' => 'country',

            'label' => Mage::helper('customer')->__('Country'),

            'values' => Mage::getModel('adminhtml/system_config_source_country')->toOptionArray(),

            'class' => 'required-entry',

            'required' => true,

            'onchange' => 'getstate(this)',

        ));

 

//Edit action pass your custom table to country id and get state

        $storeId = $this->getRequest()->getParam('id');

        if ($storeId != ''):

            $editState = $stateCollection = Mage::getModel('directory/region')->load($storeId);

            $stateCollection = Mage::getModel('directory/region')->getResourceCollection()->addCountryFilter($editState->getCountry())->load();

            $state = "";

            foreach ($stateCollection as $_state) {

                $state[] = array('value' => $_state->getCode(), 'label' => $_state->getDefaultName());

            }

            $fieldset->addField('state', 'select', array(

                'label' => Mage::helper('customer')->__('State'),

                'required' => false,

                'name' => 'state',

                'selected' => 'selected',

                'values' => $state,

            ));

        else:

            //New action

            $fieldset->addField('state', 'select', array(

                'name' => 'state',

                'required' => false,

                'label' => Mage::helper('customer')->__('State'),

                'values' => '--Please Select Country--',

            ));

        endif;

       

        /*

        * Add Ajax to the Country select box html output

        */

        $country->setAfterElementHtml("<script type=\"text/javascript\">

            function getstate(selectElement){

                var reloadurl = '". $this->getUrl('adminhtml_customer/state') . "country/' + selectElement.value;

                new Ajax.Request(reloadurl, {

                    method: 'get',

                    onComplete: function(transport){

                        var response = transport.responseText;

                        $('storelocatorstate').update(response);

                    }

                });

            }

        </script>");

Upvotes: -1

Manju
Manju

Reputation: 765

Sunel.please check the fallowing solution it may help you.

Open your form which is in Yournamespace/Modulename/Block/Adminhtml/Modulename/Edit/Tab/Form.php then add below fields

$country = $fieldset->addField('country', 'select', array(
            'name'  => 'country',
            'label'     => 'Country',
            'values'    => Mage::getModel('adminhtml/system_config_source_country') ->toOptionArray(),
            'onchange' => 'getstate(this)',
        ));

$fieldset->addField('state', 'select', array(
            'name'  => 'state',
            'label'     => 'State',
            'values'    => Mage::getModel('modulename/modulename')->getstate('AU'),
        ));

         /*
         * Add Ajax to the Country select box html output
         */
        $country->setAfterElementHtml("<script type=\"text/javascript\">
            function getstate(selectElement){
                var reloadurl = '". $this->getUrl('modulename/adminhtml_modulename/state') . "country/' + selectElement.value;
                new Ajax.Request(reloadurl, {
                    method: 'get',
                    onLoading: function (stateform) {
                        $('state').update('Searching...');
                    },
                    onComplete: function(stateform) {
                        $('state').update(stateform.responseText);
                    }
                });
            }
        </script>");

Now Create State Action in modulenamecontroller.php file which will be like this

public function stateAction() {
    $countrycode = $this->getRequest()->getParam('country');
    $state = "<option value=''>Please Select</option>";
    if ($countrycode != '') {
        $statearray = Mage::getModel('directory/region')->getResourceCollection() ->addCountryFilter($countrycode)->load();
        foreach ($statearray as $_state) {
            $state .= "<option value='" . $_state->getCode() . "'>" .  $_state->getDefaultName() . "</option>";
        }
    }
    echo $state;
}

thank you.

Upvotes: 8

Related Questions