嗨我想显示基于管理员中magento产品的国家/地区选择的状态下拉,请任何人知道如何做到这一点。我用Google搜索但是徒劳无功。
答案 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>");