Absolutní cesty – chyba začátečníka
- Jakub Šulák
- Člen | 222
Zdravím, zkouším Nette podle dokumentace, ale hned na začátku se objevil problém:
Warning: require_once(D:\wt\www/../libs/Nette/loader.php) [function.require-once]: failed to open stream: No such file or directory in D:\wt\app\bootstrap.php on line 6
Fatal error: require_once() [function.require]: Failed opening required ‚D:\wt\www/../libs/Nette/loader.php‘ (include_path=‚.;C:\easyphp\\php5\pear\‘) in D:\wt\app\bootstrap.php on line 6
Apache a PHP mám nainstalován přes EasyPHP a přes to upgrade na PHP
5.2.7.
V conf Apache mám: DocumentRoot „D:\wt/www“
Jede to na Win Vista. Mohu samozřejmě upravit cesty tak, aby require byl v pořádku, ale rád bych využil funkionality Nette, které si ty cesty řídí samo (při přechodu z testovacího na finální server).
Můžete mi poradit, zda nemám vypnutou nějakou direktivu, či tak
něco?
Díky
- Honza Marek
- Člen | 1664
Uprav si require, aby bylo v pořádku. Nejdřív je potřeba nette načíst, aby mohlo samo něco řídit ;-)
- Jod
- Člen | 701
Keď máš v D:/wt/www/public_html/index.php nastavené:
<?php
// 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');
//define('NETTE_DIR', LIBS_DIR . '/Nette'); for compact version
// load bootstrap file
require APP_DIR . '/bootstrap.php';
?>
a v D:/wt/www/app/index.php na začiatku nastavené
<?php
require_once LIBS_DIR . '/Nette/loader.php';
?>
malo by ísť všetko v pohode
Nette by malo byť v D:/wt/www/libs/Nette
Nette funkcionalitu využiť nemôžeš, pretože sa ti nette ani nenačíta :D
Editoval Jod (8. 12. 2008 11:28)
- Jakub Šulák
- Člen | 222
Ale ještě jeden dotaz.
V šabloně @layout.phtml bych potřeboval mít formulář
(vyhledávací form).
Do kterého prezenteru bych měl vložit kód pro vyvolání appForm, tak abych
nemusel mít zdroj. kód na více místech (a nejlépe bez nutnosti require
takového kódu)?
- Honza Marek
- Člen | 1664
Návrh struktury presenters/views
Bylo by dobré vytvořit si nějaký BasePresenter a pak v metodě startup si zadefinovat ten formulář a předat ho šabloně.
- Jakub Šulák
- Člen | 222
jo, díky. myslel jsem, jestli není jiné řešení – nechtěl jsem to moc cpát do této třídy…
- Jakub Šulák
- Člen | 222
nejlepší bude asi vložit ještě „mezi-třídu“…
Jinak musím uznat, že Nette je vážně bezva. Ještě nějak naučím Eclipse, aby mi nabízel ke všem třídám metody a bude.
- Jakub Šulák
- Člen | 222
Jedná se mi o to, že v BasePresenter bych raději řešil pouze věci, které řeším u každého projektu (tedy DB, překladový slovník, apod.) a pak si udělal nějaký XPresenter, kde bych řešil tyto věci pro každý projekt individuální. Ale to už se bavíme o detailech (pokud tedy ty věci, co já chci řešit v BasePresenter se neřeší jinak – jinde).
Nemáte náhodou zkušenost, jak nastavit ten Eclipse? Když nastavím Inlude Path na libs/Nette/ tak mi stejně nefunguje Code Assist…
- romansklenar
- Člen | 655
Jakub Šulák napsal(a):
Ještě nějak naučím Eclipse, aby mi nabízel ke všem třídám metody a bude.
OT: Pokud se zadaří, nestyď se podělit o řešení ;) zatím mi není znám způsob aby eclipse uměl napovídat třeba u tohoto příkladu:
$application = Environment::getApplication();
$requests = $application->getRequests();
$requests->?? // už neví
V PhpEdu mu jde tuším že takhle nějak hezky napovědět:
/** @var PresenterRequest $requests */
$requests->xx // už ví!
EDIT: @Honza M. Nové netbeansy to výše zvládnou? PS: hezčí GUI má bezpochyby Eclipse :P
Editoval romansklenar (8. 12. 2008 14:45)
- Honza Marek
- Člen | 1664
To Roman: Přesně tohle neumí. Jen kdyby to byla třídní proměnná…
class Trida {
/** @var PresenterRequest */
public $request;
public function metoda() {
$this->request->?? // napoví
$r = new PresenterRequest;
$r->?? // napoví
$application = Environment::getApplication();
$requests = $application->getRequests(); // $application->?? napoví
$requests->?? // už neví, ale určitě to do příští verze napraví :-D
}
}
- LM
- Člen | 206
Ono zrovna u Application::getRequests()
neví co by to mělo
napovídat přece jen to vrací pole (phpdoc: array)… Jinak třeba v PhpEd
tohle funguje:
<?php
$application = Environment::getApplication();
$ref = $application->getReflection();
$ref->/*-> export(), getConstant(), getConstants()*/
?>
- Jan Tvrdík
- Nette guru | 2595
Eclipse ani NetBeans nepoužívám, ale zkusili jste verzi pro PHP 5.2 (bez jmených prostoru v phpDoc)?
Editoval Jan Tvrdík (8. 12. 2008 15:27)
- romansklenar
- Člen | 655
LM napsal(a):
Ono zrovna u
Application::getRequests()
neví co by to mělo napovídat přece jen to vrací pole (phpdoc: array)… Jinak třeba v PhpEd tohle funguje:<?php $application = Environment::getApplication(); $ref = $application->getReflection(); $ref->/*-> export(), getConstant(), getConstants()*/ ?>
Pravda, Requests
byl blbý příklad, v Eclipse se to při
Reflection
chová taky tak jak popisuješ (
$ref->/*-> export(), getConstant(), getConstants()*/
) ale
Eclipse už nezvládne napovídání uvnitř třídy jak popisuje Honza:
class Trida {
/** @var Reflection */
public $ref;
public function metoda()
{
$this->ref->?? // nic nepoví
}
}
Na PhpEdu se mi právě líbilo, že kdekoliv v kódu/skriptu (i v jiném než byl objekt inicializován) šlo udělat něco takového:
/** @var Reflection */
$ref;
...
$ref->/* napovídá metody třídy */
Editoval romansklenar (8. 12. 2008 15:43)
- Jakub Šulák
- Člen | 222
S tím přechodem není až takový problém – je to celkem
intuitivní.
Zato Nette mi dělá trochu vrásky na čele :-)
Toto jsou metody prezenteru BasePresenter:
<?php
protected function beforeRender()
{
// definice formuláře
$form = new AppForm($this, 'formname');
$form->addText('name', 'Your name:');
$form->addSubmit('ok', 'Send')
->onClick[] = array($this, 'OkClicked'); // nebo 'OkClickHandler'
/*if (!$form->isSubmitted()) {
// první zobrazení, nastavíme výchozí hodnoty
$form->setDefaults($defaults);
}*/
$this->form = $form;
$this->template->form = $form;
}
// obslužné handlery:
public function OkClicked($button)
{
// submitted and valid
Debug::dump($button->getValues());
//redirect(...);
}
?>
V @layout.phml vypíši $form.
Při odeslání chci zpracovávat přes OkClicked. Ale místo toho chyba
BadSignalException #403 – The signal receiver component ‚formName‘ is not
found..
Prezenter přes který zkouším je odvozen od BasePresenter.
Nějak mi není jasné, proč tu komponentu Nette nemůže najít…
- Jakub Šulák
- Člen | 222
asi nemohu zpracovávat událost v beforeRender() – komponenty nejsou ještě zaregistrované, že?
- Jan Tvrdík
- Nette guru | 2595
Doplním odkaz na nedávno dořešené téma – https://forum.nette.org/…iewtopic.php?…