[Zend Framework] Action opvragen in action

Pagina: 1
Acties:

Onderwerpen


  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
Wij zijn al een tijd bezig met het ontwikkelen van een CMS met behulp van het Zend Framework. De bedoeling is om dit geheel modulair op te zetten. Je moet hierbij denken aan een aantal modules zoals bijvoorbeeld Text (statische tekst), News, Photos enzovoorts.

Nu is het zo dat ik graag op één pagina als het ware meerdere views wil laten zien van verschillende modules/controllers/actions. Ik wil bijvoorbeeld een pagina met een bepaald textitem laten zien en dan aan de rechterzijde een overzicht met fotoalbums in een bepaalde categorie. Het opvragen van het textitem is het probleem niet, dit wordt afgehandeld door de action View in de controller Item van de module Text. Nu wil ik dus graag een andere action opvragen van een andere controller (Category in Photos) op dézelfde pagina. Ik heb al geprobeerd om in de ene action de andere controller aan te maken en dan de action uit te voeren, maar dan kom ik in de knoop met de verschillende views, zie onderstaand stukje code.

PHP:
1
2
3
4
Zend_Loader::loadFile("ItemController.php", APPLICATION_PATH . "/modules/text/controllers/");
$this->_request->setParam("id", 2);
$controller = new Text_ItemController($this->_request, $this->_response);
$controller->viewAction();

Verder lijkt me dit ook niet echt de bedoeling, ook omdat dan in elke controller alle andere mogelijke views van andere controllers afgehandeld moeten worden, maar op dit moment zie ik niet in hoe dit anders kan.

In het kort wat ik voor elkaar wil krijgen:
Één pagina met daarop meerdere 'view's, bijvoorbeeld:
[text/item/view/id/2] [photos/category/view/id/5]

Ik hoop dat iemand me hier mee verder kan helpen, alvast bedankt! :)

Hoi!


Verwijderd

Wat je wil is in principe mogelijk al is het niet een standaard implementatie van het MVC model waarbij er eigenlijk 1 link tussen de controller en de action is.

Wel zou je gebruik kunnen maken van een 'widget' achtige constuctie waarbij er een mapping is tussen een widget en een controller/action combinatie. Bij het aanroepen / executen van die widget wordt dan de bijpassende controller geladen en de action uitgevoerd.

Zelfs zou je dan nog gebruik kunnen maken van een principe dat ik zelf het Harvester Pattern noem, waarbij een overkoepelende class, laten we zeggen een ControllerManager alle controllers inlaad en kijkt of deze bijvoorbeeld de getWidgets() method hebben en zo alle beschikbare widget mappings te kunnen indexeren.

Ook zou een Hook achtige implementatie ervoor kunnen zorgen dat bepaalde methods uitgevoerd worden voor het renderen van de pagina , die op hun beurt weer de juiste actions aanroepen en de view voorzien van data.

Verwijderd

Dit principe ligt in verband met HMVC (Hierarchical-Model-View-Controller)

Zend Framework maakt dit volgens mij mogelijk met de Action View Helper. Ik zou daar naar kijken en wellicht bied dat een oplossing.

  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
Thanks voor alle snelle reacties tot nu toe :). Widgets is een woord waar ik nog niet bij stil gestaan heb, maar wat het zoeken wel gemakkelijker maakt. Ik ga er mee aan de slag, maar andere reacties zijn altijd welkom.

Hoi!


Verwijderd

Widgets is maar gewoon een term ... waar veel frameworks, OS'en etc weer net een andere draai aan geven dus laat je daar niet door (mis)leiden.

Het Yii Framework heeft ook een soort widget implementatie die wel aardig is dat ik weet.

@Elsewhere ... dit zou wel een mooie oplossing zijn, maar heb zelf niet genoeg kaas gegeten van ZF om het zeker te weten.

Verwijderd

Ik heb ook een tijd met dit probleem gezeten. Omdat het bij mij om redelijk simpele onderdelen in mijn sidebar ging (trackers enzo) heb ik er view plugins van gemaakt, die ik vervolgens gewoon in mijn layout script aanroep op de plaats waar ze horen.
De view gebruikt een partial met een extra template bestand voor de html.

Voorbeeld van mijn tracker:
Plugin:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
class Zend_View_Helper_LatestNewsTracker extends Zend_View_Helper_Abstract
{
    public function latestNewsTracker($count)
    {
        $posts = new Posts();
        $stmt = $posts->getPostSummariesStmt()
                        ->limit($count);
        $result = $stmt->query()->fetchAll();

        return $this->view->partial('latestNewsTracker.phtml', array('posts'=>$result));
    }
}

Template:
PHP:
1
2
3
4
5
6
7
8
9
<ul>
<?php if($this->posts):?>
<?php   foreach($this->posts as $post):?>
    <li>
         <?=$post['title'];?></a>
    </li>
<?php   endforeach;
      endif;?>
</ul>

En in de layout of view script, waar je de tracker wilt hebben:
PHP:
1
<?=$this->latestNewsTracker(3);?>

[ Voor 54% gewijzigd door Verwijderd op 12-08-2010 16:55 ]


Acties:
  • 0 Henk 'm!

  • Tommetje
  • Registratie: Februari 2004
  • Laatst online: 19-11-2024
Ik lees door omstandigheden nu pas de rest van de reacties, bedankt! Ik ga er aan het einde van de week weer mee verder en dan laat ik jullie nog weten hoe ik e.e.a. opgelost heb.

Hoi!


Acties:
  • 0 Henk 'm!

  • Freeaqingme
  • Registratie: April 2006
  • Laatst online: 12:39
Beetje laat, maar ik zou inderdaad willen aanraden dit met viewhelpers te doen, of vanuit je layout rechtstreeks je models aan te roepen. Je kan de action viewhelper wel gebruiken, maar dat is heel slecht.

No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Beter is om Zend_Layout te gebruiken. Met behulp van een ActionStack kun je meerdere Actions uit laten voeren en die vervolgens weergeven in je layout. Als je altijd bepaalde vaste items in je layout hebt kun je ook de Action View Helper aanroepen in je layout.

Acties:
  • 0 Henk 'm!

  • Freeaqingme
  • Registratie: April 2006
  • Laatst online: 12:39
Ja, alleen wordt iedere keer dat je die action viewhelper aanroept het hele dispatch proces opnieuw uitgevoerd, wat praktisch gelijk staat aan een request. Iets wat je niet gaat willen...

No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Klopt inderdaad, maar het hangt ook een beetje af van wat je weer wilt geven. Als het niet al te ingewikkeld is kun je de action() prima vervangen door een view-helper die zelf wat doet.

De link die je in je eerdere post gaf geeft dat trouwens best goed weer, had ik overheen gekeken.

Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

Waarom werk je niet gewoon met modellen? Ik krijg het vermoeden dat je heel veel logica in je controllers gestopt hebt en dan loop je inderdaad tegen dit soort problemen aan. Als ik in bv. mijn ArticleController een aantal artikelen in mijn view wil stoppen dan roep ik daar mijn ArticleModel aan en vraag de artikelen op. Mocht ik nu in bv. mijn PhotoController een artikel nodig hebben dan roep ik in die controller mijn ArticleModel aan en vraag een artikel op.

Als je al je business-logic in modellen hebt gestopt dan kun je er gewoon vanuit elke controller bij.

Aunt bunny is coming to get me!

Pagina: 1