Autor Zpráva
radecek
Profil
Ahoj,

chtel bych udelat jednoduchy MVC zalozeny na Smartech, jedna se o skolni projekt takze nemuzu pouzit Nette, ale nechce se mi psat na zacatek souboru if(je formular odeslan) ... Sablony uz mi funguji jak maji, pohledy prepinam spravne, ale tedka chci udelat controler, tedy volani metod zavisle na nejake akci: odeslni formulare, atd..

Vytvoril jsem si zakladni tridu, ktera je rodic pohledu:

abstract class View {

	public $tpl;
	protected $layout = 'layout';
	protected $theme = '2011';

	public function __construct() {
		$this->tpl = new Smarty();
		$this->action();
	}

	public function render() {
		$this->tpl->display(DIR_TEMPLATE . '/' . $this->theme . '/' . $this->layout . '.tpl');
	}

	public function setLayout($name) {
		$this->layout = $name;
	}

	public function setTheme($name) {
		$this->theme = $name;
	}

	private function action() {
		foreach (get_class_methods(Enviroment::$view) as $methodName) {
			if (preg_match('/^action[a-z0-9]/i', $methodName))
				echo $methodName . '<br />';
		}
	}
}


Trida controler Home vypada nasledovne:
class Home extends View {

	public function __construct() {
		parent::__construct();

		$this->tpl->assign('a', 'HOME');
	}

	public function actionTest() {
		echo 'action test';
	}

}


Ukazka kodu je pouze orientacni je napsana na divoko, pote se bude nejak ladit. Ale logika je takova ze rodic bude obsahovat metody pro rizeni udalosti jejiho potomka, problem je ten ze nezna jeho metody. Jak tedy nejakym peknym zpusobem zavolat metodu actionTest().. Napada vas nejake reseni? Dekuji za Vasi odpoved..
joe
Profil
Přes reflekci zjistíš informace o nějaké té metodě, jesti existuje a jaká je.
radecek
Profil
A jak ji zavolam? Me se jedna o volani chci aby to fungovalo na pozadi de to nejak udelat?
Jozin
Profil
radecek:
Která akce se provede by měl zastřešovat bootstrap, který se může nacházet v index.php... bootstrap je dá se říct Router, který z adresy vyčte, která akce v kterém presenteru/controlleru se má provést. Ale nezdá se mi moudré, aby presenter/controller roziřoval View, vždyť se nemá starat o vykreslení, to je oddělená vrstva, jen jí má předávat data z modelu. Takže bych spíš dal BaseController, kde bude v __construct() $this->tpl = new Smarty(); než takto.
joe
Profil
radecek:
No zavoláš ji úplně normálně, takhle by to mělo fungovat

$class = 'Home';
$method = 'action' . 'Test';
$class = new $class();
$class->$method();


Nejsem si tím tak úplně jistý.

Jinak Jozin má pravdu, já nekoukal na to tvé řešení. Pleteš si view a controller. To "V" v "MVC" znamená vlastně šablona a to je to tvé Smarty. A ty tomu jen předáváš data, ty předáváš z controlleru.

Takže bys měl mít základní třídu Controller a od ní mít odvozené třídy -> HomeController extends Controller

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:

0