490f08a9

Заметки на полях: Magento source_model в system.xml и ошибка Fatal error: Call to a member function toOptionArray() on a non-object

Magento, Заметки, Программирование

Метки (теги) : , , ,

Автор: admin

Если у вас есть модуль для magento, который вы только что написали или переделали чужой под себя, но не можете избавиться от ошибки которая указана в теме данного поста (Fatal error: Call to a member function toOptionArray() on a non-object), то вам стоит читать дальше.

Я подозреваю, что вы делали какие либо настройки для модуля в файле system.xml
И если эти настройки будут видны не на вкладке самого модуля, а на вкладке например shipping methods, то ошибка скорее всего кроется в том, что вы пытаетесь создать опцию с выпадающим списком “select” и сделать туда вывод своего списка составленного по какому-то вашему алгоритму. Вот здесь и кроется ошибка многих.

Вот два примерных блока кода, первый правильный, а второй с ошибкой.

Первый блок кода

<?xml version=”1.0″?>
<config>
<sections>
<mymodule translate=”label comment” module=”mymodule”>
<tab>general</tab>
<label>Mymodule</label>
<frontend_type>text</frontend_type>
<sort_order>200</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<groups>
<profile translate=”label comment” module=”mymodule”>
<label>Configuration options</label>
<frontend_type>text</frontend_type>
<sort_order>5</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<fields>
<licensenumber translate=”label”>
<label>License Number</label>
<frontend_type>select</frontend_type>
<source_model>mymodule/config_license</source_model>
<sort_order>100</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</licensenumber>

 

Второй блок кода

<?xml version=”1.0″?>
<config>
<sections>
<carriers>
<groups>
<mymodule translate=”label comment” module=”mymodule”>
<profile translate=”label comment” module=”mymodule”>
<label>Configuration options</label>
<frontend_type>text</frontend_type>
<sort_order>5</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<fields>
<licensenumber translate=”label”>
<label>License Number</label>
<frontend_type>select</frontend_type>
<source_model>mymodule/config_license</source_model>
<sort_order>100</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</licensenumber>

Ошибка выделена красным цветом, а различия выделены синим. Из различий мы видим, что наш модуль будет виден среди настроек carriers.

И соответственно magento пытается подгрузить класс модели config_license из ядра. А нам нужно чтобы она подгружала его из нашего модуля. В таком случае нам нужно указать magento путь к нашему классу вот таким образом Mycompany_Mymodule_Model_Config_License

На примере это выглядит так :

<?xml version=”1.0″?>
<config>
<sections>
<carriers>
<groups>
<mymodule translate=”label comment” module=”mymodule”>
<profile translate=”label comment” module=”mymodule”>
<label>Configuration options</label>
<frontend_type>text</frontend_type>
<sort_order>5</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
<fields>
<licensenumber translate=”label”>
<label>License Number</label>
<frontend_type>select</frontend_type>
<source_model>Mycompany_Mymodule_Model_Config_License</source_model>
<sort_order>100</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</licensenumber>

Зеленым выделено правильное обращение к классу модели нашего модуля. Mycompany это папка в которой находится наш модуль Mymodule.

Надеюсь вам поможет мой совет. На все вопросы с радостью отвечу в комментариях…

Оставить комментарий