Jak získat basePath v aplikaci
- kravčo
- Člen | 721
trochu komplikovanejšie, viď https://forum.nette.org/…-na-basepath
\Nette\Environment::getHttpRequest()->getUri()->getBasePath();
- jarks
- Člen | 94
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)
- Jan Tvrdík
- Nette guru | 2595
Máš nějaký důvod, proč na generování odkazů na soubory nepoužíváš Nette routování?
- jarks
- Člen | 94
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:
- jak se dostat k
basePath
: řeším použitímNette\Environment::getHttpRequest()->getUrl()->getBasePath();
- jak se dostat k
WWW_DIR
: řeším vrácením staré konstanty doindex.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
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
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
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
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.