Výpis hodnot podle vzoru (interface?)

ForestCZE
Člen | 209
+
0
-

Zdravím, rád bych se zeptal, zda lze nějak zjednodušit následující:

Dejme tomu, že mám nějaké články. Vytáhnu si je ve třídě z databáze:

class Trida
{
	public function getArticles($id1, $id2)
	{
		return $this->connection->table('articles')->where('category_id = ? OR category_id = ?', $id1, $id2)->fetchAll();
	}
}

Pak v presenteru:

private $trida;

public function __construct(Trida $trida)
{
        parent::__construct();
        $this->trida = $trida;
}

$this->template->hry = $this->trida->getArticles(1, 2);
$this->template->moda = $this->trida->getArticles(3, 4);
...->getArticles(5, 6);
...

A pak latte:

<h1>Hry</h1>
{foreach $hry as $hra}
	Text: {$hra['text']}<br>
	Autor: {$hra['autor']}
	....
<br><br>
{/foreach}

<h1>Móda</h1>
{foreach $moda as $mod}
	Text: {$mod['text']}<br>
	Autor: {$mod['autor']}
	....
<br><br>
{/foreach}

...

Lze to nějak udělat, abych nemusel ta odvětví posílat každé zvlášť do šablony a neměl třeba 10 cyklů, když je to v podstatě to samé, jen to má jiné hodnoty? Díky.

Editoval ForestCZE (6. 8. 2018 21:24)

RePRO
Člen | 32
+
0
-

Tak si to lépe připrav. Například:

<?php
$kategorie = [];
$kategorie["moda"] = $this->trida->getArticles(1, 2);
$kategorie["hry"] = $this->trida->getArticles(3, 4);
...
$this->template->kategorie = $kategorie;
?>
Barbarossa
Člen | 74
+
+1
-

Minimálně šablonu bych upravil alespoň takto:

{block detail}
	{foreach $hry as $hra}
    	Text: {$hra['text']}<br>
    	Autor: {$hra['autor']}
    	....
	<br><br>
	{/foreach}
{/block}

<h1>Hry</h1>
{include detail hry => $hry}
<h1>Móda</h1>
{include detail hry => $moda}

Případně si můžeš tahat data uvnitř šablony přímo z modelu :

<h1>Hry</h1>
{include detail hry => $trida->getArticles(1, 2)}
<h1>Móda</h1>
{include detail hry => $trida->getArticles(3, 4)}
$this->template->trida = $this->trida;

A v případě, že to je opravdu jen cyklus hodnot tak si do nějakého pole předat názvy kategorií a pak jen něco jako (bez ifů apod):

{foreach $categories as $key => $categoryName}
	<h1>{$categoryName}</h1>
	{include detail hry => $trida->getArticles($key+1, $key+2)}
{/foreach}
Phalanx
Člen | 310
+
0
-

Podle mě to máš špatně navržené už od začátku. Filtrovat si takhle přes id nedává smysl – nejde to přepsat nějak programátorsky? Měl bych už v databázi rozlišenou strukturu co patří do kategorií. Netvoříš náhodou stromovou strukturu?

Jako první mě zaujalo, že používáš vždy dvě id kategorií pro získání článků… Proč místo těch dvou parametrů nepoužiješ jeden (pole, které pak filtruješ přes IN)? Pak mě dál zaujalo, že tam nemáš žádný limit – budeš vždycky vypisovat všechny nebo třeba jen 10 nejnovějších?

<?php
class Trida
{
    public function getArticles($ids)
    {
        if (empty($ids)) {
            return null;
        }

        return $this->connection->table('articles')->where('category_id IN(?)', $ids)->limit(10)->fetchAll();
    }
}
?>
ForestCZE
Člen | 209
+
0
-

@RePRO Díky, ale to moc neřeší můj problém.

@Barbarossa To vypadá dobře, to už bych mohl nějak seskládat :-)

@Phalanx :

  1. Používám dvě ID, protože je to na způsob něco jako – kategorie: PHP, podkategorie: Návody, Pomoc. Mám teda tabulku kategorie, kde jsou sloupce id, kategorie, subkategorie a hodnoty třeba: 1, php, navody. Pak je další tabulka prispevky, kde je id, kategorie_id a další sloupce. A to kategorie_id představuje ID z té první tabulky, aby se to mělo kam zařadit a vypsalo se to jak potřebuju, když to rozkliknu. Jenže na hlavní straně chci vypsat příspěvky z obou podkategorií jedné kategorie ⇒ proto vždy dvě.
  2. Ve skutečnosti mám ten dotaz úplně jinak, kde jsou propojeny dvě tabulky v sobě a limit tam mám 5 příspěvků. Nechtěl jsem tu rozepisovat a dát sem jenom to nutné ⇒ limit mám.

Editoval ForestCZE (7. 8. 2018 14:13)

GEpic
Člen | 562
+
+2
-

@Barbarossa spíš než block bych použil define

ForestCZE
Člen | 209
+
0
-

Barbarossa napsal(a):

Minimálně šablonu bych upravil alespoň takto:

{block detail}
	{foreach $hry as $hra}
    	Text: {$hra['text']}<br>
    	Autor: {$hra['autor']}
    	....
	<br><br>
	{/foreach}
{/block}

<h1>Hry</h1>
{include detail hry => $hry}
<h1>Móda</h1>
{include detail hry => $moda}

Případně si můžeš tahat data uvnitř šablony přímo z modelu :

<h1>Hry</h1>
{include detail hry => $trida->getArticles(1, 2)}
<h1>Móda</h1>
{include detail hry => $trida->getArticles(3, 4)}
$this->template->trida = $this->trida;

A v případě, že to je opravdu jen cyklus hodnot tak si do nějakého pole předat názvy kategorií a pak jen něco jako (bez ifů apod):

{foreach $categories as $key => $categoryName}
	<h1>{$categoryName}</h1>
	{include detail hry => $trida->getArticles($key+1, $key+2)}
{/foreach}

Tak jsem využil tahání dat uvnitř šablony přímo z modelu. Funguje to parádně. Ještě zkusím vymyslet ty názvy kategorií a předávat to komplet. Každopádně díky :)