вторник, 17 марта 2020 г.

Использовать модель VirtueMart в своём PHP скрипте

Как ни странно, по состоянию на день написания этого поста, сколько я не гуглил, не удалось найти ответ на вопрос, как задействовать нужную модель VirtueMart в своём php скрипте (запускаемом самостоятельно, не через главный index.php Joomla). Методом проб и ошибок нашёл-таки решение! Делюсь.

Краткость - сестра таланта! Поэтому - сразу к делу! :)

Приведён пример скрипта, когда нужно получить доступ к модели Категории товаров (в частности через модель получаем список подкатегорий). По аналогии можно получать и другие модели.

<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

// SETTING
$root_path = '/home/.../public_html'; // абсолютный путь к корню Joomla
// ... другие настройки
$sale_cat_id = 652; // id категории, для которой будем искать подкатегории

if (!defined('DS')) define('DS', DIRECTORY_SEPARATOR);

// Подключаем фреймворк Joomla
define('_JEXEC', 1);
define('JPATH_BASE', $root_path);
require_once JPATH_BASE.DS.'includes'.DS.'defines.php';
require_once JPATH_BASE.DS.'includes'.DS.'framework.php';

$app = JFactory::getApplication('site');

if (!class_exists('VmConfig')) require JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'helpers'.DS.'config.php';
if (!class_exists('VirtueMartModelCategory')) require_once JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'models'.DS.'category.php';

// VmConfig::loadConfig();
$modelCategory = new VirtueMartModelCategory();

// Какие подкатегории есть в Распродаже
$childCatList = $modelCategory->getChildCategoryList(1, $sale_cat_id);

echo '<pre>';
print_r($childCatList);
echo '</pre>';
Тестировано на Joomla 3.9.14 и VM 3.4.2. PHP 7.2.

Не исключаю, что этот вариант ещё можно улучшать. Поэтому если будут мысли - welcome в комментарии!

Важное замечание:
Если использовать модель товара в цикле в большим числом элементов, может возникнуть непредвиденная потеря работоспособности. Возможно, это связано с использованием памяти (хотя... просмотр использования памяти процессом это не подтверждает). Например, у меня в цикле для каждого товара создавался объект из модели. Несмотря на то, что каждый объект затирался к конце каждой итерации, когда цикл доходил до 525-537-ой итерации, модель отдавала пустой объект, и далее так же для последующих итераций...

Комментариев нет:

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