Autor Zpráva
Luke9
Profil
Ahoj,

právě se učím MVC, abych poté mohl přejít na jeden z frameworků a snažím se udělat si takový jednoduchý blog. Zasekl jsem se při výpisu všech článků. V modelu news_model.php mám metodu
public function getNews(){
        $data = $this->db->query("SELECT * FROM clanky");
        $array = $data->fetchAll();
        return $array;
    }

v controlleru news.php volám
  $this->loadModel("news");  
  $this->data = $this->model->getNews();
  $this->view->render("news");

A teď potřebuju nějak předat data z db do view, abych je mohl zobrazit a nevím úplně přesně jak. Jestli mít ještě funkci render s dvouma argumentama, abych je pomocí toho předal a pak už je ve view zobrazil nebo jak to je vlastně správně.

Předem díky za odpovědi.
aDAm
Profil
Tak pokud se ti o render stará nějaký šablonovací systém tak $this->data předej tomu šablonovacímu systému např $smarty->assign($this->data)
Luke9
Profil
MVC jsem se učil z těchto tutoriálů: http://www.youtube.com/watch?v=2Eu0Nkpo6vM&list=PL7A20112CF84B2229, tam se žádný šablonovací systém nepoužívá.. :( a vlastně ani nevím co to je
Joker
Profil
Luke9:
No a jakým způsobem je tam realizovaná view? (Nemám čas procházet přímo ty tutoriály.)

Teoreticky podle MVC architektury by to mělo být tak, že view dostane odkaz na model a z něj si vytahá co potřebuje. Viz zde:

Tohle právě zajistí ta šipka mezi view a modelem:
View má přímý odkaz na Model, aby mohl jeho data zobrazit

Zhruba takhle funguje například Microsoftí ASP.Net MVC. I když tam se do view obvykle neposílá skutečný „business“ model, ale spíš viewmodel.

Čili „podle teorie“: Controller na základě požadované akce získá odpovídající Model, vybere odpovídající View a předá mu odkaz na model. View dostane model, vytahá si z něj data a prezentuje.
Menší zádrhel je, že když View dostane odkaz na samotný „business“ model, získá fakticky i možnost s tím modelem nějak manipulovat (nejen číst, ale i dělat změny), což podle teorie View dělat nesmí.

Maličko jiný přístup, který je běžný v ASP.Net MVC: Controller na základě požadované akce vybere odpovídající viewmodel a s pomocí servisní vrstvy, ve které je skutečný model zařídí jeho naplnění daty a předá ho do view. Dál je to stejné.

To co zmiňuje aDAm se šablonovacím systémem by se dalo teoreticky popsat tak, že „schránka pro data“, takže vlastně „viewmodel“ je přímo součástí View a Controller tam naplní data z Modelu (akorát místo aby předával odkaz na nějaký objekt bere jednotlivé položky a plní je do View).
Luke9
Profil
Joker:

Jediné, co má view v sobě, je metoda render
public function render($name){
        require "view/header.php";
        require "view/" . $name . ".php";
        require "view/footer.php";  
    }
Aspoň tedy dle toho tutoriálu a není tam použitý žádný šablonovací systém.
Keeehi
Profil
public function render($name, $data)

a v view/aktualni_view.php mít
if (isset($data["db_data"])) {
    $tabulka = $data["db_data"]);
    foreach ( $tabulka as $radek ) {
        ...
    }
}

ale celé je to takové nepěkné
Luke9
Profil
Keeehi:
Přesně něco takového jsem si myslel, že mám udělat, jen jsem si nebyl jistý, jestli je to správně.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: