Magento源模型约定

Ric*_*ski 3 naming-conventions class-structure magento

我经常在源模型中看到两种不同的方法似乎做同样的事情:

class Mypackage_Mymodule_Model_Source_Generic {

  /* I sometimes see this method */
  public function getAllOptions() {}

  /* And other times this method */
  public function toOptionArray() {}

}
Run Code Online (Sandbox Code Playgroud)

根据我的经验,使用哪种方法名称没有押韵或理由; 它们似乎都返回相同的数据结构.

有什么我想念的吗?

源模型toOptionArrayVarien_Data_Collection::toOptionArray?之间是否存在语义链接?

Ala*_*orm 11

像我的许多答案一样,这是一个明智的推测.

toOptionArraygetAllOptions"源模型"分裂好像在Magento的1厨房太多厨师的另一种情况.也就是说,一组开发人员使用类似的概念,但没有人负责确保最终结果是一个稳固,一致的系统.问题是Magento中至少有两种"源模型".

首先,系统配置系统(system.xml文件System -> Configuration等)中有一个源模型概念,它规定了系统配置表单的选项.其次,EAV系统中有一个源模型概念(更准确地说,属性源),它再次指示UI表单的选项,但这次是为了渲染用户界面来编辑具有特定属性的对象条目.

系统配置系统使用toOptionArray.EAV系统使用getAllOptions.这反映在为EAV系统的源属性对象提供的接口中.

#File: app/code/core/Mage/Eav/Model/Entity/Attribute/Source/Interface.php
interface Mage_Eav_Model_Entity_Attribute_Source_Interface
{
    /**
     * Retrieve All options
     *
     * @return array
     */
    public function getAllOptions();

    /**
     * Retrieve Option value text
     *
     * @param string $value
     * @return mixed
     */
    public function getOptionText($value);
}
Run Code Online (Sandbox Code Playgroud)

更重要的是,系统如何使用对象.当Magento在系统配置选项卡中呈现UI时,它会使用此代码执行此操作

#File: app/code/core/Mage/Adminhtml/Block/System/Config/Form.php
//...
$optionArray = $sourceModel->toOptionArray($fieldType == 'multiselect');
//...
Run Code Online (Sandbox Code Playgroud)

当Magento呈现用于编辑EAV产品对象的UI时,它会使用这样的代码

#File: app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Super/Config/Simple.php

'values' => $attribute->getSource()->getAllOptions(true, true),
Run Code Online (Sandbox Code Playgroud)

这是两个不同的系统开发人员在Magento的不同部分实现类似的概念.因此,当其他开发人员需要使用选择列表创建一个UI并且不熟悉系统约定时,他们会选择他们之前看过的方法,这就是导致(看似)没有押韵或原因模式的原因上文提到的.还有一些案例,Magento核心开发人员正在尝试将这两种方法结合起来.

#File: app/code/core/Mage/Tax/Model/Class/Source/Product.php
public function getAllOptions($withEmpty = false)
{
    //...
}
//...
public function toOptionArray()
{
    return $this->getAllOptions();
}
Run Code Online (Sandbox Code Playgroud)

最后,虽然有之间没有正式的语义链接Varien_Data_CollectiontoOptionArraytoOptionArray在系统配置源模型中,似乎可以推测,因为源模型,在实际应用中,数据的集合,是一个核心开发者选择toOptionArray的方法的名称,以便(理论上)Varien_Data_Collection基础对象可以用作源模型.我怀疑如果不是因为PHP 5.2中的性能考虑,app/code/core/Mage/Adminhtml/Model/System/Config/Source所有模型都将继承Varien_Data_Collection.