Jak získat basePath v aplikaci

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

Zdravím, nevíte někdo jak získat basePath v aplikaci, dříve to šlo získat z Environment, ale to bylo myslím odstraněno a já ted netuším kde to získat. Díky za rady.

kravčo
Člen | 721
+
0
-

Nebolo.

joseff
Člen | 233
+
0
-

A jak se tedy dá získat? Toto nefunguje:

\Nette\Environment::getVariable('basePath')
kravčo
Člen | 721
+
0
-

trochu komplikovanejšie, viď https://forum.nette.org/…-na-basepath

\Nette\Environment::getHttpRequest()->getUri()->getBasePath();
jarks
Člen | 94
+
0
-

V Nette 2.0-beta funguje toto:

$x = NEnvironment::getHttpRequest()->getUrl()->getBasePath();

Hlásí, že getUri() je deprecated.

A v Nette 2.0-beta pro PHP 5.3:

$x = Nette\Environment::getHttpRequest()->getUrl()->getBasePath();

Editoval jarks (3. 10. 2011 21:14)

22
Člen | 1478
+
0
-

nevím, nakolik je čisté, ale v presenteru by tě basePath neměla asi zajímat..!?

//asi nečistě
$this->template->basePath
//anebo asi čistě
$this->context->httpRequest->url->basePath
jarks
Člen | 94
+
0
-

22 napsal(a):
…v presenteru by tě basePath neměla asi zajímat..!?

Nerozumím tomu natolik, abych věděl, jestli mě to má zajímat, ale když potřebuju vygenerovat odkaz na soubor pomocí statické funkce, tak se k $this->context->httpRequest->url->basePath nedostanu.

Používám to tak, že v šabloně lze napsat {file_link Název nebo popis:soubor.pdf}. file_link je makro, které vrátí: Document::file_link('Název nebo popis','soubor.pdf'). Pak mám třídu Document, v ní statickou metodu file_link($jmeno, $soubor) a ta dodá zpět do šablony něco jako:

<a href="/www/dokumenty/soubor.pdf">Název nebo popis <span class="flink">(PDF 95 kB)</span></a>

Document::file_link tedy potřebuje znát basePath. Možná to dělám špatně.

Editoval jarks (5. 10. 2011 9:58)

22
Člen | 1478
+
0
-

tak ona jak by se k tomu ta třídá dostala, že.. musíš si to buď poslat do kontruktoru té třídy nebo se na to udělat nějaký setter.

Jan Tvrdík
Nette guru | 2595
+
0
-

Máš nějaký důvod, proč na generování odkazů na soubory nepoužíváš Nette routování?

jarks
Člen | 94
+
0
-

22 napsal(a):
…musíš si to buď poslat do kontruktoru té třídy nebo se na to udělat nějaký setter.

Asi bude lepší, když sem dám kus kódu:

class Document extends Nette\Application\UI\Presenter
{
     /** ověří existenci souboru a vrátí odkaz, nebo chybovou zprávu */
     public static function file_link($name, $file) {
        $ds = DIRECTORY_SEPARATOR;
        $bp = Nette\Environment::getHttpRequest()->getUrl()->getBasePath();
        $fullpath = WWW_DIR . $ds . 'dokumenty' . $ds . $file;

        if (file_exists($fullpath))
            return ' <a href="' . $bp . 'dokumenty/' . $file . '">' . $name . '</a>";
        else
            return $name . ' (<acronym title="' . $file . '">soubor neexistuje<acronym>)';
    }
}

Volá se v šabloně jako {file_link Název nebo popis:soubor.pdf} a to se přeloží jako Document::file_link('Název nebo popis','soubor.pdf').

Mám s tím 2 problémy:

  1. jak se dostat k basePath: řeším použitím Nette\Environment::getHttpRequest()->getUrl()->getBasePath();
  2. jak se dostat k WWW_DIR: řeším vrácením staré konstanty do index.php (neumím se dostat k $this->context->params['wwwDir'];)

Jan Tvrdík napsal(a):
…proč na generování odkazů na soubory nepoužíváš Nette routování?

To nemám. Můžete prosím naznačit, jak to myslíte?

22
Člen | 1478
+
0
-

Myslím, že na to ti snad stačí udělat metodu v nějakým FilePresenteru a máš dostupné vše. Dělat kvůli tomu takhle divně třídu… další možností je nevizuální komponenta.
Jen tak mimochodem, na co ti bude relativní cesta k souboru??? Potřebuješ snad absolutní, ne? Proto ta moje poznámka, že by tě $basePath neměla v presenteru zajímat.

edit: pořád nevím, čeho chceš vlastně docílit?

Editoval 22 (6. 10. 2011 12:48)

jarks
Člen | 94
+
0
-

22 napsal(a):
…pořád nevím, čeho chceš vlastně docílit?

Cílem je, aby si uživatelé mohli samostatně do šablon vkládat odkazy na soubory. Nahrají soubor do vyhrazeného adresáře a použijí makro. Nic jiného, než definice vlastního makra mě nenapadlo. Tím makrem jsem původně generoval přímo HTML kód, ale kvůli cachování to pak nereagovalo na změny souborů (neověřovalo existenci). Proto ta zvláštní statická metoda, která se ze šablon volá.

Odkaz na soubor vzhledem k jeho umístění na webu je snad v pořádku. Funguje to, ať web přesunu kamkoliv.

22
Člen | 1478
+
0
-

pořád moc nechápu..uživatel přece vybere nějaký soubor, ten se uploadne, kam má, tím máš zajištěno, že existuje a někam si na něj případně uložíš cestu, což u tebe netřeba. Pak akorát v nějaké administraci dáš uživateli na výběr s dostupných souborů třeba.. a v šabloně akorát doblníš k nějaké pevně dané cestě název toho souboru…

jarks
Člen | 94
+
0
-

Oni by se dali označit spíš jako „kodéři“. Chtějí si do šablon sami psát texty a dávat odkazy na spoustu souborů. Všechno se poměrně často mění a všelijak upravuje. Nechtějí žádné uploadování, žádnou administraci – prostě přímo otvírají šablony a píšou. Je to jejich požadavek, který vychází ze systému, který používali dřív a na který jsou zvyklí. Pro ně je to docela jednoduché. Musím se jim přizpůsobit.