Diskuze: MVC architektura

PHP PHP MVC architektura American English version English version

Avatar
Marthyn
Člen
Avatar
Marthyn:

Zdravím,
snažím se nějak osvojit MVC architekturu, ale narazil jsem na jeden problém

Když si chci napsat metodu na vypsání tabulky (pomocí foreach -> klíče pole <th> hodnoty <td>), kam mám tuto metodu uložit? V modelech a kontrolech "správně" nemá být html kód, ale v pohledech má být jen základní logika php.

Nejpohodlnější je pro mě si to uložit do nějakého "obecného" modelu ze kterého si jen tuto medotu zavolám v případě potřeby, ale to asi není to pravé?

 
Odpovědět 3.3.2014 22:02
Avatar
Odpovídá na Marthyn
Martin Konečný (pavelco1998):

Model ti vrátí akorát to pole. Ve View si pak můžeš udělat metodu, která ti z těch dat vykreslí tu tabulku.

Např.

// Model
public function getData()
{
  return $this->db->fetchAll("SELECT * FROM `table`");
}

// View
private function renderTable()
{
  $data = $this->model->getData();
  $r = "";

  $r .= "<table>";
  foreach ($data as $key => $val) {
     $r .= "<tr><th>{$key}</th><td>{$val}</td></tr>"
  }
  $r .= "</table>";

  return $r;
}

public function __toString()
{
   return "..." . $this->renderTable();
}

Záleží, jak přesně vypadá View (zda je to nějaká třída nebo šablona).

 
Nahoru Odpovědět 3.3.2014 22:13
Avatar
Marthyn
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Marthyn:

Ano, v modelu tahám data z databáze a dám si je do pole. Dále mám podobnou metodu, která mi z toho pole udělá tabulku.

Jenže mi nejspíše trochu splívají pojmy "Pohled(View)" a "Šablona".

Z toho co jsem se dočetl, se View jako třída nemá používat, dokonce se na žádnou třídu ani nemá přímo odkazovat...
Tak jak používat View jinak než šablonu?

 
Nahoru Odpovědět 3.3.2014 23:37
Avatar
Odpovídá na Marthyn
Martin Konečný (pavelco1998):

View je vrstva, která data zobrazí. Jako viewer můžeš mít i normální PHP třídu, ale nejčastěji se používají šablony.
Kdybych kód, co jsem postnul, hodil do šablony, vypadalo by to třeba takhle:

// Model zůstane stejný

// Controller
public function renderPage()
{
  $this->template->data = $this->model->getData();
}

// šablona
<table>
{foreach $data as $key => $val}
  <tr><th>{$key}</th><td>{$val}</td></tr>
{/foreach}
</table>
Editováno 4.3.2014 0:30
 
Nahoru Odpovědět 4.3.2014 0:30
Avatar
Marthyn
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Marthyn:

Jasně, ale když to vezmu na základě tohodle seriálu, tak kam s metodou VytvorTabulku, když všechny Pohledy jsou prakticky šablony?

Editováno 4.3.2014 14:01
 
Nahoru Odpovědět 4.3.2014 14:00
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Marthyn
David Čápka:

Já nevím, proč pokládáš takové zbytečné otázky, když se to dále v seriálu všechno ukazuje.

Nahoru Odpovědět 4.3.2014 14:13
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Marthyn
Člen
Avatar
Odpovídá na David Čápka
Marthyn:

Pokládám takovou otázku, protože jsem na to v celém seriálu nenarazil, případně jsem to z něj nepochopil.

Nenarazil jsem tady ani na práci s komponentami a ani na vytváření tříd v pohledu.

A jelikož je na internetu mnoho vysvětlení MVC architektury a tahle se mi zdála nejlepší, tak se ptám tady s nadějí že mě někdo nakopne.

V literatuře je pořád co se nesmí a nemá, ale ukázku praktického použití lze najít těžko.

 
Nahoru Odpovědět 5.3.2014 9:18
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Marthyn
David Čápka:

Seriál tvoří funkční web v MVC architektuře, takže úplně nechápu, jak jsi v něm mohl nenarazit na tak základní věc, jako je práce s komponentami :D Promiň, ale jsem jen člověk a asi nejsem dostatečně silný na to, abych se ti to snažil vysvětlovat. Napsal jsi takové nesmysly, že jsi snad nečetl ani ten úvodní díl. Přečti si to prostě znovu a ten web si naprogramuj, potom to pochopíš.

Nahoru Odpovědět 5.3.2014 9:31
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Marthyn
Člen
Avatar
Odpovídá na David Čápka
Marthyn:

Ano opět jsem se špatně vyjádřil, myslel jsem externí komponenty nebo jak to nazvat - já si to bez předešlých znalostí nazval prostě knihovny (jQuery,TinyMCE a jiné).

Každopádně, nečekal jsem, že mi to budeš zrovna ty vysvětlovat, protože je nepřéhlednutelné, jaký máš přístup k "nováčkům", jen jsem marně doufal že se někdo slituje a aspoň mi naznačí ve které části se řeší něco podobného.

 
Nahoru Odpovědět 5.3.2014 10:13
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Marthyn
David Čápka:

