CakePHP: HelperComponent

August 12th, 2007

Tags:

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 Kommentare zu “CakePHP: HelperComponent”

  1. 1 Nils Hitze Says:
    Danke für den Tip. Hat super geklappt.
  2. 2 meta Says:
    Hi, what's with situation, when loaded helper uses another helper (has var $helpers = array('SomeHelper');) ?
  3. 3 rafaelbandeira3 Says:
    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()

  4. 4 Kjell Bublitz Says:
    Hi Rafael,

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

    best,
    Kjell

  5. 5 Kjell Says:
    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();
    				}
    			}
    		}
    	}
    }
  6. 6 Iain Mullan Says:
    Excellent work!!

    thanks
    Iain


Trackbacks/Pingbacks

  1. cakebaker » How to use a helper in a controller

Diesen Eintrag kommentieren