Как подключить библиотеку Joomla в свой php файл?

  • 5 Ответов
  • 3129 Просмотров

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

*

kowap

вообщем, такая проблема. есть модуль, называется PHP mod. с его помощью можно вставлять на страницы php код. и у меня есть файл обработчик, который сохраняет значения в переменные сессии. то есть: на странице Joomla, с помощью phpmod мы на страницу вставляем например такое:
Код
<?
echo $_SESSION["value"];
?>
<form method = "post" action = "go.php">
<input type = "text" name = "text">
<input type = "submit" name = "ok">
</form>

а теперь создаем свой файл php. и в нем пишем
Код
<?
session_start();
$_SESSION["value"] = $_POST["text"];
header("Location: /ссылка обратно")
?>

объясняю.
в первом куске, который мы вставили на страницу с помощью модуля phpmod, мы заполняем поле text, нажимаем отправить, и нас переносит на созданный нами php файл. в нем открывается сессия, и в эту сессию сохраняется переменная $_SESSION["value"] в которую мы записали значиние веденное в форму ранее. по всем законам, при выводе $_SESSION["value"] на любой странице сайта, должно отображаться ее содержимое. но тут и проблема, в сессию ничего не сохраняется, то есть, на всех страницах сайта переменная $_SESSION["value"] будет пустая.

нашел ответ на вопрос. что бы в Joomla что то записать в сессию и что то выбрать, нужно делать это с помощью следующего блока кода
Код
$session =& JFactory::getSession(): 
// Выбор
$var = $session->get('key');
// Запись
$session->set('key', 'value');

проблема вроде и решена, но как записать это в моем файле? например такое $session =& JFactory::getSession(): работать вроде не будет, так как библиотеки Joomla не подключены к моему файлу. и вот вопрос, что и как нужно подключить в мой новый php файл, что бы работала эта конструкция
Код
$session =& JFactory::getSession(): 
// Выбор
$var = $session->get('key');
// Запись
$session->set('key', 'value');


Тоже сейчас мучаюсь с подключение собственного скрипта и сессиями. Прочитал что надо вот это прописать:
Код
define('JPATH_BASE', dirname(__FILE__));
define('DS', DIRECTORY_SEPARATOR);
$path = JPATH_BASE . DS . 'includes' . DS;
// once использовать необязательно, не думаю, что вы подключите файлы фреймворка дважды
require($path . 'defines.php');
require($path . 'framework.php');
$app = JFactory::getApplication('site');
$app->initialise();

В строке
 
Код
define('JPATH_BASE', dirname(__FILE__));

кол-во dirname - это вложенность нашего файла т.е. у меня мой скрипт лежит в корне, поэтому у меня 1 dirname.
Таким образом у нас начинает понимать команды джумловские.

Но вот у меня беда, после добавления этого кода перестает вообще выполняться скрипт. Строки эти правильные, я уверен. В чем проблема не пойму.

Разобрался и все заработало! В начале приведенного выше мною кода, добавил
Код
define( '_JEXEC', 1 );

В исполняемом отдельно скрипте для проверки вставил
Код
$session =& JFactory::getSession();
$session->set('hello', 'blin');

А в файле index.php моего шаблона
Код
$session =& JFactory::getSession();
 echo $session->get('hello');
 

И вуаля, на страницах сайта стало выводится слов blin которое было занесено в сессию в отдельном от Joomla скрипте.

*

EndVal

  • ***
  • 53
  • + 9 -
Разобрался и все заработало! ....
Всегда ли заработает? Для Joomla 3.x вы создаете файл в корне CMS, что неверно и не логично, если взглянуть со стороны модуля.
Файл должен лежать внутри каталога модуля, что правильно. Разбираю КАСАТЕЛЬНО ТОЛЬКО МОДУЛЯ - ВНИМАТЕЛЬНО!

Тогда JPATH_BASE выдаст совсем другой путь при define('JPATH_BASE', dirname(__FILE__));
Например, пусть сайт будет NAME_OF_SITE, внутри модуль в MODULES\MOD_NAMEOFMODULE - вот здесь будет наш файл например, score.php,
.....NAME_OF_SITE\MODULES\MOD_NAMEOFMODULE/score.php

Тогда define('JPATH_BASE', dirname(__FILE__)); выдаст типа:
Warning: require_once.......NAME_OF_SITE\MODULES\MOD_NAMEOFMODULE/includes/defines.php): failed to open stream...... (сокращенно написал),
кстати, про эту ошибку спрашивали, почему появляется когда require_once падает.

Выделил заглавными MODULES\MOD_NAMEOFMODULE - появится это лишнее,
естественно строка $path = JPATH_BASE . DS . 'includes' . DS; выдаст совсем другой путь и
require($path . 'defines.php'); require($path . 'framework.php'); - не загрузятся.

Решение: убрать MODULES\MOD_NAMEOFMODULE из PATH_BASE
define('JPATH_BASE', dirname(__FILE__)); заменить на define( 'JPATH_BASE', __DIR__ . '/../../' ); - тогда все includes подключатся

dirname(__FILE__) - это месторасположение файла, .дает...NAME_OF_SITE\MODULES\MOD_NAMEOFMODULE/includes/....
define( 'JPATH_BASE', __DIR__ . '/../../' ); дает ....NAME_OF_SITE\includes/ что верно для загрузки includes

обратите внимание на  __DIR__ . '/../../' переход на верхние уровни

Надеюсь, что понятно, через var_dump - поисследуйте, тогда все поймете
« Последнее редактирование: 13.02.2016, 09:14:15 от EndVal »

*

buyanov

  • ***
  • 178
  • + 26 -
  • Сайты 74
Привет, но попахивает чем-то не хорошим прям сразу!
Переопределять JPATH_BASE как-то грешновато по моему ^-^

А сторонние библиотеки лучше ставить с помощью composer (это на время разработки например), а если собрать модуль то уже можно туда засунуть папочку вендор например.
У Joomla есть прекрасный класс JLoader.

Вот пример подключения mtHaml библиотеки

Код: php
JLoader::registerNamespace('MtHaml', JPATH_THEMES . '/blank_j3/lib/vendor/mthaml/mthaml/lib');
JLoader::register('JHaml', JPATH_THEMES . '/blank_j3/_php/utility/haml.php');

тут blank_j3 это мой шаблон, в нем все и лежит. Подозреваю что с модулем будет все похоже.
Создание сайтов, интернет-магазинов, оптимизация, продвижение, хостинг, безопасность, лечение от вирусов - мой сайт, телега, Хостинг