kontrola existence obrázku v šabloně

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

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

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

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)

besir
Člen | 170
+
0
-

Ahoj, super dekuju :-) Jen jsem udelal par uprav, pač používám loader na helpery, ale výrazně mi to pomohlo k cíli :-)

piskotek
Člen | 35
+
0
-

ahoj, s nette začínám a řeším stejný problém,
udělal jsem to dle uvedeného kódu, ale háže mi to chybu: Nette\MemberAccessException

Call to undefined method Nette\Templating\FileTemplate::checkImage().

mohl by mi někdo poradit/nakopnout?

stefi023
Člen | 71
+
0
-

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

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 :)

stefi023
Člen | 71
+
0
-

piskotek napsal(a):>
asi do toho brzo kopnu :)

Nekopej :) context je dostupny jen v presenteru, tzn bud

$www = $this->presenter->context->parameters['wwwDir'];

nebo si ho (context) tam injectni, nebo jeste lepe pouze to to potrebujes… (wwwDir)

piskotek
Člen | 35
+
0
-

parada, dekuju moc, uz to frci :)