PDA

Zobacz pełną wersję : JSession w osobnym skrypcie



Ambroz
09-10-2020, 11:01
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();

terra
09-10-2020, 17:29
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);

Ambroz
12-10-2020, 08:10
JPath::find($this->_path['nazwa_katalogu'], $nazwa_pliku);
Gdzie lub na co ma wskazywać ta ścieżka?

terra
13-10-2020, 09:32
to polecenie zwraca ścieżkę do wskazanego pliku

Ambroz
13-10-2020, 10:01
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?

terra
13-10-2020, 20:53
plik, który stworzyłeś "nazwa_katalogu" nazwa katalogu w którym jest plik o nazwie $nazwa_pliku

Ambroz
14-10-2020, 12:23
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();

terra
14-10-2020, 14:37
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.

Ambroz
14-10-2020, 14:49
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");
}

terra
14-10-2020, 16:17
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

Ambroz
14-10-2020, 17:00
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.

terra
14-10-2020, 22:55
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

Ambroz
14-10-2020, 23:01
Czyli innymi słowy, muszę z tego zrobić plugin, albo wpleść w komponent.
Ech.. Upierdliwe to jest...

terra
14-10-2020, 23:44
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.