jak na neexistující obsah v related
- qteck
- Člen | 164
Ahoj,
mám takovýto kus kódu:
{var $relatedName = @$gallery->related('gallery_pictures')->limit(1)->fetch()->name;}
<h3><a href="{plink UkazGalerii: $gallery->id}-{$gallery->name}">{$gallery->name}</a></h3>
<a href="{plink UkazGalerii: $gallery->id}-{$gallery->name}">
<img src="{$basePath}/images/{$relatedName?'galleries/'.$gallery->id.'/resized/'.$relatedName:'empty_gallery.png'}" alt="fotos">
</a>
Předpokládám že je z tohoto víceméně všechno ostatní jasné.
ao co jde? Jde o @, co si o tom myslíte? V podstatě když tam není žádná souvisejcí fotka, tak to prostě hlásí chyby že volám neobjekt.
Toto bylo jediné řešení které mě napadlo, ale obecně z obecného hlediska se prostě operátor ticha nedoporučuje používat.
- Myiyk
- Člen | 321
Stačí si prvně ověřit, co ten fetch vrací.
Pokud nevrátí false, můžeš načítat data.
{var $relatedName = $gallery->related('gallery_pictures')->limit(1)->fetch()}
<h3><a href="{plink UkazGalerii: $gallery->id}-{$gallery->name}">{$gallery->name}</a></h3>
<a href="{plink UkazGalerii: $gallery->id}-{$gallery->name}">
<img src="{$basePath}/images/{$relatedName?'galleries/'.$gallery->id.'/resized/'.$relatedName->name:'empty_gallery.png'}" alt="fotos">
</a>
- qteck
- Člen | 164
Jk řekl myiyk, ten problém přeci vězí v tom žev presenteru se to jen tak ošetřit nedá, když se tydatanačítají až z toho foreachu.
to byse přcimuselo nakopat z pole do pole užv presenteru z db do nějákehopole a pak z toho foreach, ale není to příliš, není tohle jednoduší, ikdyž je to trochu proti?
- Pavel Macháň
- Člen | 282
qteck napsal(a):
Jk řekl myiyk, ten problém přeci vězí v tom žev presenteru se to jen tak ošetřit nedá, když se tydatanačítají až z toho foreachu.
to byse přcimuselo nakopat z pole do pole užv presenteru z db do nějákehopole a pak z toho foreach, ale není to příliš, není tohle jednoduší, ikdyž je to trochu proti?
Myiyk napsal(a):
@Šaman: mohl bys to prosím vysvětlit podrobněji?
Někdy také používám takovýto způsob zápisu, že se volá SQL v šabloně. O jiném řešení nevím.
class MyPresenter extends .... {
public function actionSomething(){
$gallery = .....;
// Ted to na hulváta posílám do šablony, ale můžeš to nějak ošetřit
$this->template->picture = $gallery->related('gallery_pictures')->limit(1)->fetch();
$this->template->gallery = $gallery;
}
}
// template
<h3><a href="{plink UkazGalerii: $gallery->id}-{$gallery->name}">{$gallery->name}</a></h3>
<a href="{plink UkazGalerii: $gallery->id}-{$gallery->name}">
{if $picture}
<img src="{$basePath}/images/galleries/{$gallery->id}/resized/{$picture->name}" alt="fotos">
{else}
<img src="{$basePath}/images/galleries/{$gallery->id}/resized/empty_gallery.png" alt="fotos">
{/if}
</a>
Prostě si ty data vytaháš už v akci nebo renderu presenteru a vložíš už do šablony potřebné data. V šabloně už podle dostupných dat vykreslíš to co potřebuješ.
Editoval EIFEL (8. 6. 2014 0:04)
- qteck
- Člen | 164
no jo vlastně,ale já jsem pořád tam kde jsem, protože tu chybu vyhazuje ten dotaz, ten se položí vždycky a až potom vím co v něm je, takže tak či tak hodí chybu. takže tam musím šoupnout @, nebo nepadá vás jak to konkrétně udělat?
Jediné snad co bych mohl udělat je šoupnout tam další select a kouknout jesli tam v té tabulce prostě je co hledám dřívnež položim related, ale to je taky na hulváta a navíc, pak už related nepotřebuji.
- Šaman
- Člen | 2666
Zjisti si, co ti vrátí
$gallery->related('gallery_pictures')->limit(1)->fetch();
.
Podle toho na tom buď budeš volat ->name
, nebo ne. NDbT teď
v hlavě nemám, ale možná bude stačit v šabloně kontrolovat:
{if $gallery}
<h3><a href="{plink UkazGalerii: $gallery->id}-{$gallery->name}">{$gallery->name}</a></h3>
<a href="{plink UkazGalerii: $gallery->id}-{$gallery->name}">
{if $picture}
<img src="{$basePath}/images/galleries/{$gallery->id}/resized/{$picture->name}" alt="fotos">
{else}
<img src="{$basePath}/images/galleries/{$gallery->id}/resized/empty_gallery.png" alt="fotos">
{/if}
</a>
{/if}
Vlastně koukám, že totéž ti radí už @Myiyk ve třetím příspěvku.
- Šaman
- Člen | 2666
qteck napsal(a):
a teď ještě jeden problém. Ona je o totiž tabulka, tedy předpokládám že to vyhazuje selection a to je důvod proč ten dotaz related je až v šabloně. Protože potřebuji dostat nejdříve specifický řádek a k němu souvisejcí obrázek.
a teď babičko raď.
Díky.
Jak jsem psal, do NDbT moc nedělám, tak možná ten related v šabloně
není chybný. V ORM se v šabloně ke všemu přistupuje jako k objektům,
ale NDbT je dost specifická – vychází z NotORM.
Takže to jen rozděl na dva řádky, v prvním dostaneš objekt, nebo false a
podle toho v tom druhém budeš dotazovat dál.
{? $relatedPicture = $gallery->related('gallery_pictures')->limit(1)->fetch();}
{? $relatedName = ($relatedPicture ? $relatedPicture->name : NULL);}
<h3><a href="{plink UkazGalerii: $gallery->id}-{$gallery->name}">{$gallery->name}</a></h3>
<a n:if="$relatedName" href="{plink UkazGalerii: $gallery->id}-{$gallery->name}">
<img src="{$basePath}/images/{$relatedName?'galleries/'.$gallery->id.'/resized/'.$relatedName:'empty_gallery.png'}" alt="fotos">
</a>
Píšu to z hlavy, kdyby ti to házelo errory, tak to holt rozepiš na samostatná makra {if} a {var}
Editoval Šaman (8. 6. 2014 4:09)
- qteck
- Člen | 164
tak to je řešeníjakse zbavit @, ale namítnul jsi, že Related v šabloně není dobré. Takže to vyřeší @ ale dotaz tam furt bude muset být.
jediná možnost, jak ten dotaz vyndat se mi jeví to naházet v presenteru do polí ale to je zae foreach navíc. takhle to není úplně košér ale co se výkonu týče nejlepší řešení.
- qteck
- Člen | 164
já byl v noci zase na kaši, teď jsemsi všiml, že jsem neposlalten foreach, ve skutečnosti to vypadá takto:
**<div n:foreach="$galleries as $gallery" class="gallery_section">**
{var $relatedName = @$gallery->related('gallery_pictures')->limit(1)->fetch()->name;}
<h3><a href="{plink UkazGalerii: $gallery->id}-{$gallery->name}">{$gallery->name}</a></h3>
<a href="{plink UkazGalerii: $gallery->id}-{$gallery->name}">
<img src="{$basePath}/images/{$relatedName?'galleries/'.$gallery->id.'/resized/'.$relatedName:'empty_gallery.png'}" alt="fotos">
</a>
<div class="content">{$gallery->related('gallery_pictures')->count('*')} obrázků</div>
<div class="created">{$gallery->added|date:'j.n.Y'}</div>
</div>
rozumím tomu o čem mluvíte, ale já potřebuju vždy souvisejcí záznam tady k tomu co vyhodí ten foreach, to tím způsobem který vy popisujete prostě nelze.
jediné řešení bych řekl je to naházet do polí v presenteru, kde si přiřadim ty souvisejcí záznamy a poté to vypsat v šabloně, ale to je foreach navíc.
tak co tedy? nemám šajna co je lepší, osobně vždy říkám to nejjednoduší je to nejlepší a nejjednoduší aji nejčitelnější se mi jeví ten můj zápis, navzdory tomu že je to proti mvc.
Co vy na to?
Editoval qteck (8. 6. 2014 18:54)
- Šaman
- Člen | 2666
Rozepiš ten jeden řádek se zavináčem na dva. Je jedno, zda je to ve
foreach, nebo není. Prostě nemůžeš volat ->name
, když
neviš, jestli ti to v databázi najde záznam.
{? $relatedPicture = $gallery->related('gallery_pictures')->limit(1)->fetch();}
{? $relatedName = ($relatedPicture ? $relatedPicture->name : NULL);}