Вопрос Формирование SEF из админки компонента

Тема в разделе "Программирование", создана пользователем denism300, 24.11.2016.

  1. Offline

    denism300 Недавно здесь

    Регистрация:
    20.10.2016
    Сообщения:
    20
    Симпатии:
    0
    Пол:
    Мужской
    Делаю компонент, формирующий прайс товаров из VirtueMart. Ссылка на товар формируется в модели публичной части компонента так:
    Код (PHP):
    1. $prod_url = JURI::root(). JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $product->virtuemart_product_id . '&virtuemart_category_id=' . $product->virtuemart_category_id, true);
    2. $prod_url = str_replace(array('//', 'http:/'), array('/', 'http://'), $prod_url);


    Если обращаться к компоненту из публичной части, то все ок.
    Если формировать файл прайс-листа из админки компонента, то ссылки принимают такой вид:
    Понятно, что это происходит из-за того, что роутер в админке не задействован и его надо подключать.
    Собственно, вопрос: как это сделать, т.к. знаний пока что еще не хватает.

    Функция, выгружающая прайс в файл, не в админке. В админке, в контроллере она только вызывается, а затем проверяется, создан ли файл и выводится сообщение.
    /administrator/components/com_component/controllers/objects.php
    Код (PHP):
    1. require_once(JPATH_ROOT.DS.'components'.DS.'com_component'.DS.'models'.DS.'object.php');
    2.  
    3. public function getFile() {
    4.         $params = JComponentHelper::getParams('com_component');
    5.         $getFile = new ComponentModelObject();
    6.         $getFile -> getFile();
    7.         if (JFile::exists($params->get('filepath'). 'price.txt')) {
    8.             JFactory::getApplication()->enqueueMessage(JText::_('COM_COMPONENT_NOTICE_FILE_SAVE_SUCCESS'). '<br /><br />' . JURI::root(). $params->get('filepath'). 'price.txt');
    9.         }
    10.         else {
    11.             JError::raiseWarning(JText::_('COM_COMPONENT_NOTICE_FILE_SAVE_ERROR'));
    12.         }
    13.         $this->setRedirect(JRoute::_('index.php?option=com_component&view=objects', false));
    14.     }


    Сама функция выгрузки в файл лежит в /components/com_component/models/object.php
    и представляет собой
    Код (PHP):
    1. function getFile() {
    2.         $params = JComponentHelper::getParams('com_component');
    3.         $price = $this->getPrice();
    4.         JFile::write((JPATH_ROOT . DS . $params->get('filepath'). 'price.txt'), $price);
    5.  
    6.         return true;
    7.     }


    Непосредственно сам прайс формируется в функции getPrice(), которая, в свою очередь, вызывает функции, формирующие заголовок прайса, список товаров и т.п.
     
  2.  
  3. Offline

    denism300 Недавно здесь

    Регистрация:
    20.10.2016
    Сообщения:
    20
    Симпатии:
    0
    Пол:
    Мужской
    в общем, разобрался. делюсь решением, может, кому пригодится.

    в /components/com_component/models/object.php в функции getPrice() (у меня в ней формируется ссылка и остальные параметры выгружаемого товара)
    подключаем роутер:
    Код (PHP):
    1. $app = JApplicationCms::getInstance("site");
    2. $router = $app::getRouter("site");


    ссылку получаем так:
    Код (PHP):
    1. $prod_url = $router->build(JURI::root(). JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $product->virtuemart_product_id . '&virtuemart_category_id=' . $product->virtuemart_category_id, true));


    в итоге получаем при вызове функции из админки ссылку вида:
    при вызове функции из публичной части:
    вот тут я не понял, почему стало добавляться к ссылке при вызове функции из публичной части вот это:
    но пока не стал с этим заморачиваться и убрал ненужное с помощью str_replace
    Код (PHP):
    1. $prod_url = str_replace(array('//', 'http:/', '/administrator', '/index.php', '/component/comp_name'), array('/', 'http://', '', '', ''), $prod_url);


    вот как-то так. буду рад, если кто-то подскажет более оптимальное решение.
     

Поделиться этой страницей

Загрузка...