rss search

CakePHP: HelperComponent

line

Als ich heute so durch meine RSS Subscriptions wanderte fand ich einen Artikel bei CakeBaker wie man in einem Controller einen Helper verwenden kann. Ich stimme natürlich zu, dass es nicht immer Sinn macht und eigentlich vermieden werden sollte, aber es gibt dennoch immer Bereiche wo es sinnvoll ist.

Ich finde den TimeHelper zum Beispiel auch sehr nützlich in einer Action bzw. in einem Controller. Grad wenn man mit externen Daten arbeitet und die das Unix Format verwenden, oder zeitbasierte Queries bilden will.

Die HelperComponent nimmt einfach das von mir festgelegte Property "actionHelpers" und lädt alle dort definierten Helper in den Controller unter selben Namen. Man kann also auf die Helper so zugreifen wie auf Components.

PHP:
  1. class UsersController extends AppController {
  2.     var $name="Users";
  3.     var $components = array('Helper');
  4.     var $actionHelpers = array('Number', 'Time');
  5.  
  6.     function index() {
  7.         $example = $this->Number->precision(100.1151933, 2);
  8.         // $example -> 100.11
  9.     }
  10. }

Das nur als Beispiel. Der Rest bleibt euch überlassen ;)

app/controller/compontents/helper.php

PHP:
  1. class HelperComponent extends Object {
  2.     var $controller;
  3.  
  4.     function startup(&$controller)
  5.     {
  6.         $this->controller = $controller;
  7.         if(isset($controller->actionHelpers)) {
  8.             $this->pushHelpers();
  9.         }
  10.     }
  11.  
  12.     function pushHelpers()
  13.     {
  14.         foreach($this->controller->actionHelpers as $helper) {
  15.             $_helper = ucfirst($helper);
  16.             loadHelper($_helper);
  17.             $_helperClassName = $helper.'Helper';
  18.             $this->controller->{$helper} = new $_helperClassName();
  19.         }
  20.     }
  21. }

Viel Spass damit.


7 comments

line
  1. Danke für den Tip. Hat super geklappt.
    line
  2. meta
    Hi, what's with situation, when loaded helper uses another helper (has var $helpers = array('SomeHelper');) ?
    line
  3. I think the best approach would be passing helper's names as params for the component:

    class UsersController extends AppController {
    var $name="Users";
    var $components = array('Helper' => array('Number', 'Time'));
    function index() {
    $example = $this->Number->precision(100.1151933, 2);
    // $example -> 100.11
    }
    }

    And your component shall receive it as arguments on HelperComponent::initialize()

    line
  4. Hi Rafael,

    thanks for the hint! Didn't know about nested arrays within the components array. CakePHP rocks!

    best,
    Kjell

    line
  5. Kjell
    Here it is:

    
    class HelperComponent extends Object {
    	function initialize (&$controller, $helpers = array()) {
    		if (is_array($helpers)) {
    			foreach ($helpers as $helper) {
    				$helper = ucfirst($helper);
    				App::import('Helper', $helper);
    				$HelperClass = $helper.'Helper';
    				if (class_exists($HelperClass)) {
    					$controller->{$HelperClass} = new $HelperClass();
    				}
    			}
    		}
    	}
    }
    line
  6. Excellent work!!

    thanks
    Iain

    line
  7. Luk Puk
    Great and simple work Kjell & Rafael. Thanks!

    Btw: Using the code as it is, the example should look like this:

    $example = $this->NumberHelper->precision( 100 . 1151933, 2 );

    line

Trackbacks/Pingbacks

  1. cakebaker » How to use a helper in a controller - [...] 2007-08-13: m3nt0r has published a helper component in his blog which allows you to use a helper like a ...

Leave a Reply