0 Пользователей и 1 Гость просматривают эту тему.
  • 8 Ответов
  • 316 Просмотров
*

denism300

  • Осваиваюсь на форуме
  • 134
  • 0
Подскажите, как вызвать функцию, находящуюся в публичной модели из контроллера, находящегося в админке?
Если просто подключить файл с моделью и обратиться к функции, то подхватываются все параметры (файлы локализаций, блиблиотеки и т.п.), относящиеся к админ. части, соответственно, все это выдает неверный результат.

Мне же надо, чтобы функция "думала", что ее вызвали из публичной части.
*

robert

  • Профи
  • 4081
  • 376
Re: Вызов внешней функции из админки
« Ответ #1 : 13.12.2016, 23:27:03 »
Не перестану удивляться тому, как все так любят думать категориями "функция думала", "обмануть функцию". Так часто бывает, что придумав какую-нибудь идею, уже сразу решили, что она единственная верная.
Приведите код, так вам намного быстрее ответят.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

denism300

  • Осваиваюсь на форуме
  • 134
  • 0
Re: Вызов внешней функции из админки
« Ответ #2 : 14.12.2016, 19:20:00 »
Не перестану удивляться тому, как все так любят думать категориями "функция думала", "обмануть функцию". Так часто бывает, что придумав какую-нибудь идею, уже сразу решили, что она единственная верная.
Приведите код, так вам намного быстрее ответят.
вызываемая функция из публичной модели:
Код: php
function getFile() {
$referer = JRequest::getString('HTTP_REFERER', null, 'SERVER');
$file = './media/com_vmtoxls/price.xlsx';
$this->getXLS($file);

if (JFile::exists($file)) {
header("Content-Type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Content-Length: ".filesize($file));
header("Content-Disposition: attachment; filename=" . JFile::stripExt(JFile::getName($file)). '_' . date("d-m-Y"). '.' . JFile::getExt($file)); 
readfile($file);

}
else {
JFactory::getApplication()->redirect($referer, JText::_('COM_VMTOXLS_NOTICE_FILE_NOT_EXISTS'), error);
}
return true;
}

эта функция, в свою очередь, вызывает getXLS(), которая, получая данные, обращаясь к другим функциям, которые, в свою очередь, делают выборку из БД, формирует xlsx файл.

из контроллера админки я вызываю так:

Код: php
public function update() {
$router = JRouter::getInstance('site');
$router -> setMode(JROUTER_MODE_SEF);
$update = new VMtoXLSModelGetXLS();
$update -> getFile();
$this->setRedirect(JRoute::_('index.php?option=com_vmtoxls&view=products', false));
}

соответственно, функция вызывается из админки и не генерируются чпу ссылки, файл пытается создаться (естественно, неуспешно) не в site/media/com_vmtoxls/, а в site/administrator/media/com_vmtoxls/, не подключается публичная локализация и т.п.
*

robert

  • Профи
  • 4081
  • 376
Re: Вызов внешней функции из админки
« Ответ #3 : 14.12.2016, 19:31:17 »
getFile($isSite=true){}. Пишу за рулем. Или испрльзуйте абсолютные пути.
« Последнее редактирование: 14.12.2016, 19:40:43 от robert »
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

flyingspook

  • Профи
  • 3620
  • 236
Re: Вызов внешней функции из админки
« Ответ #4 : 14.12.2016, 22:20:21 »
Пишу за рулем. Или испрльзуйте абсолютные пути.
2robert
не нарушай ПДД
*

robert

  • Профи
  • 4081
  • 376
Re: Вызов внешней функции из админки
« Ответ #5 : 14.12.2016, 22:36:35 »
2robert
не нарушай ПДД
Виноват, исправлюсь :) (хотя реально езды как таковой и не было: стоял 4 часа в пробке :().
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

denism300

  • Осваиваюсь на форуме
  • 134
  • 0
Re: Вызов внешней функции из админки
« Ответ #6 : 15.12.2016, 01:29:07 »
getFile($isSite=true){}. Пишу за рулем. Или испрльзуйте абсолютные пути.
не сработало.
использовать абсолютные пути не вариант, т.к. в прайс вставляются ссылки на товары, и, если, вызывать из админки, то ссылки не конвертируются в ЧПУ
*

robert

  • Профи
  • 4081
  • 376
Re: Вызов внешней функции из админки
« Ответ #7 : 15.12.2016, 08:28:37 »
Уже много раз писали на форуме, как использовать ЧПУ фронта в админке, не искали?
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

denism300

  • Осваиваюсь на форуме
  • 134
  • 0
Re: Вызов внешней функции из админки
« Ответ #8 : 15.12.2016, 15:37:33 »
искал, и даже перед тем, как создать эту тему, делал изначально так, но возникли проблемы в виде того, что к концу ссылки при вызове из фронта добавлялся алиас кнопки меню.

в итоге, решил проблему так (это кусок кода в публичной модели, отвечающего за формирование ссылки):
Код: php
if ($app->isAdmin()) {
$uri = $router->build(JURI::root(). JRoute::_($link, true));
$path = str_replace(array('http:/', '/administrator', '/index.php'), array('http://', '', ''), $uri->getPath());
$uri->setPath($path);
$url = JURI::root(). $uri->toString(array('path', 'query', 'fragment'));
}
else {
$uri = JURI::root(). JRoute::_($link, true);
$url = str_replace(array('//', 'http:/', '/index.php', '/component/vmtoxls'), array('/', 'http://', '', ''), $uri);
}

не знаю, насколько корректно с точки зрения API Joomla, но работает правильно.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Модуль для админки

Автор platonische

Ответов: 2
Просмотров: 179
Последний ответ 29.03.2017, 16:53:58
от SeBun
вызов setRedirect() из модели

Автор denism300

Ответов: 2
Просмотров: 173
Последний ответ 11.12.2016, 21:16:12
от denism300
Ajax-проверка полей админки модуля

Автор balancer

Ответов: 0
Просмотров: 221
Последний ответ 20.04.2016, 10:32:48
от balancer
Оформление админки

Автор platonische

Ответов: 1
Просмотров: 267
Последний ответ 18.03.2016, 21:50:21
от platonische
[Решено] Оформление админки

Автор platonische

Ответов: 4
Просмотров: 320
Последний ответ 17.02.2016, 11:43:10
от b2z