kontrola existence obrázku v šabloně
- besir
- Člen | 170
Já jsem asi dement, ale nemůžu přijít na to, jak zkontrolovat existenci obrázku v šabloně. Skládám název obrázku až když proicházim pole a potřebuji při neexistenci obrázku zobrazit jiný defaultní. Zkoušel jsem věci jako např.
{if file_exists($baseUri.'/images/categories/'.$category->slug.'jpg')}
<img src="/images/categories/{$category->slug}.jpg" alt="{$category->name}" />
{else}
<img src="/images/videos/video1.jpg" alt="{$category->name}" />
{/if}
nebo misto file_exists() is_file(), ale nefunguje, vsude to vraci false takže ten defaultní obrázek. Když takhle ovšem nechám adresu obrázku tak adresa samozřejmě funguje. :-)
Děkuju za pomoc.
- Eda
- Backer | 220
Jedna z možností, proč to nefrčí, je:
V $baseUri
máš asi něco jako
http://localhost/tvujweb/www
, ale nastavení PHP nedovoluje
otestovat funkcí file_exists URL. Tzn. potřebuješ spíš něco jako
‚../../www/‘ (to závisí na tvojí adresářové struktuře, zkrátka
relativní cestu od skriptu ke složce obrázků).
- h4kuna
- Backer | 740
Ahoj dělal jsem se ukázkou a funguje, tak doufám že to použiješ. :)
v BasePresenteru metoda createTemplate, zaregistruj helper
<?php
public function createTemplate($class = NULL) {
$tpl = parent::createTemplate($class);
$tpl->registerHelper('checkImage', callback($this, 'checkImage'));
return $tpl;
}
?>
do toho samého presenteru si dej
<?php
public function checkImage($name, $alt = NULL) {
$path = '/images/categories/'; // toto si podle pořeby hoď třeba do konfiguráku
$www = $this->context->parameters['wwwDir'];
$url = $this->template->baseUrl;
if ($alt) {
$alt = "alt=\"$alt\" ";
}
if (file_exists($www . $path . $name)) {
$info = @getimagesize($www . $path . $name); // testne zda je opravdu obrázek a použijem rozměry, jeli to potřeba
if ($info) {
return $alt . 'src="' . $url . $path . $name . '" ' . $info[3];
}
}
return $alt . 'src="' . $www . '/images/videos/video1.jpg"';
}
?>
a v šabloně bude něco takového
<img {=$category->slug.'jpg'|checkImage:$category->name} />
EDIT
teď mi tak trklo že ten file_exists tam byt nemusí a nechá se nahradit
getimagesize
<?php
public function checkImage($name, $alt = NULL) {
$path = '/static/images/'; // toto si podle pořeby hoď trřba do konfiguráku
$www = $this->context->parameters['wwwDir'];
$url = $this->template->baseUrl;
if ($alt) {
$alt = "alt=\"$alt\" ";
}
$info = @getimagesize($www . $path . $name); // testne zda je opravdu obrázek, zda existuje a použijem rozměry, jeli to potřeba
if ($info) {
return $alt . 'src="' . $url . $path . $name . '" ' . $info[3];
}
return $alt . 'src="' . $www . '/images/videos/video1.jpg"';
}
?>
Editoval h4kuna (26. 7. 2012 8:13)
- stefi023
- Člen | 71
piskotek napsal(a):
Call to undefined method Nette\Templating\FileTemplate::checkImage().
Nemas zaregistrovany helper v sablone…
Kde volas ono registrovani:
$tpl->registerHelper('checkImage', callback($this, 'checkImage'));
???
Pokud v presenteru tak jak je napsano vyse:
public function createTemplate($class = NULL) {
$tpl = parent::createTemplate($class);
$tpl->registerHelper('checkImage', callback($this, 'checkImage'));
return $tpl;
}
tak se se ti pravdepodobne sablona nevytvari pres tu funkci
createTemplate
…
nerenderujes nahodou komponentu? pak si tu registraci helperu musis dat i do ni
(a samozrejme i tu vlastni funkci checkImage
, resp na ni spravne
odkazat v callbacku)…
pripadne rovnou do vsech sablon pomoci DIC, ale to je jina kapitola, pokud s nette zacinas…
Editoval stefi023 (7. 12. 2012 16:47)
- piskotek
- Člen | 35
nemel jsem to v komponente, tak jsem to tam dal, ale vyskocila na me dalsi potvora
Cannot read an undeclared property MySlider::$context.
netbeans mi doporucil vytvorit public $context = "";
tak jsem to zkusil a pak mi zas vyskocilo tohle
Trying to get property of non-object
a oznacenej tento radek
$www = $this->context->parameters['wwwDir'];
asi do toho brzo kopnu :)