Ho una serie di oggetti modello contenenti dati alcuni dei quali sono stati rappresentati da numeri interi. Nella vista questi stati sono mostrati come icone e suggerimenti. Il suggerimento è necessario solo nella vista e non è presente nei modelli oggetto originali, quindi credo che il modello decoratore debba essere applicato. Inoltre ci sono due classi di decoratori per due diversi punti di vista. Per applicare un decoratore ito iterando la collezione in ogni controller e assegnandola a Smarty:
//controller a
$data = $retriever->getData();
//...
foreach ($data as $k => $modelObj) {
$data[$k] = new TooltipDecorator_A($modelObj);
}
$smarty->assign("data", $data);
//controller b
$data = $retriever->getData();
//...
foreach ($data as $k => $modelObj) {
$data[$k] = new TooltipDecorator_B($modelObj);
}
$smarty->assign("data", $data);
Questa logica aggiungerà la proprietà $ modelObj.tooltipA / $ modeil.tooltipB a ogni istanza dell'oggetto modello dell'array. Queste proprietà contengono il testo del suggerimento e vengono utilizzate nella vista per visualizzarlo:
//smarty_tpl.html
{foreach $data as $modelObj}
<p data-toggle="tooltip" title="{$modelObj.tooltipA}"><img src="state_icon.png"></p>
{/foreach}
Trovo che iterare in due controller per applicare un decoratore non sia la soluzione migliore, ma sto sconcertando quale sarebbe la soluzione corretta? Modificare il retriever per essere in grado di applicare i decoratori non sembra una buona idea. Smarty propone alcune opzioni? O potrebbe essere l'introduzione di un'altra classe che dovrebbe fare il lavoro o una fabbrica?