jak na neexistující obsah v related

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

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.

Šaman
Člen | 2666
+
+3
-

Už to dotazování v šabloně je špatně. Vpodstatě si šablona sama volá sql dotaz. Dělej to v presenteru a tam si to ošetři konvenčním způsobem.

Myiyk
Člen | 321
+
0
-

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>
Myiyk
Člen | 321
+
0
-

@Š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.

Editoval Myiyk (7. 6. 2014 23:26)

qteck
Člen | 164
+
0
-

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

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

jo už tomu rozumím, díky, tohle vypadá rozhodně líp :-)))) )) ) ) ))) ))

qteck
Člen | 164
+
0
-

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.

qteck
Člen | 164
+
0
-

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.

Šaman
Člen | 2666
+
0
-

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

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

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

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

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);}
Oli
Člen | 1215
+
+1
-

Jsem na mobilu, tak to píšu z hlavy, ale co to dat do jednoho dotazu? Něco jako

$context->table('Gallery')->select(gallery.*, :gallery_Pictures.name AS picture_name);

to by neslo?