MVC view variabelen advies
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// Voorbeeld, maakt niet echt uit waar variabelen vandaan komen
$data = array("title" => "Beveiligde pagina"
"username" => $username,
"css_href" => $url,
"subpage" => "views/users/settings.php",
"subpage_content" => "views/users/email-settings.php",
"email" => $email,
"form_msg" => $form_msg,
);
$this->loadView("views/users/index.php", $data);
?>
// Voorbeeld, maakt niet echt uit waar variabelen vandaan komen
$data = array("title" => "Beveiligde pagina"
"username" => $username,
"css_href" => $url,
"subpage" => "views/users/settings.php",
"subpage_content" => "views/users/email-settings.php",
"email" => $email,
"form_msg" => $form_msg,
);
$this->loadView("views/users/index.php", $data);
?>
Elke controller extends de Base Controller. Daardoor heeft elke controller de methode loadView om een view weer te geven. De methode loadView krijgt ook nog de $data parameter mee, dat is een array met de variabelen die de view nodig heeft. Deze array wordt ge-extract.
Ik kan dus maar 1x data aan de view meegeven. Daardoor moet ik in bijna elke controller opnieuw dezelfde variabelen in de $data array zetten en meegeven aan loadView.
Ik had dus bedacht om een nieuwe laag toe te voegen tussen de controllers. Bijvoorbeeld de UserAreaController voor alles van het gedeelte waar bv. een gebruiker ingelogd moet zijn.
Dan krijg je:
Controller (base controller)
|- UserAreaController
|- (de specifieke controller van een pagina)
In die UserAreaController kan ik dan in de constructor alle (boilerplate) variabelen maken. Het probleem is dus dat ik dan meerdere keren data moet mee kunnen geven aan de view. Terwijl die view nog moet worden gemaakt in een lager gelegen controller.
Wat is dan beter: naast de loadView methode, een nieuwe methode maken in de base controller die bv. storeViewData heet. Dan sla ik daar tijdelijk de data op, totdat loadView wordt aangeroepen. Als die wordt aangeroepen wordt de eerder opgegeven (bewaarde) data ook ge-extract (net als de $data in de loadView parameter) en zo wordt dus alles berijkbaar in het view bestand.
Of helemaal die $data parameter van loadView eruit halen, en via een aparte methode van de base controller de data meegeven. Zodat er een aparte methode is voor het laden (includen) van een view, en een aparte voor het meegeven van de data.
Gewijzigd op 05/07/2014 18:18:28 door Jan terhuijzen
Jan terhuijzen op 05/07/2014 18:14:43:
Het probleem is dus dat ik dan meerdere keren data moet mee kunnen geven aan de view. Terwijl die view nog moet worden gemaakt in een lager gelegen controller.
Feitelijk is er geen lager gelegen controller.
Dit:
Code (php)
Is (nagenoeg) hetzelfde als
Het probleem zit vooral in de volgorde.
Als de view is gemaakt door loadView, kan ik niks meer aan de view veranderen. Een controller om de gebruikersinstellingen te veranderen moet nu dus ook data naar de view sturen die eigenlijk standaard al nodig is. Bijvoorbeeld de begruikersnaam rechts boven in beeld, de href voor de stylesheet etc. Dan zou ik in elke methode (action) van een controller opnieuw een lange array neer moeten zetten. Het is eigenlijk best simpel. Ik zoek gewoon een manier om meerdere keren data naar de view te kunnen sturen uit verschillende controller klassen (lagen) *, vóórdat de view is geladen natuurlijk.
* Dit is natuurlijk heel makkelijk al gedaan door overerving
Gewijzigd op 05/07/2014 19:08:33 door jan terhuijzen
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
class UserController
{
public function indexAction()
{
$data = array_merge(
$this->_getStandardBehavior(),
array(
"blabla" => "jajaja",
"zozozo" => "mooimooi",
)
};
$this->loadView("views/users/index.php", $data);
}
public function viewAction()
{
$data = array_merge(
$this->_getStandardBehavior(),
array(
"blabla" => "neeneenee",
"zozozo" => "oeioeioei",
)
};
$this->loadView("views/users/index.php", $data);
}
private _getStandardBehavior()
{
return array(
"title" => "Beveiligde pagina"
"username" => $username,
);
}
}
?>
class UserController
{
public function indexAction()
{
$data = array_merge(
$this->_getStandardBehavior(),
array(
"blabla" => "jajaja",
"zozozo" => "mooimooi",
)
};
$this->loadView("views/users/index.php", $data);
}
public function viewAction()
{
$data = array_merge(
$this->_getStandardBehavior(),
array(
"blabla" => "neeneenee",
"zozozo" => "oeioeioei",
)
};
$this->loadView("views/users/index.php", $data);
}
private _getStandardBehavior()
{
return array(
"title" => "Beveiligde pagina"
"username" => $username,
);
}
}
?>
De view laden doe je als allerlaatste inderdaad.
Gewijzigd op 05/07/2014 19:16:07 door Frank Nietbelangrijk
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$this->_getStandardBehavior(),
array(
"blabla" => "neeneenee",
"zozozo" => "oeioeioei",
)
?>
$this->_getStandardBehavior(),
array(
"blabla" => "neeneenee",
"zozozo" => "oeioeioei",
)
?>
Dan hoef je ook maar 1x de data aan de view te geven.
Gewijzigd op 05/07/2014 19:18:32 door jan terhuijzen
index.php (view)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>
<body>
<nav>
<?php render('MenuController:indexAction'); ?>
</nav>
...
</body>
</html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>
<body>
<nav>
<?php render('MenuController:indexAction'); ?>
</nav>
...
</body>
</html>
Gewijzigd op 05/07/2014 19:22:46 door Frank Nietbelangrijk
Dus zoiets?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Base_Controller
{
public $data = array();
public function __construct()
{
$this->data = array("title" => "Beveiligde pagina"
"username" => $username,
);
}
}
class UsersController extends Base_Controller
{
public function __construct()
{
parent::__construct();
}
public function index()
{
$this->data['subpage'] = 'views/users/settings.php';
$this->data['subpage_content'] = 'views/users/email-settings.php';
$this->loadView("views/users/index.php", $this->data);
}
}
{
public $data = array();
public function __construct()
{
$this->data = array("title" => "Beveiligde pagina"
"username" => $username,
);
}
}
class UsersController extends Base_Controller
{
public function __construct()
{
parent::__construct();
}
public function index()
{
$this->data['subpage'] = 'views/users/settings.php';
$this->data['subpage_content'] = 'views/users/email-settings.php';
$this->loadView("views/users/index.php", $this->data);
}
}
Gewijzigd op 05/07/2014 20:48:17 door patrick S
Gewijzigd op 06/07/2014 02:21:20 door Frank Nietbelangrijk
De hele view data wordt opgeslagen als property in de base controller.
Zo doe je de data gewoon instellen met setViewData(), en eventueel later nog bij loadView($path, $data).
In loadView heb je dan de $data parameter als een aanvulling op de (eventueel) eerder gevulde $data property van de base controller. In de methode loadView kun je de array dan samenvoegen etc.
Gewijzigd op 06/07/2014 23:12:03 door jan terhuijzen