Since the Sugar 7.7.1.0 version, SugarCRM introduced a Sugar CLI tool based on Symfony Console. This Sugar CLI tool is under beta version at this moment (August 2016) and can be changed in the future.
We will see in this article how to use this new Sugar CLI to add a command which provides some statistics from the Email Manager Queue. We want to display how many emails by campaign by module are waiting to be sent.
The first step is to define the Command itself
To perform this operation we implementSugarcrm\Sugarcrm\Console\CommandRegistry\Mode\InstanceModeInterface
because our command must be executed only on an installed Sugar instance. The only required things to do is to provide the command name, the description, and the help text on the configure()
method and then to implement our logic in the execute()
method. We are using a SugarQuery
to retrieve the data and display the result on a table. We can imagine externalizing this part and using it in an API and creating unit tests.
//File: custom/Synolia/EmailMan/Console/Command/ListQueueCommand.phpnamespace Synolia\EmailMan\Console\Command;use Sugarcrm\Sugarcrm\Console\CommandRegistry\Mode\InstanceModeInterface;use Symfony\Component\Console\Command\Command;use Symfony\Component\Console\Input\InputInterface;use Symfony\Component\Console\Output\OutputInterface;use Symfony\Component\Console\Helper\Table;use Symfony\Component\Console\Helper\TableSeparator;/**
*
* Email Manager Queue statistics
*
*/
class ListQueueCommand extends Command implements InstanceModeInterface{
/**
* {inheritdoc}
*/
protected function configure()
{
$this
->setName('synolia:emailman:queue')
->setDescription('Show Email Manager Queue statistics')
->setHelp('This command displays statistics from Email Manager Queue.')
;
}
/**
* {inheritdoc}
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$result = $this->getSugarQuery()->execute();
$nbEmailsToSent = 0;
$table = new Table($output);
$table->setHeaders(array('Campaign', 'Module', 'Count'));
foreach ($result as $row) {
$table->addRow(array($row['name'], $row['related_type'], $row['record_count']));
$nbEmailsToSent += $row['record_count'];
}
$table->addRow(new TableSeparator());
$table->addRow(array('# Emails to send', '', $nbEmailsToSent));
$table->render();
}
/**
* @return \SugarQuery
* @throws \SugarQueryException
*/
protected function getSugarQuery()
{
$sq = new \SugarQuery();
$sq->from(\BeanFactory::newBean('EmailMan'))
->joinTable('campaigns', array(
'alias' => 'campaigns',
'joinType' => 'LEFT',
'linkingTable' => true)
)->on()->equalsField('campaigns.id', 'emailman.campaign_id');
$sq->select(array('campaigns.name', 'emailman.related_type'))->setCountQuery();
$sq->groupBy('campaigns.name')
->groupBy('emailman.related_type');
return $sq;
}
}
Declare the Command
Now we need to make this command available by using the application/Ext/Console
framework:
//File: custom/Extension/application/Ext/Console/SynoliaEmailManListQueueCommand.phpSugarcrm\Sugarcrm\Console\CommandRegistry\CommandRegistry::getInstance()->addCommand(new Synolia\EmailMan\Console\Command\ListQueueCommand());
Add our namespace
To use our own namespace we can follow one of the way described in our previous article by using theapplication/Ext/Utils
framework:
//File: custom/Extension/application/Ext/Utils/SynoliaEmailManConsoleCommandNamespace.phpSugarAutoLoader::addNamespace('Synolia\\EmailMan\\Console\\Command', 'custom/Synolia/EmailMan/Console/Command', 'psr4');
Perform a Quick Repair and Rebuild et voilà!
Thanks to Jelle Vink about his presentation of this new Sugar CLI tools at UnCon 2016!
You can find more information about Sugar CLI on the Sugar Developer Guide.