Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Execute a Function in Silverstripe via Cronjob

Hi I want to execute a function via cronjob to start an csv import. At the moment the import is triggered by accessing a controller in the browser tld.de/Update

The controller has this code http://pastie.org/8351266

How can I execute the function init() via Cronjob?

Thx!

like image 343
invictus Avatar asked Dec 12 '22 11:12

invictus


1 Answers

In SilverStripe you can access any route that is accessible via HTTP also by running cli-script.php in the command line

There also is sake which is just a bash wrapper around cli-script.php (but sake needs to be installed)

so, from your project directory, you can run both commands which will perform the same action (in this case, run a dev/build):

php framework/cli-script.php dev/build
sake dev/build

see the docs for commandline ussage of silverstripe: http://doc.silverstripe.org/framework/en/topics/commandline


the 2nd part of your question (how to call a method from a controller) is actually more a question of routing in silverstripe and has nothing to do with how it is called (cronjob)

I assume that your controller is a Page_Controller or a subclass of that (so bound to a SiteTree Model), then routing is done for you (it takes the URLs you set in the CMS). so lets see some example code and lets assume you have a page with the URLSegment about:

class Page_Controller extends ContentController {
    private static $allowed_actions = array('something');
    public function init() {
        // the init method will run before every action
        // this means this code will run, no matter if you visit /about or /about/something
    }
    public function index() {
        // this is the default action (this code is optional and can be removed), 
        // and will be called if you visit website.com/about
        return $this;
    }
    public function something() {
        // this is the somethingaction, 
        // and will be called if you visit website.com/about/something
        // do something here
        return $this;
    }
}

you can then call run to get the result of the index():

php framework/cli-script.php about

and this to get the result of something():

php framework/cli-script.php about/something

NOTE: the init method itself is not accessable via URL, it is the "setup" that runs before an action
NOTE: all actions other than index() have to be allowed by adding them to $allowed_actions (also note that you need to ?flush=1 after adding to $allowed_actions to reload the config cache)

EDIT: this was actually the response to your first question, after seeing your code example, this addition:

for standalone controllers it works the same way, just that you have to define the routes, and make sure that you have $Action in the route so that something() can be called

like image 120
Zauberfisch Avatar answered Dec 18 '22 00:12

Zauberfisch