Codenator 24 августа 2014 3 18
Я часто когда писал под MODX задумывался что из этого мне надо и для чего. Тоесть сам вопрос где и как их использовать.
Есть метод $modx->addExtensionPackage($class, $path) но минус этого метода в том что он добавляет в автоматическую загрузку и когда таких классов много это нагружает сайт.
И так поехали где правда?
Эти методы загружают класс то есть это замена include и require. Первый плюс в том что в случае ошибки мы получим сообщение в MODX error log. Второй плюс в том что если класс уже загружен то ошибки не будет и не надо писать типа if (! class_exists('classname')) {}.

loadClass()

public function loadClass($fqn, $path= '', $ignorePkg= false, $transient= false)


Используем в случае если надо загрузить класс который не использует базу данных
$path = MODX_CORE_PATH . 'components/mycomponent/model/';
$modx->loadClass('myclass.MyClass', $path, true, true);


Последний аргумент true соббщает MODX что наш класс не использует базу данных.

addPackage()

public function addPackage($pkg= '', $path= '', $prefix= null)

Используем если наш класс использует базу данных и имеет сгенерированые map фаилы.
$myclassModelPath = MODX_CORE_PATH . 'components/myclass/model/';
 
$modx->addPackage('Myclass',$myclassnModelPath , '');

Позволяет нам теперь пользоваться классом например написав так:
$modx->getObject('Myclass');


getService()

public function &getService($name, $class= '', $path= '', $params= array ())

Предзназначен для того чтоб мы легко могли пользоваться функциями класса через альяс:

$myclassModelPath = MODX_CORE_PATH . 'components/myclass/model/';
$modx->getService('myclassAlias', 'myclass.Myclass', $myclassModelPath);
//теперь можем использовать альяс для доступа к функциям
$modx->myclassAlias->myClassFunction();

Надеюсь вы нашли ответ на этот вопрос для себя раз и навсегда?
18 комментариев
C
Codenator 24 августа 2014г в 16:41 #
На деюсь я в правильном топике написал? )))
C
Codenator 24 августа 2014г в 16:51 #
Два раза в код обарачивает. Я чтото не так сделал? Я писал так
/code>
Fi1osof1
Fi1osof 24 августа 2014г в 20:02 #
Коды не всегда корректно обрабатываются. Типографику подключать надо будет. Это чуть позже.
C
Codenator 24 августа 2014г в 16:53 #
в коментариях нормально вроде ))))
Fi1osof1
Fi1osof 24 августа 2014г в 20:00 #
$path = MODX_CORE_PATH . 'components/mycomponent/model/';

$modx->loadClass('myclass.MyClass', $path, true, true);

Лучше все это заменить на
$modx->loadClass('myclass.MyClass', '', false, true);

В таком случае нам не надо указывать четкий путь к директории, а третий параметр false указывает на то, что надо искать во всех подключенных пакетах. Но это в случае, если пакет подключен. Твой пример годится в тех случаях, когда пакет не подключен, а класс подключить надо.
Fi1osof1
Fi1osof 24 августа 2014г в 20:02 #
А вообще здесь какой-то вопрос стоял или нет? Лично я всегда пакеты расширяющие подключаю сразу. Прирост нагрузки ничтожный, а удобств - масса.
C
Codenator 24 августа 2014г в 21:06 #
То есть addExtensionPackage вполне нормально использовать? Вопрос стоял у меня и я просто исча на них точные ответы написал статью. Как то так ))))
Fi1osof1
Fi1osof 24 августа 2014г в 21:27 #
addExtensionPackage очень даже нормально использовать.
Fi1osof1
Fi1osof 24 августа 2014г в 21:49 #
Кстати, еще раз перечитал заголовок, и усматриваю довольно серьезное непонимание вещей. Ты сравниваешь вообще разные механизмы. Давай по порядку:

1. xPDO::loadClass() - это метод для подгрузки классов, при чем без разницы каких, xPDO-классов или нет.
Рассмотрим на примере: если нам нужно создать новый объект, к примеру $modx->newObject('modUser'), то для этого нам нужен класс modUser, то есть его надо подгрузить. Так вот, xPDO::loadClass($className) этим и занимается, и он автоматически вызывается внутри метода newObject() (как и других похожих методов, типа getObject(), getCollection() и т.п.).

2. xPDO::addPackage() нужен для того, чтобы подключить еще один пакет с классами, то есть еще одну директорию (как правило это директория модуля). Когда пакет подключен, то xPDO::loadClass() ищет во всех подключенных модулях, пока не найдет запрошенный класс (если, как писалось выше, третий параметр не установлен в значение true).

3. xPDO::addExtensionPackage() - это просто автоматическое подключение addPackage(), просто для удобства и автоматизации.

4. xPDO::getService() - вот это совсем другая песня. Для нее справедливо и все то, что перечислено выше (так как тоже используется метод loadClass(), и addPackage()(если надо, само собой еще до вызова метода getService())), но этот метод используется для расширения самого объекта $modx. К примеру, $modx->getService($alias, $class); В случае успеха будет доступен объект $modx->$alias, к примеру $modx->mail или $modx->error. И это совсем не для xPDO-классов.

Так понятней?
C
Codenator 24 августа 2014г в 23:26 #
Да спасибо так понятней ))
Fi1osof1
Fi1osof 24 августа 2014г в 23:27 #
Пожалуйста :)
C
Codenator 24 августа 2014г в 23:55 #
Есть вопрос который поледнее время мучает мне на нравится как робатется с TV через xPDO да и вобще это прокол MODX. Пытаюсь копенсировать MIGXdb или создавать класс который наследует modResource. Потомучто для магаза или ещё чего не удобно по TV сортировать. Попробовал ClassExtender но помойму туповато. Мог бы поделится как решать проблему. Спасибо.
C
Codenator 25 августа 2014г в 00:26 #
Как по мне то MIGXdb нормальный вариант в целом
Fi1osof1
Fi1osof 25 августа 2014г в 00:36 #
Вот здесь писал про наши методы поиска и сортировки.
C
Codenator 25 августа 2014г в 00:53 #
Хорошо спасибо пора прокачиваться до процессоров )))))
Fi1osof1
Fi1osof 25 августа 2014г в 00:54 #
Давно пора.
n
niibaca-nah 06 июня 2015г в 22:11 #
БлагоДарю, Николай! Вы, как всегда выручаете меня. Не знал, как подключить в свой компонент классы стороннего компонента. addPackage пришёл на помощь благодаря Вам.
Fi1osof1
Fi1osof 08 июня 2015г в 19:56 #
Всегда пожалуйста :)
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.