Reputation: 51
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
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
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
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
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