[ZF]Eigen constructor Helper uitvoeren

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 18-09 12:34
Voor de huidige applicatie die ik ontwikkel mbv het Zend Framework wil ik een ViewHelper toevoegen die over een constructor beschikt die ik zelf kan initieëren.

Het idee is dat ik een controller gedefinieerd heb die functionaliteiten voor het werken met een bepaalde entiteit groepeert. Nu wil ik dat deze controller ook een ViewHelper instelt zodat deze specifiek zijn werk kan doen in de bijbehorende views van de acties deze controller. Dat wil ik doen door deze ViewHelper een constructor mee te geven en deze bij initialisatie van de controller zelf aan te maken.

Wat concreter, er is een controller:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
class Controller extends Zend_Controller_Action
{
    public function init()
    {
        new CustomHelper( 'hier de aparte content');
    }

    public function testAction()
    {
        // render test.phtml
    }
}


En een ViewHelper:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
class CustomHelper extends Zend_View_Helper_Abstract
{
    public __construct( $param )
    {
        // Doe wat met $param
    }

    public function customHelper()
    {
        // Geef iets terug dat afhangt van de meegegeven $param
    }
}


In de view zou ik dan deze helper willen gebruiken:
PHP:
1
<p>Hier wat tekst, en <?php echo $this->customHelper()?> de specifieke content.</p>


Jammergenoeg werkt de bovenstaande implementatie niet! Ondanks dat ik zelf een instantie aanmaak in de controller van CustomHelper maakt de view toch nog een nieuwe instantie aan (wat zelfs niet lukt omdat hij de parameter van de constructor niet opgeeft).

Iemand ideeën over hoe dit wél kan werken of hoe ik het beter kan aanpakken?

Bedankt!

Acties:
  • 0 Henk 'm!

  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Ik ken ZF niet goed, maar moet je die CustomHelper niet ergens aan vast hangen in je init? Het enige wat je nu doet is een instantie maken die je nergens aan assigned.

On track


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Je kunt dan de aparte content beschikbaar maken binnen je view en je View Helper kan vervolgens die content uit de view halen. Dus zo:

De controller:
PHP:
1
2
3
4
5
6
7
8
class Controller extends Zend_Controller_Action 
{ 
    public function testAction() 
    { 
        $this->view->content = 'hier de aparte content';
        // render test.phtml 
    } 
}


De view helper:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class CustomHelper extends Zend_View_Helper_Abstract 
{ 
    public $view;

    public function customHelper() 
    { 
        $content = $this->view->content;
        // Doe iets met $content
    } 

    public function setView(Zend_View_Interface $view)
    {
        $this->view = $view;
    }
}


De methode setView wordt door het ZF automatisch aangeroepen nadat de View Helper gemaakt is. Zie hier: http://devzone.zend.com/a...Helpers-in-Zend-Framework

Dit alles staat, heel handig, niet in de officiële documentatie op http://framework.zend.com/manual/en/ ;)

Acties:
  • 0 Henk 'm!

  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 18-09 12:34
Mm ja zo'n constructie had ik ook al verzonnen en geimplementeerd maar volgens mij werkt het $view object in de context waarin hij aangroepen wordt. is. Als ik bijvoorbeeld deze helper nu aanroep vanuit een partial die ik aanroep in het view dan is deze variabele niet zichtbaar (omdat hij dat ook niet vanuit die partial is). Het zou natuurlijk kunnen zijn dat ik er een fout in dit proces gemaakt heb maar ik gok dat dit gedrag geacht is door de ontwerpers. Ideeën voor een workaround op deze uitwerking?

Voorbeeld van zo'n view zou overigens zijn:
PHP:
1
<p>View kan wél bij content <?php echo $this->content?>, maar <?php echo $this->partial('_partial.phtml');?></p>


En de partial
PHP:
1
Deze niet. <?php echo $this->content)?> (<= zal fout geven).


Alvast bedankt

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Dan maak je er dit van:

View:
PHP:
1
2
3
4
<p>
  View kan wél bij content <?php echo $this->content?> 
  en ook bij <?php echo $this->partial('_partial.phtml', array('content', $this->content));?>
</p>


PHP:
1
2
Deze werkt nu wel.
<?php echo $this->content)?> (<= zal geen fout geven).


Zie voorbeeld 53.2 op deze pagina: http://framework.zend.com...w.helpers.initial.partial

Acties:
  • 0 Henk 'm!

  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 18-09 12:34
Mjah ik snap dat dat wel werkt maar het idee is dat ik dat dus juist níet wilde gaan doen ;). Ik zou die waarde $content eigenlijk overal in het view (of partials daarbinnen) kunnen aanspreken. Ik denk dat ik dit idee maar overboord zet en de waarde in Zend_Registry stop en deze vervolgens zo uit kan lezen vanuit de helper.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
maurad3r schreef op maandag 09 maart 2009 @ 13:07:
Mjah ik snap dat dat wel werkt maar het idee is dat ik dat dus juist níet wilde gaan doen ;). Ik zou die waarde $content eigenlijk overal in het view (of partials daarbinnen) kunnen aanspreken. Ik denk dat ik dit idee maar overboord zet en de waarde in Zend_Registry stop en deze vervolgens zo uit kan lezen vanuit de helper.
Het idee van een partial is dat hij in z'n eigen variable-scope werkt. Als je dat niet wilt, dan is de keuze om een partial te gaan gebruiken onjuist. Dan zou je dit moeten doen:

PHP:
1
2
3
4
<p>
  View kan wél bij content <?php echo $this->content; ?> 
  en ook bij <?php echo $this->render('_partial.phtml'); ?>
</p>


Dus geen partial gebruiken, maar de render() methode van de view aanroepen. Dan blijf je in dezelfde scope en kan het script _partial.phtml wel bij de content-variabele.
Pagina: 1