Jak zapouzdřit Nette do jiné aplikace?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ladis-s
Člen | 53
+
0
-

Narazil jsem na problém. Píšu v Nette aplikaci na provizní systém k e-shopu a potřebuji ji zakomponovat do e-shopu (Prestashop). Jde mi o to, pokaždé, když přijde návštěvník na web, tak aby byla aplikace zavolána a nezávisle na e-shopu provedla svou činnost – zalogovala návštěvníka.
z Nette potřebuji pracovat s configem, databází a modely.
Vytvořil jsem si tedy třídu, kterou volám při načítání e-shopu, která načte Nette a provede požadovanou akci:

class Provize
{
	public	function __construct(){
		// the identification of this site
		define('SITE', '');
		// absolute filesystem path to the web root
		define('WWW_DIR', dirname(__FILE__));
		// absolute filesystem path to the application root
		define('APP_DIR', WWW_DIR . '/app');
		// absolute filesystem path to the libraries
		define('LIBS_DIR', WWW_DIR . '/libs');
		// absolute filesystem path to the temporary files
		define('TEMP_DIR', WWW_DIR . '/temp');

		require LIBS_DIR . '/Nette/loader.php';

		// Enable NDebug for error visualisation & logging
		NDebug::$strictMode = TRUE;
		NDebug::enable(NDebug::DEVELOPMENT);//

		// Load configuration from config.neon file
		NEnvironment::loadConfig();

		// Configure application
		$application = NEnvironment::getApplication();
		$application->errorPresenter = 'Error';
		//$application->catchExceptions = TRUE;

		// Configure database connection
		dibi::connect((array)NEnvironment::getConfig('database'));
	}
	public function ulozProklik(){
		---- kód aplikace ----
	}

Z e-shopu pak funkci volám následovně:

$provize = new Provize;
$provize->ulozProklik();

Problém je v tom, že se mi pak Nette motá o e-shopu, např. Loader se snaží načítat třídy se kterými pracuje e-shop.
Potřeboval bych nějak funkci Nette zapouzdřit. Je to možné? Nebo mám celkový přístup k problému špatně?

Díky za rady

Jan Endel
Člen | 1016
+
0
-

V config.ini lze nastavit jake slozky ma robot loader indexovat.

Ladis-s
Člen | 53
+
0
-

Hlásí mi to následující chybu: Class ‚Cookie‘ not found

21:    // Init Cookie
22:    $cookie = new Cookie('ps');
23:
24:    // Switch language if needed and init cookie language
25:    if ($iso = Tools::getValue('isolang') AND Validate::isLanguageIsoCode($iso) AND ($id_lang = intval(Language::getIdByIso($iso))))
26:        $_GET['id_lang'] = $id_lang;

Chybu mi vypisuje Laděnka z Nette a přitom se jidná o kód z eshopu. Eshop i Nette jsou v různých složkách. Nějak to nechápu.
Ideální by bylo, kdyby si Nette svojí práci udělal někde na pozadí, úplně odděleně od eshopu. Myslel jsem, že zapouzdření do objektu tohle umožní.

kravčo
Člen | 721
+
0
-

Nette ukazuje chybu z eshopu, pretože chyba je tam. Nette odchytáva aj klasické PHP chyby a chyby iných skriptov a zobrazuje ich prívetivým spôsobom (prívetivá ladenka).

Ladis-s
Člen | 53
+
0
-

Problém je v tom, že když zakomentuji část, která načítá Nette, tak shop bez chyby naběhne. Nevím jestli nějak změní přednastavené cesty, nebo něco jiného, že e-shop nenajde cestu ke třídě, kterou normálně používá.
Co se může po načtení Nette změnit?
Shop je ve složce /www
Nette aplikace je v /www/provizni-system

při načítání eshopu používám:

require_once('provizni-system/Provize.php');

$provize = new Provize;
$provize->ulozProklik();
Tharos
Člen | 1030
+
0
-

Podle mě je problém zde. Nette si registruje svůj vlastní autoloading nenalezených tříd a evidentně přebíjí mechanismus toho e-shopu.

Editoval Tharos (13. 4. 2011 15:04)

Ladis-s
Člen | 53
+
0
-

A je to nějak efektivně řešitelné?

Tharos
Člen | 1030
+
0
-

Řešením by mohlo být povolit RobotLoaderu indexovat i Prestashopové třídy. Chtělo by vyzkoušet, jak moc by to bylo použitelné – ono totiž RobotLoaderu enormní množství souborů také zrovna dvakrát nesvědčí (zejména při prvotním indexování) a nevím, jak na tom z tohoto hlediska Prestashop je.

No a jinak by asi šlo zjistit, jaký loader si registruje Prestashop, a po ukončení Nette části kódu vlastoručně opět vrátit handler na Prestashop variantu. Bohužel, Nette si i bez použití RobotLoaderu vždycky nějaký loader zaregistruje (základní je NetteLoader).

Editoval Tharos (13. 4. 2011 15:29)

kravčo
Člen | 721
+
0
-

Tharos napsal(a):

Podle mě je problém zde. Nette si registruje svůj vlastní autoloading nenalezených tříd a evidentně přebíjí mechanismus toho e-shopu.

Nette by malo do autoload stacku iba pridať ďalší autoloader, nemalo by prebiť dovtedajšie…

Ako overenie by mohlo poslúžiť var_dump(spl_autoload_functions()); na začiatku, tiež po načítaní e-shopu a nakoniec po načítaní Nette.

Ladis-s
Člen | 53
+
0
-

Díky za rady, zatím jsem to vyřešil tak, že Nette aplikaci načítám až na konci načítání e-shopu. Zkusím ještě to, co píšete.