(Не хотел оставлять вас висеть в другой ветке, но нет быстрого ответа на этот вопрос, который не будет ни казаться волшебством, ни просто сбивать людей с толку).
Вы нене нужно переопределять класс, если вы не собираетесь изменить поведение существующего метода.Вам просто нужно создать новый класс, который расширяет существующего класса.Вот как вы это делаете.
Терминология для нормального состояния вещей
Модели - это логические классы / объекты, которые определяют поведение некоторой "вещи" (продукта,и т. д.) в Magento
Модели содержат ресурсы модели.Ресурсы модели - это классы, которые осуществляют фактическую выборку данных из некоторого хранилища данных (mysql и т. Д.).Это шаблон Data Mapper.
Коллекции - это объекты со свойствами, подобными массиву, которые запрашивают базу данных и возвращают группу моделей.Несколько сбивает с толку, Коллекции являются также Ресурсами Модели.
Итак, в нормальном состоянии вы могли бы сказать что-то вроде
Mage::getModel('catalog/product')
, чтобы получить модель продукта, а базовая система использует
Mage::getResourceModel('catalog/product');
, чтобы получить объект Mode Resource, который запрашивает один продукт, и или из следующего используются
Mage::getResourceModel('catalog/product_collection');
Mage::getModel('catalog/product')->getCollection();
, чтобы получить объект Collection, который запрашивает многие модели.В текущих версиях Magento каждый объект Model имеет метод с именем «getCollection», который возвращает соответствующий ресурс коллекции.
Отчеты с рельсов
Отчеты идут немного вбок, но все находится в той же вселенной, как описано выше.Оказывается, нет такой модели, как
Mage::getModel('reports/product');
Но есть коллекция
Mage::getResourceModel('reports/product_collection')
Если вы посмотрите на класс (который вы будетепродолжая ниже), вы увидите, что коллекция 'reports / product_collection'
class Mage_Reports_Model_Mysql4_Product_Collection extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
расширяет класс базовой коллекции .Другими словами, клиентский программист, работавший над разделом отчетов, делал то же самое, что и вы.«Я хочу добавить некоторые методы к Mage::getModelResource('catalog/product_collection')
. Они сделали это путем расширения базового класса.
Заткнись, я просто хочу, чтобы это работало
Такто, что вы действительно хотите здесь сделать, это
Создать новый класс Samsnamespace_Samscatalog_Model_Mysql4_Product_Collection
, который расширяет базовый Mage_Reports_Model_Mysql4_Product_Collection
класс коллекции.
Убедитесь, что вызов Mage::getModelResource('samscatalog/product_collection')
возвращает экземпляр вышеуказанного класса, сконфигурировав наш модуль для использования ресурсов моделей и моделей.
Мы также собираемся изменить структуру вашего модуля вокругнемного, чтобы облегчить путаницу имен. Я не большой поклонник для того, чтобы давать папкам модулей те же имена, что и у основных модулей (например, «Каталог»), а папка верхнего уровня (после local /) на самом деле является пространством имен, а не модулемпапка (пространство имен может содержать много модулей)
Мы не переопределяем класс. Мы настраиваем настраиваемый модуль в вашем пространстве имен для использования как ресурсов моделей, так и ресурсов модели. Затем мы определяем ресурс модели, который расширяетсясуществующий класс PHPуже в системе.Переопределения следует использовать только тогда, когда вы хотите изменить поведение определенного вызова метода.(Приносим извинения за это, но в сообществе достаточно общей путаницы по этому поводу, что стоит обсуждать снова и снова. И снова и снова.)
Во-первых, мы собираемся создать структуру каталогов модулей ифайлы.Нам просто понадобятся два
local/Samsnamespace/Samscatalog/etc/config.xml
local/Samsnamespace/Samscatalog/Model/Mysql4/Product/Collection.php
(и не забудьте включить модуль в приложении / etc / modules. Если вы не уверены, что это значит, начните читать )
Файл Collection.php
должен содержать
<?php
class Samsnamespace_Samscatalog_Model_Mysql4_Product_Collection extends Mage_Reports_Model_Mysql4_Product_Collection
{
/* your custom methods go here*/
}
И файл конфигурации должен содержать
<config>
<modules>
<Samsnamespace_Samscatalog>
<version>0.1.0</version>
</Samsnamespace_Samscatalog>
</modules>
<global>
<models>
<samscatalog>
<class>Samsnamespace_Samscatalog_Model</class>
<resourceModel>samscatalog_mysql4</resourceModel>
</samscatalog>
<samscatalog_mysql4>
<class>Samsnamespace_Samscatalog_Model_Mysql4</class>
</samscatalog_mysql4>
</models>
</global>
</config>
При наличии этих файлов и включенном модуле вы должнысможете звонить
$test = Mage::getResourceModel('samscatalog/product_collection');
var_dump(get_class($test));
, и ваша коллекция будет возвращена, и вы сможете добавлять методы к своему сердцу.
Что происходит
Это умопомрачительный ум, поэтому вы можете перестать читать, если хотите.Это также перефразировка понятий, которые я рассмотрел в другом месте .
Когда вы говорите
Mage::getResourceModel('samscatalog/product_collection');
Базовые коды системы магов говорят: «Хорошо, вот эта модель ресурса»
samscatalog/product_collection
является частью модели
samscatalog/product
(в данном случае это не совсем так, но система так думает).
Итак, поскольку ресурсмодель samscatalog/product_collection
является частью модели samscatalog/product
, давайте посмотрим на конфигурацию в
global/models/samscatalog/resourceModel
Чтобы получить URI модели ресурса
samscatalog_mysql4
, а затем давайте использовать его дляпосмотрите на конфигурацию
global/models/samscatalog_mysql4/class
, чтобы получить имя базового класса для всех моделей ресурсов, которые являются частью этого модуля.В итоге получается
Samsnamespace_Samscatalog_Model_Mysql4
Это означает, что samscatalog/product_collection
Модель ресурсов называется
Samsnamespace_Samscatalog_Model_Mysql4_Product_Collection
, а затем просто стандартная автоматическая загрузка Magento, которая выполняет
include('Samsnamespace/Samscatalog/Model/Mysql4/Product/Collection.php');