Absolutní cesty – chyba začátečníka

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

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
+
0
-

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
+
0
-

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
+
0
-

moje blbost, Nette bylo v D:/wt/www/libs/ nikoliv D:/wt/www/libs/Nette

Jakub Šulák
Člen | 222
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.

Jod
Člen | 701
+
0
-

Prečo by sa to nemalo pchať do presenteru, kde inde by sa mal formulár vytvárať? Pre spoločné prvky je ideálny BasePresenter, veď predsa aj nato slúži inheritácia.

Jakub Šulák
Člen | 222
+
0
-

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
+
0
-

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
+
0
-

Eclipse eclipse… Zkus netbeansy… napovídají samy a jsou hezčí :-D

Honza Marek
Člen | 1664
+
0
-

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
+
0
-

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()*/
?>
Jakub Šulák
Člen | 222
+
0
-

Nemilé… tak tedy netbeans…

Jan Tvrdík
Nette guru | 2595
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

asi nemohu zpracovávat událost v beforeRender() – komponenty nejsou ještě zaregistrované, že?

romansklenar
Člen | 655
+
0
-

Ano přesně tak, viz dokumentace.

Jan Tvrdík
Nette guru | 2595
+
0
-

Doplním odkaz na nedávno dořešené téma – https://forum.nette.org/…iewtopic.php?…