如何根据在magento产品表单中选择的国家/地区添加状态下拉列表

时间:2013-08-03 06:37:27

标签: magento magento-1.7

嗨我想显示基于管理员中magento产品的国家/地区选择的状态下拉,请任何人知道如何做到这一点。我用Google搜索但是徒劳无功。

4 个答案:

答案 0 :(得分:7)

Sunel.please检查它可以帮助你的休闲解决方案。

打开Yournamespace/Modulename/Block/Adminhtml/Modulename/Edit/Tab/Form.php中的表单,然后添加以下字段

$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>");

现在在modulenamecontroller.php文件中创建状态操作,就像这样

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

true

答案 3 :(得分:-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>");