rockstardev
rockstardev

Reputation: 13537

Base class for common YII functions?

I know how to create a class the will allow me to instantiate it and use across my project. What I want to be able to do is have functions without instantiating classes. For example, I know how to do this:

$core = new core();
$val = $core->convertToMyNotation($anotherval);

But what I want is to be able to do this ANYWHERE in any view, class whatever:

$val = convertToMyNotation($anotherval);

Where would I place these functions in order to be able to do that?

Upvotes: 0

Views: 1711

Answers (5)

Paul Gladkov
Paul Gladkov

Reputation: 479

Create something like

Class Core extends CApplicationComponent{

    public function doSomething(){}
}

and in config main.php

'components'=>array(
    'core'=>array(
        'class' => 'Core'
    ),
),

and now you can call whenever you want

Yii::app()->core->doSomething();

Upvotes: 0

acorncom
acorncom

Reputation: 5955

Actually, I think you're looking for this answer instead: http://www.yiiframework.com/wiki/31/use-shortcut-functions-to-reduce-typing/

In essence, in your entry script, before you load up Yii, include a global functions file:

require('path/to/globals.php');

Then, any function defined in that file can be used as a shortcut. Be careful, but enjoy the power! :-)

Upvotes: 0

Willem Renzema
Willem Renzema

Reputation: 5187

You can define a static method as an option.

class core{
    public static function convertToMyNotation($value){
        //do whatever here
        return $value;
    }
}

Then call it like so:

$val = core::convertToMyNotation($anotherval);

This requires no instantiation of the object to use. The only restriction is that you cannot use the $this property inside a static method.

Alternately, just define a file with your functions in it and include the file at some point early like, like within the boostrap script in your public_html/index.php file.

Edit: darkheir makes some good suggestions. Include such a class in your protected/components folder, and have it extend CComponent to gain some potentially useful enhancements.

By including the class in the protected/components folder, you gain the advantage of autoloading the class, by default.

Upvotes: 2

darkheir
darkheir

Reputation: 8960

There is no definitive question of your answer, it depends a lot on what the function will be doing!

If the function is performing some things specific to a model (getting the last users, ...) this has to be in the User model as Willem Renzema described:

class theModelClass {
    public static function convertToMyNotation($value){
        //do whatever here
        return $value;
    }
}

And you'll call it like

$val = theModelClass::convertToMyNotation($anotherval);

If the function is handling user inputs (sanitizing he inputs, checking the values, ...) then it has to go to the controller and you'll use Hemc solution:

Create a public function in components/Controller.php

public function globalFunction(){
 // do something here.
}

and access it anywhere by

$this->globalFunction();

If the function is an Helper: performing some actions that do not depend on models or user inoput then you can create a new class that you'll put in your component directory:

class core extends CComponent{
    public static function convertToMyNotation($value){
        //do whatever here
        return $value;
    }
}

And

$val = core::convertToMyNotation($anotherval);

Upvotes: 0

hemc4
hemc4

Reputation: 1633

best way to do it, create a public function in components/Controller.php

public function globalFunction(){
 // do something here.
}

and access it anywhere by

$this->globalFunction();

Upvotes: 3

Related Questions