Jak zapouzdřit Nette do jiné aplikace?
- Ladis-s
- Člen | 53
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
- Ladis-s
- Člen | 53
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í.
- Ladis-s
- Člen | 53
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
Ř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
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.