J'aimerais appeler la méthode de publication que j'ai définie dans le contrôleur de mon élément à partir d'un script CLI ou d'un assistant (inclus dans la CLI).
Le meilleur des cas serait de l'appeler comme ceci:
$itemcontroller->publish($task);
Mais je ne suis pas sûr que cela soit possible.
La méthode de publication modifiée dans mon contrôleur ressemble à ceci:
/**
* publish function.
*
* @access public
* @return void
*/
public function publish()
{
$app = JFactory::getApplication();
$jinput = JFactory::getApplication()->input;
$ids = $jinput->get('cid', '', 'array');
$task = $this->getTask();
$date = JFactory::getDate();
$modelitem = $this->getModel('Item');
foreach($ids as $id)
{
switch($task)
{
case 'publish' : // do something
break;
case 'unpublish': // do something
break;
case 'archive' : // do something
break;
case 'trash' : // do something
break;
}
$publish = $modelitem->publish($id, $state);
$this->setRedirect('index.php?option=com_bestia&view=items', false);
return true;
}
Comment puis je faire ça?
Voici un script CLI que j'ai créé et qui vous permet d’appeler des contrôleurs comme vous le feriez via http. Il suffit de l’ajouter au dossier CLI nommé kewlcomponent.php.
<?php
/**
* This is a CRON script which should be called from the command-line,
* not the web. For example something like:
* env php /path/to/joomla/cli/app.php
*/
// Make sure we're being called from the command line, not a web interface
if (PHP_SAPI !== 'cli') die('This is a command line only application.');
// Set flag that this is a valid Joomla entry point
define('_JEXEC', 1);
// Configure error reporting to maximum for CLI output.
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
ini_set('display_errors', 1);
// Load system defines
if (!defined('_JDEFINES')) {
define('JPATH_BASE', dirname(dirname(__FILE__)));
require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_BASE . '/includes/framework.php';
// Fool Joomla into thinking we're in the administrator with com_kewlcomponent as active component
$app = JFactory::getApplication('site');
$_SERVER['HTTP_Host'] = 'domain.com';
$_SERVER['REQUEST_METHOD'] = 'GET';
define('JPATH_COMPONENT', JPATH_BASE . '/components/com_kewlcomponent');
define('JPATH_COMPONENT_SITE', JPATH_BASE . '/components/com_kewlcomponent');
define('JPATH_COMPONENT_ADMINISTRATOR', JPATH_BASE . '/administrator/components/com_kewlcomponent');
/* add loaders as necessary */
JLoader::discover('CH',JPATH_COMPONENT_ADMINISTRATOR.'/helpers');
JHtml::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR.'/helpers/html');
JTable::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR.'/tables');
JFormHelper::addRulePath(JPATH_COMPONENT_ADMINISTRATOR.'/helpers/rule');
$app->loadLanguage();
$lang = JFactory::getLanguage();
$lang->load('com_kewlcomponent',JPATH_ADMINISTRATOR,'en-GB',true);
$lang->load('com_kewlcomponent',JPATH_ADMINISTRATOR,null,true);
/* end loaders */
class CliKewlcomponent extends JApplicationCli
{
protected $timestamp = null;
public function __construct(JInputCli $input = null, JRegistry $config = null, JDispatcher $dispatcher = null) {
$this->timestamp = time();
parent::__construct($input, $config, $dispatcher);
}
public function doExecute() {
$live_site = $this->input->get('live_site',null,'string');
if (!empty($live_site)) {
$liveSiteUri = new Juri($live_site);
$_SERVER['HTTP_Host'] = $liveSiteUri->getHost();
JFactory::getConfig()->set('live_site',$live_site);
}
$this->input->set('option','com_kewlcomponent');
$task = $this->input->get('task');
if (empty($task)){
$this->out('No task given');
$this->out('============================');
$this->out();
return;
}
$app = JFactory::getApplication();
// set the form tokens
$token = JSession::getFormToken();
$this->input->set($token,1);
$this->input->post->set($token,1);
$this->input->get->set($token,1);
// copy the input we are given
$app->input = $this->input;
// run the task
$controller = JControllerLegacy::getInstance('Kewlcomponent');
if (!$controller->execute($app->input->get('task'))) { // controller breaks up task, need to check new value
$this->out('=============Error=============');
$this->out("\n\t".implode("\n\t",$controller->getErrors())."\n\t");
$this->out('============================');
$this->out();
}
}
}
JApplicationCli::getInstance('CliKewlcomponent')->execute();
Ensuite, vous pouvez appeler votre contrôleur comme suit:
php5 public_html/cli/kewlcomponent.php --task=kewlcontroller.publish --live_site="http://example.com" --anothervariable="something cool"
Vous ne pouvez pas actuellement transmettre de listes via CLI dans Joomla. Vous devrez donc peut-être ajouter un peu de prétraitement avant:
$app->input = $this->input;
Vous pouvez utiliser la classe ComponentHelper pour cela:
class MyCliApp extends JApplicationCli
{
public function doExecute()
{
// Fool Joomla factory into loading CMS application
$app = JFactory::getApplication('site');
// Transfer arguments into the CMS application's input
$app->input->set('task', 'controllername.taskname');
$app->input->set('arg1', $this->input->getInt('arg1'));
// Invoke the component
$component = Joomla\CMS\Component\ComponentHelper::renderComponent('com_mycomponent');
$this->out('Finished');
}
}
JApplicationCli::getInstance('MyCliApp')->execute();
Je n'ai pas encore fait beaucoup d'expérimentation avec cela, donc je ne suis pas certain des pièges que vous pourriez rencontrer, mais cela répond à mes propres besoins pour le moment au moins (me permettant d'invoquer une tâche dans mon composant à partir d'un travail cron).