Zobacz pełną wersję : JSession w osobnym skrypcie
Cześć.
Posiadam skrypt, który ma współpracować z sesją Joomli, ale niestety nie za bardzo mi się to udaje.
Error jaki się pojawia to: Error: Failed to start application: Failed to start application. Wykorzystuje cześć kody podanego na głównej stronie Joomli: https://docs.joomla.org/How_to_access_session_variables_set_by_an_external _script. Skopiowałem jedynie pierwszą cześć i zaczeły się schody:
define( '_JEXEC', 1 );
define( 'JPATH_BASE', realpath(dirname(__FILE__).'/../..' ));
var_dump(JFactory::getApplication());
require_once ( JPATH_BASE. '/includes/defines.php' );
require_once ( JPATH_BASE. '/includes/framework.php' );
$mainframe = JFactory::getApplication('site');
$mainframe->initialise();
Trudno oceniać fragment kodu, ale to nie jest częścią przykładu
var_dump(JFactory::getApplication());
próbujesz wywołać JFactory chociaż nie wiadomo skąd. Linię framework.php , która potencjalnie dostarczy JFactory masz niżej, ewentualnie jako pierwszy wiersz powinieneś mieć
use Joomla\CMS\Factory;
spróbuj też zmienić realpath na
JPath::find($this->_path['nazwa_katalogu'], $nazwa_pliku);
JPath::find($this->_path['nazwa_katalogu'], $nazwa_pliku);
Gdzie lub na co ma wskazywać ta ścieżka?
to polecenie zwraca ścieżkę do wskazanego pliku
Tyle to wiem, raczej chodzi mi czy to ma wskazywać jakiś plik który jest w joomli od początku czy jakiś który sam stworzyłem?
plik, który stworzyłeś "nazwa_katalogu" nazwa katalogu w którym jest plik o nazwie $nazwa_pliku
Dodałem, lecz w lekko zmienionej wersji i strona się normalnie uruchamia, lecz kiedy próbuje wejść na administratora to wywala, że nie może znaleźć szablonu. Kiedy nic nie podam w getApplication() to wówczas wszędzie dostaję Failed to start application.
define( '_JEXEC', 1 );
//define( 'JPATH_BASE', realpath((__FILE__).'/../..' ));
define(JPath::find(JUri::base().'includes', 'errorHandler.php') ,'');
require_once ( JPATH_BASE. '/includes/defines.php' );
require_once ( JPATH_BASE. '/includes/framework.php' );
$mainframe = JFactory::getApplication('site');
$mainframe->initialise();
a próbowałeś użyć
use Joomla\CMS\Factory;
defined('_JEXEC') or die;
tak naprawdę to jest trochę jak leczenie przez telefon. Trzeba widzieć całą konstrukcje komponentu.
To nie jest komponent, tylko plik wrzucony do katalogu includes, którego zadaniem jest wykorzystać errorHanlder do znajdowania błędów w joomli i zapisania ich do bazy. Ja ze swojego komponentu, tego gdzie jest kalendarz, mam przycisk, który po sesji ma aktywować ten errorHandler. Wówczas podczas przemieszczania się po joomli zbiera in błędy. Tym samym przyciskiem ma być możliwość wyłączenia tej funkcjonalności.
Niestety zadeklarowanie Joomlowskiej sesji uniemożliwia później wejście do modułu (Rozszerzenia->moduły->jakikolwiek moduł), klikam taki moduł i dostaje, że nie mam uprawnień, nawet jako admin.
Po usunięciu Joomlowskiej sesji wszystko wraca do normy.
Tu jest cały kod, ale nie wiem czy on ci coś da:
<?php
/**
* Error handle and save to database
*/
use Joomla\CMS\Factory;
defined('_JEXEC') or die;
//define( 'JPATH_BASE', realpath((__FILE__).'/../..' ));
define(JPath::find(JUri::base().'includes', 'errorHandler.php') ,'');
require_once ( JPATH_BASE. '/includes/defines.php' );
require_once ( JPATH_BASE. '/includes/framework.php' );
$mainframe = JFactory::getApplication('site');
$mainframe->initialise();
class errorHandler {
private $phpErrorInfo = [
1 => 'E_ERROR',
2 => 'E_WARNING',
4 => 'E_PARSE',
8 => 'E_NOTICE',
16 => 'E_CORE_ERROR',
32 => 'E_CORE_WARNING',
64 => 'E_COMPILE_ERROR',
128 => 'E_COMPILE_WARNING',
256 => 'E_USER_ERROR',
512 => 'E_USER_WARNING',
1024 => 'E_USER_NOTICE',
2048 => 'E_STRICT',
4096 => 'E_RECOVERABLE_ERROR',
8192 => 'E_DEPRECATED',
16384 => 'E_USER_DEPRECATED',
32767 => 'E_ALL'
];
public function __construct($table)
{
session_start();
$this->table = $table;
}
/**
* Find error name
*/
private function getErrorName($name) {
return isset($this->phpErrorInfo[$name]) ? $this->phpErrorInfo[$name] : 'none';
}
/**
* create class for joomla object db
*/
private function createClass($logRow) {
$error = new stdClass();
foreach ($logRow as $i => $log) {
if ($i === 'err_str') {
$error->$i = $this->getErrorName($log);
} else {
$error->$i = $log;
}
}
return $error;
}
/**
* Add new log to db
*/
public function add($logRow) {
$errorClass = $this->createClass($logRow);
JFactory::getDbo()->insertObject($this->table, $errorClass);
}
}
function errorHandlerPhp($errno, $content, $errfile, $errline) {
$errHandler = new errorHandler('log_php');
$errHandler->add([
'err_num' => $errno,
'err_str' => $errno,
'content' => $content,
'file' => $errfile,
'line' => $errline,
'date_time' => date('Y-m-d H:i:s'),
'published' => 1,
]);
}
/**
* INIT
*/
/*TA CZEŚĆ POWODUJE BŁĄD Z LINKAMI DO MODUŁÓW*/
$session = JFactory::getSession();
if ($session->get('handler') === true) {
set_error_handler("errorHandlerPhp");
}
Który to jest Twój komponent Joomla ? Proponowałbym zacząć od czegoś prostszego, aby dobrze zrozumieć MVC i programowanie z Joomla https://docs.joomla.org/Portal:Developers
Nie napiszę za Ciebie kodu, mogę tylko podpowiedzieć, ale musimy rozumieć się na pewnym wspólnym poziomie https://docs.joomla.org/Portal:Developers#Getting_Started.21
Mój komponent to jest to http://forum.joomla.pl/showthread.php?87303-Kalendarz-i-custom-komponent
A tu mam plik, który korzysta z przycisku, który jest w komponencie, ale ten skrypt jest zupełnie osobnym bytem i chciałbym by korzystał z systemu sesji, którą zapewnia Joomla.
Model MVC wymaga, aby operacje przechodziły każdorazowo przez kontroler i model Joomla, więc nie ma mozliwości, żeby zewnętrzny skrypt korzystał tylko z jakiejś funkcji Joomla. Skrypt musi stać się częścią komponentu Joomla. https://docs.joomla.org/Model-View-Controller
Czyli innymi słowy, muszę z tego zrobić plugin, albo wpleść w komponent.
Ech.. Upierdliwe to jest...
Tak, upierdliwe NIE, dzieki temu jest zachowany standard programowania, który zapewnia bezpieczeństwo. Jeśli chcesz freestyle w programowaniu to WordPress (to tam jest programowanie na łapu capu). Przewaga Joomla to właśnie programowanie obiektowe i MVC.
vBulletin® v4.2.5, Prawa przedruku © 2024 vBulletin Solutions, Inc. Wszystkie prawa zastrzeżone.
Tłumaczenie: Polskie Centrum Joomla!