Są dwa problemy z home.pl:
1) ścieżka SERVER_ROOT jest zawsze = "/". To powoduje problem z poprawnym /libraries/joomla/filesystem/path.php on line 156, bo JPATH_ROOT przez to = "", bo jest ono generowane na podstawie JPATH_BASE, które z kolei jest ustalane na podstawie wartości zwracanej przez dirname(__FILE__). Joomla nie sprawdza, czy SERVER_ROOT == "/", bo nikt nie wpadł na pomysł, że pliki strony www mogą leżeć luzem w katalogu głównym serwera (a tak właśnie to z punktu widzenia skryptów wygląda).
2) problem z logowaniem się na zapleczu powstaje z innego powodu. home.pl błędnie ustawia wartości $_SERVER['PHP_SELF'] i $_SERVER['SCRIPT_NAME'] w przypadku, gdy wywołujemy strone bez podania konkretnego pliku skryptu. Wtedy serwer odwołuje się do pliku index.php (jesli istnieje), ale zapomina, że ww. zmienne powinny mieć wartość "/index.php", w przypadku zaplecza, wywołanie www.joomla.org/administrator te zmienne powinny miec wartość co najmniej "/aministrator/index.php"
Ja rozwiązałem sobie to w nastepujący sposób (nie wymaga ingerencji w kod samej Joomli).
Tworzę plik /defines.php, a w nim kopia /includes/defines.php z małą zmianą.
Kod PHP:
<?php
defined('_JEXEC') or die;
define('_JDEFINES', true);
if (isset ($lastDir) && $lastDir == 'administrator') {
define('JPATH_BASE', '/./administrator');
}else{
define('JPATH_BASE', '/.');
}
define('JPATH_ROOT', '/.');
define('JPATH_SITE', JPATH_ROOT);
define('JPATH_CONFIGURATION', JPATH_ROOT);
define('JPATH_ADMINISTRATOR', JPATH_ROOT . '/administrator');
define('JPATH_LIBRARIES', JPATH_ROOT . '/libraries');
define('JPATH_PLUGINS', JPATH_ROOT . '/plugins');
define('JPATH_INSTALLATION', JPATH_ROOT . '/installation');
define('JPATH_THEMES', JPATH_BASE . '/templates');
define('JPATH_CACHE', JPATH_BASE . '/cache');
define('JPATH_MANIFESTS', JPATH_ADMINISTRATOR . '/manifests');
if (array_pop(explode('/', $_SERVER['PHP_SELF'])) != 'index.php')
$_SERVER['PHP_SELF'].='index.php';
if (array_pop(explode('/', $_SERVER['SCRIPT_NAME'])) != 'index.php')
$_SERVER['SCRIPT_NAME'].='index.php';
W pliku /administrator/includes/defines.php robię:
Kod PHP:
<?php
$lastDir=array_pop(explode('/',dirname(__FILE__)));
require_once '../defines.php';
Można jeszcze jakieś warunki dać, żeby FIX działał tylko na serwerach home.pl (jesli testy prowadzi się np. lokalnie), ale mi to nie było potrzebne.
---------- Post dodany o 13:16 ---------- Poprzedni post był o 03:35 ----------
a home.pl odpowiada tak:
Uprzejmie informuje, iz zgodnie ze specyfikacja jezyka PHP (http://php.net/manual/en/reserved.variables.server.php ), zmienna $_SERVER, przechowuje wartosci dla skryptow CGI, okreslone w dokumencie RFC 3875 (http://www.rfc-ref.org/RFC-TEXTS/3875/chapter4.html ). W kluczu 'SCRIPT_NAME' moze byc podawana takze sciezka do wywolywanego pliku, w innym przypadku wartosc tego klucza nie roznilaby sie od klucza 'SCRIPT_FILENAME' (w ktorym podawana jest nazwa wykonywanego skryptu).
Jezeli chodzi o klucz 'PHP_SELF', faktycznie podawana wartosc rozni sie od standardowej, jednak w chwili obecnej nie posiadamy mozliwosci ustawienia tej zmiennej w inny sposob. Sugeruje w zwiazku z tym uzywanie zmiennej $_SERVER['SCRIPT_FILENAME'], w celu otrzymania sciezki do wywolywanego skryptu, wraz z jego nazwa.