web-dev-qa-db-fra.com

Appelez la méthode de publication du contrôleur à partir de la CLI ou de l'aide

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?

1
MyFault

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; 
1
David Hayes

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).

0
John Rix