9 сент. 2013 г., 10:43
Нужно обратиться к методам одного класса через getService, но есть проблема
Ох, вообщем нужна помощь так как с ООП у меня проблемы. Вообщем нужно обратиться к методам одного класса известного модуля (по коду видно), но есть проблемы. Вообщем вот я получаю сервис.
$articles = $modx->getService('articles','Article', $modx->getOption('core_path') . 'components/articles/model/articles/', $scriptProperties );
Затем мне нужно в ручную создать ресурсы (в данном случае новости) и применить некоторые методы из пакета Article.
$document = $modx->newObject('Article'); ......
В итоге наблюдаю ошибку при создании:
Fatal error: Class 'Article_mysql' not found in .................\core\xpdo\xpdo.class.php on line 763
Погуглив я вроде как стал понимать, что проблема кроется в одинаковых названиях классов. Но теперь непонятно, что можно сделать чтобы подключить те методы без конфликта через $modx->getService так как менять название в схеме таблицы это костыль, который не хочу делать. Думаю наверняка есть простой метод обхода проблемы, но плохие познания в ООП подводят.
Я Articles не использую, но судя по всему у вас путаница в целом.
$document = $modx->newObject('Article');
Для того, чтобы это корректно работало, вам нужно подключить пакет, если он не подключен, а именно использовать $modx->addPackage() или подключить extenstionPackage. Подробней написано здесь: modxclub.ru/blog/115.html
Когда подключается пакет, тогда указывается папка, в которой xPDO будет искать запрашиваемые классы.
Когда выполняется метод $modx->newObject($className), xPDO выполняет loadClass($className), который ищет не только сам файл с этим классом, но и сопутствующие файлы для конкретного типа базы данных (мап- и db- файлы).
А вот используемый метод $modx->getService($serviceName, $className) тоже выполняет $modx->loadClass(), но только с еще тремя параметрами ('', false, true), которые указывают, что не надо использовать мап-файл. В итоге вы получаете указанный класс, но теряете mysql-класс (не подгружается сопутствующий файл). Вот поэтому вы и получаете фатальную ошибку Fatal error: Class 'Article_mysql' not found in…
Собственно, поэтому я и говорю, что вы все напутали. $modx->getService() используется совершенно для других целей.