cizí knihovny

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

Jak prosím řešíte automatické načítání knihoven třetích stran (Zend, vlastní knihovn ..atd) ??

Knihovnu dibi.. nette loader..načítá sám..ale např Zend ne..
díky

rokerkony
Člen | 122
+
0
-

v bootstrapu by meli byt tyto radky

// enable RobotLoader - this allows load all classes automatically
$loader = new RobotLoader();
$loader->addDirectory(APP_DIR); // nahraje vsechny classy z app slozky
$loader->addDirectory(LIBS_DIR); // nahraje vsechny classy z libs slozky
$loader->register();

pak cokoli je v APP_DIR a LIBS_DIR je automaticky nacteno…

kravčo
Člen | 721
+
0
-

Oggy napsal(a):

Knihovnu dibi.. nette loader..načítá sám

Nie, dibi NetteLoader nenačítava, v prípade, že ti funguje, načítavaš ho zrejme sám pomocou require. Ako píše rokerkony, na automatické načítanie dibi či Zendu je vhodný RobotLoader.

Oggy
Člen | 306
+
0
-

samozřejmě robotloader používám.. a cestu k dibi jsem pomocí require nenačítal.. proto mi přišlo zvláštní, že dibi najde a zend ne..

Ještě: v některých examples je použit např. new Zend_Mail() ..přestože v adresářové struktuře by to mělo znamennat Zend/Mail ..?

kravčo
Člen | 721
+
0
-

Oggy napsal(a):

samozřejmě robotloader používám.. a cestu k dibi jsem pomocí require nenačítal.. proto mi přišlo zvláštní, že dibi najde a zend ne..

NetteLoader a RobotLoader sú rozdielne loadery… V prípade, že máš RobotLoader nastavený na adresár s knižnicami (napríklad /libs), načíta ti automaticky všetko z tohto adresára.

Ještě: v některých examples je použit např. new Zend_Mail() ..přestože v adresářové struktuře by to mělo znamennat Zend/Mail ..?

Ak sú medzi knižnicami (v adresári /libs) i triedy Zendu, načíta ich tiež a nezáleží, že používajú mennú konvenciu – RobotLoader ju nevyžaduje.

Oggy
Člen | 306
+
0
-

tak potom je chybka jinde..ale pořád : Class ‚Zend_Mail‘ not found

hrach
Člen | 1838
+
0
-

zkus promazat cache ;)

Patrik Votoček
Člen | 2221
+
0
-

Tady na fóru už snad po 1000000… promaž temp.

Oggy
Člen | 306
+
0
-

hrach napsal(a):

zkus promazat cache ;)

bohužel nepomáhá..:-(

a mohl bych poprosit ještě o dovysvětlení.. toho podtržítka?.Zend_Mail.. on hledá ve složce Zend adresář Mail?

rokerkony
Člen | 122
+
0
-

ja treba zend_mail pouzivam takhle…:
$mail = new Zend_Mail('UTF-8');
kde to kodovani je nepovinny parametr… takze uz v nazvu to ‚Zend_‘ je… a melo by i byt.. jestli sem teda pochopil spravne tak asi volas Mail ? nebo ne?

kravčo
Člen | 721
+
0
-

Oggy napsal(a):

a mohl bych poprosit ještě o dovysvětlení.. toho podtržítka?.Zend_Mail.. on hledá ve složce Zend adresář Mail?

kravco napsal(a):

V prípade, že máš RobotLoader nastavený na adresár s knižnicami (napríklad /libs), načíta ti automaticky všetko z tohto adresára.

Je úplne jedno, kde je trieda umiestnená v rámci adresára s knižnicami, podstatné je, aby sa volala „Zend_Mail“.

Oggy
Člen | 306
+
0
-

ne ne.. volam Zend_Mail.. jen jsem myslel, že loader.. hledá podle názvu třídy stejnou složku..

index.php

<?php
// absolute filesystem path to the libraries
define('LIBS_DIR', WWW_DIR . '/../libs');
?>

bootstrap.php

<?php
$loader = new RobotLoader();
$loader->addDirectory(APP_DIR);
$loader->addDirectory(LIBS_DIR);
$loader->register();
?>

AuthPresenter

<?php
private function passwordSend($adresa,$jmeno)
   {
        $email = $this->createTemplate();
        $email->setFile(Environment::expand('%templatesDir%/emails/new-password.phtml'));
        $email->name = $name; // naplníme nějaká data
        $email->headers = (object) NULL;
        $body = (string) $email; // vyrenderujeme šablonu už nyní
        $mailer = new Zend_Mail('UTF-8');
        $mailer->setBodyText($body);
        $mailer->setFrom($email->headers->from);
        $mailer->addTo($adresa, $jmeno);
        $mailer->setSubject($email->headers->subject);
        $mailer->send();
        }
?>

Editoval Oggy (31. 5. 2009 21:44)

rokerkony
Člen | 122
+
0
-

co se tyce zrovna tridy zend_mail tak jsou tam i trosku problemy v requirech ..
nevim jestli to bude tenhle problem ale zkus pridat do bootstrap tohle:

set_include_path(implode(PATH_SEPARATOR, array(
		LIBS_DIR,
		get_include_path()
)));
Oggy
Člen | 306
+
0
-

bohužel..ale děkuju za radu..

rokerkony
Člen | 122
+
0
-

tak zkus tridu Zend_Mail v bootstrapu required-nout natvrdo… sice to neni idealni reseni ale mozna se tim zjisti kde je problem

Oggy
Člen | 306
+
0
-

Solved..jsem vosel.. nakopíroval jsem si složku Zend do libs s domněním, že je to knihovna Zendu.. ale měl tu ještě složku Zend, ve které jsem měl některé projekty.. takže moje banální chyba, která se hledá těžko :-)

jinak k úspěšnému požití Zend_Mail je opravdu třeba:
>

set_include_path(implode(PATH_SEPARATOR, array(
		LIBS_DIR,
		get_include_path()
)));
Panda
Člen | 569
+
0
-

Problém je sice již vyřešen, nicméně padaly zde nějaké dohady ohledně skutečné funkce RobotLoaderu, tak se je pokusím uvést na pravou míru.

RobotLoader, jak již název napovídá, při prvním běhu aplikace proběhne všechny složky, které jsou mu podstrčeny metodou RobotLoader::addDirectory(). Ve složkách hledá PHP scripty a sestavuje si seznam, ve kterém souboru jsou jaké třídy a jaké jsou jejich závislosti (interface, dědičnost). Tento seznam si pro zvýšení výkonu uloží do cache a pak se jím podle potřeby řídí.

Důležité je to, že RobotLoaderu je v podstatě jedno, v jaké složce a v jakém souboru jaká třída sídlí, on si vše najde sám (samozřejmě pokud je mu poskytnuta správná cesta v RobotLoader::addDirectory()).

Nutno také podotknout, že RobotLoader je slušně vychovaný a zohledňuje soubor netterobots.txt, který mu říká, jaké podsložky má vynechat. Tohoto souboru je využito u dibi, které je přizpůsobeno k použití bez Nette a obsahuje některé součásti jeho součásti (konkrétně rozhraní IDebuggable), které by způsobovaly kolize (InvalidStateException("Ambiguous class '$class' resolution ...");), a includes driverů si obstarává samo, tak není potřeba je projíždět RobotLoaderem:

Disallow: /drivers
Disallow: /Nette