Magento:在管理运输模块中获取国家/地区的区域列表

时间:2011-06-15 09:06:53

标签: magento

目前在我的/etc/system.xml文件中,我可以使用它来浏览存储在Magento中的完整区域列表,并将它们显示为多选。这样可以正常工作,但我更愿意只浏览一个国家的地区,例如英国各州或美国各州:

                    <counties translate="label">
                        <label>Counties</label>
                        <frontend_type>multiselect</frontend_type>
                        <sort_order>10</sort_order>
                        <source_model>adminhtml/system_config_source_allregion</source_model>
                        <show_in_default>1</show_in_default>
                        <show_in_website>1</show_in_website>
                        <show_in_store>1</show_in_store>
                    </counties>

原因是我在系统上添加了很多地区/州/县,现在它不是一个非常友好的多选框。

更新

在没有立即对下面提供的解决方案采取行动之后,我在一段时间后重新审视了这个问题,并根据所提供的答案将我自己的解决方案整合在一起。

我将app / code / core / Mage / Adminhtml / Model / System / Config / Source / Allregion.php复制到app / code / core / Mage / Adminhtml / Model / System / Config / Source / Ukregion.php

然后我将类定义更改为Mage_Adminhtml_Model_System_Config_Source_Ukregion。

然后我改变了:

        $regionsCollection = Mage::getResourceModel('directory/region_collection')->load();

包含国家/地区过滤器:

        $regionsCollection = Mage::getResourceModel('directory/region_collection')->addCountryFilter('GB')->load();

我现在得到英国的县(我必须自己编辑,但这是一个不同的故事式 - magento问题)。

最后我改变了我的system.xml:

                    <counties translate="label">
                        <label>Counties</label>
                        <frontend_type>multiselect</frontend_type>
                        <sort_order>10</sort_order>
                        <source_model>adminhtml/system_config_source_ukregion</source_model>
                        <show_in_default>1</show_in_default>
                        <show_in_website>1</show_in_website>
                        <show_in_store>1</show_in_store>
                    </counties>

使用'UK'代替'GB'完全是故意的 - GB不包括它仅用于“遗留原因”的NI县。 “英国”确实包括北爱尔兰,我的县名单也是如此。

2 个答案:

答案 0 :(得分:4)

查看页面系统&gt;配置&gt;送货设置,您可以重新创建区域的调整方式以匹配所选国家/地区。

现在查看文件app/code/core/Mage/Shipping/etc/system.xml。国家和地区字段如下所示:

<country_id translate="label">
    <label>Country</label>
    <frontend_type>select</frontend_type>
    <frontend_class>countries</frontend_class>
    <source_model>adminhtml/system_config_source_country</source_model>
    <sort_order>10</sort_order>
    <show_in_default>1</show_in_default>
    <show_in_website>1</show_in_website>
    <show_in_store>0</show_in_store>
</country_id>
<region_id translate="label">
    <label>Region/State</label>
    <frontend_type>text</frontend_type>
    <sort_order>20</sort_order>
    <show_in_default>1</show_in_default>
    <show_in_website>1</show_in_website>
    <show_in_store>0</show_in_store>
</region_id>

重要的部分是:

  • 该国家/地区的类别为countries,ID为country_id
  • 该地区的ID为region_id
  • 该区域不是选区,也没有源模型。

javascript已经存在于配置页面中。它找到类countries的元素,并使用它的ID来查找类似命名的元素(区域)。当第一个元素发生变化时,第二个元素由AJAX更新。

过去使用此功能时,如果页面上有多个国家/地区对,则有时会出现问题,因此最好避免这种情况。

答案 1 :(得分:1)

source_model属性定义类“where”是此multiselect字段的选项。您可以创建一个只包含要在此字段中显示的选项的新类,并将source_model指向此新类。

您应该使用 toOptionArray()方法来定义选项。快速执行此操作的方法如下例所示:

public function toOptionArray()
    {
        return array(
            array( 'value' => VALUE,
                'label' => LABEL ) ),

            array( 'value' => VALUE2,
                'label' => LABEL2 )
        );
    }

当然,从数据库表中获取选项将是一种更好的做法。