Nikdo se neslituje, protože co tady předvádíš nemá hlavu ani patu. Až položíš srozumitelnou otázku, tak dostaneš srozumitelnou odpověď. Pokud nejsi schopný pochopit zdejší MVC seriál, tak jdi na jednodušší seriály, jako PHP nebo OOP v PHP. Všechno tady je a spoustu lidí se z toho naučilo, takže se budeš muset asi více snažit.

Nahoru Odpovědět 5.3.2014 10:29
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Marthyn
Člen
Avatar
Odpovídá na David Čápka
Marthyn:

Ano mé dotazy jsou nejspíš hloupé, ale tvůj postoj je na tom dle mého názoru hůř...
V každém případě tě obdivuji, kolik toho umíš naprogramovat a je dobře že se věnuješ tomu co ti jde a né práci s lidmi ;)

Ale rozhodně se tu nechci s tebou hádat, takže na tvé vyjadřování na mou osobu budu brát již nebudu brát v potaz.

Jen si stále myslím, že ve tvém seriálu jsou pouze tři komponenty, s čímž si nevystačím a to byla podstata mých otázek, se kterými se teda obrátím na někoho jiného.

Díky za pomoc a rady

 
Nahoru Odpovědět 5.3.2014 10:58
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Marthyn
Petr Nymsa:

Ach jo. Kdyby jsi pořádně chápal OOP nebudeš se ptát. Je jedno jestli pracuješ s komponentou Galerie, Kontaktní formulář. Všude to je stejné. Odpověděl bych ti i já úplně stejně. Sdracem to opravdu není.

Nahoru Odpovědět 5.3.2014 11:03
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Marthyn
David Čápka:

Tobě opravdu není pomoci, tak trochu jsem doufal, že konečně zkonstruuješ nějakou otázku. Prací s lidmi se živím, takže to jsi trochu nestrefil. Jak se říká, chytrému napověz, hloupého kopni.

Nahoru Odpovědět 5.3.2014 11:04
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
František Nesnídal
Neregistrovaný
Avatar
Odpovídá na Marthyn
František Nesnídal:

Šablona není přímou součástí vieweru, je jen jejím doplňkem. Viewer je normální objekt.

 
Nahoru Odpovědět 5.3.2014 11:15
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na František Nesnídal
David Čápka:

To záleží na konkrétní implementaci frameworku, třeba v místním seriálu žádný viewer není. Tohle je přesně proč nemám rád nesmyslné dotazy pod články, teď tu řešíme viewer pod seriálem, ve kterém ani není. A diskuze bude mást lidi, co ho budou číst.

Nahoru Odpovědět 5.3.2014 11:22
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Diskuzi jsem přesunul ze seriálu do samostatného vlákna.

Nahoru Odpovědět 5.3.2014 11:24
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Marthyn
Člen
Avatar
Marthyn:

No když už jsem to tu tak rozvášnil, tak to zkusím ještě jednou a snad lépe.

Podle všech pouček má být v architekruře MVC kód HTML pouze v Pohledu(View).

Takže když si chci ulehčit práci a mít možnost zautomatizovat vypsání tabulky do kteréhokoli pohledu touto funkcí:

public function VytvorTabulku($data)
{
  $tabulka = "<table id='x' class='y'>\n<thead>\n";
  $tabulka .= "<tr>\n";
// přidání hlavičky
foreach ($data[0] as $key => $useless){
  $tabulka .= "<th>$key</th>\n";
 }
 $tabulka .= "</tr>\n</thead>\n<tbody>\n";
// vypsání dat
foreach ($data as $row){
     $tabulka .= "<tr>\n";
     foreach ($row as $key => $val){
         $tabulka .= "<td>$val</td>\n";
     }
     $tabulka .= "</tr>\n";
 }
// uzavření tabulky
$tabulka .= "</tbody>\n</table>\n";

return $tabulka;
}

Mám vytvořit nový pohled, který bude třídou a v ní bude tato funkce?

Nebo vytvořit nový pohled jako šablonu a do ní napsat něco takového:

<table id="x" class="y">
  <thead>
    <tr>
     <?php foreach ($data[0] as $key => $useless){
      echo "<th>$key</th>\n";
      }
     ?>
     </tr>
  </thead>
  <tbody>
    <?php foreach ($data as $row){
     echo "<tr>\n";
     foreach ($row as $key => $val){
         echo "<td>$val</td>\n";
     }
     echo "</tr>\n";
     }
     ?>
  </tbody>
</table>

Nebo je zase všechno špatně a já se můžu jít zahrabat?

 
Nahoru Odpovědět 5.3.2014 14:46
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Marthyn
Petr Nymsa:

Podle mě (každý si - bohužel - vykládá MVC trošičku jinak) záleží jak máš tu architekturu udělanou. Buď máš View jako šablony nebo jako třídy + s šablonou. Tj že má i různé funkce. Každopádně volil bych druhou možnost, tj udělat šablonu a do ní šablonovou syntaxi PHP :)

Nahoru Odpovědět  +1 5.3.2014 16:31
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Marthyn
David Čápka:

HTML patří jen do šablony, ve funkcích nemá co dělat, pokud to není nějaký helper, ale o to se zatím nemusíš starat. Ten druhý kód dává trochu smysl, ten první není MVC, ale právě ta špageta, které se chceš vyvarovat.

Nahoru Odpovědět 5.3.2014 21:32
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 19 zpráv z 19.