-
-
Notifications
You must be signed in to change notification settings - Fork 559
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Generator of rules condition (#3827)
* Add Rules Condition command * Add generate:plugin:rules:condition command. Generator for the command and templates
- Loading branch information
Showing
5 changed files
with
371 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,271 @@ | ||
<?php | ||
|
||
/** | ||
* @file | ||
* Contains \Drupal\Console\Command\Generate\PluginRulesActionCommand. | ||
*/ | ||
|
||
namespace Drupal\Console\Command\Generate; | ||
|
||
use Drupal\Console\Command\Shared\ArrayInputTrait; | ||
use Drupal\Console\Command\Shared\ConfirmationTrait; | ||
use Drupal\Console\Command\Shared\ModuleTrait; | ||
use Drupal\Console\Command\Shared\ServicesTrait; | ||
use Drupal\Console\Core\Command\Command; | ||
use Drupal\Console\Core\Utils\StringConverter; | ||
use Drupal\Console\Core\Utils\ChainQueue; | ||
use Drupal\Console\Extension\Manager; | ||
use Drupal\Console\Generator\PluginRulesConditionGenerator; | ||
use Drupal\Console\Utils\Validator; | ||
use Symfony\Component\Console\Input\InputInterface; | ||
use Symfony\Component\Console\Input\InputOption; | ||
use Symfony\Component\Console\Output\OutputInterface; | ||
|
||
/** | ||
* Class PluginRulesConditionCommand | ||
* | ||
* @package Drupal\Console\Command\Generate | ||
*/ | ||
class PluginRulesConditionCommand extends Command | ||
{ | ||
|
||
use ArrayInputTrait; | ||
use ConfirmationTrait; | ||
use ModuleTrait; | ||
use ServicesTrait; | ||
|
||
/** | ||
* @var Manager | ||
*/ | ||
protected $extensionManager; | ||
|
||
/** | ||
* @var PluginRulesConditionGenerator | ||
*/ | ||
protected $generator; | ||
|
||
/** | ||
* @var StringConverter | ||
*/ | ||
protected $stringConverter; | ||
|
||
/** | ||
* @var Validator | ||
*/ | ||
protected $validator; | ||
|
||
/** | ||
* @var ChainQueue | ||
*/ | ||
protected $chainQueue; | ||
|
||
|
||
/** | ||
* PluginRulesConditionCommand constructor. | ||
* | ||
* @param Manager $extensionManager | ||
* @param PluginRulesConditionGenerator $generator | ||
* @param StringConverter $stringConverter | ||
* @param Validator $validator | ||
* @param ChainQueue $chainQueue | ||
*/ | ||
public function __construct( | ||
Manager $extensionManager, | ||
PluginRulesConditionGenerator $generator, | ||
StringConverter $stringConverter, | ||
Validator $validator, | ||
ChainQueue $chainQueue | ||
) { | ||
$this->extensionManager = $extensionManager; | ||
$this->generator = $generator; | ||
$this->stringConverter = $stringConverter; | ||
$this->validator = $validator; | ||
$this->chainQueue = $chainQueue; | ||
parent::__construct(); | ||
} | ||
|
||
protected function configure() | ||
{ | ||
$this | ||
->setName('generate:plugin:rules:condition') | ||
->setDescription($this->trans('commands.generate.plugin.rules.condition.description')) | ||
->setHelp($this->trans('commands.generate.plugin.rules.condition.help')) | ||
->addOption( | ||
'module', | ||
null, | ||
InputOption::VALUE_REQUIRED, | ||
$this->trans('commands.common.options.module') | ||
) | ||
->addOption( | ||
'class', | ||
null, | ||
InputOption::VALUE_OPTIONAL, | ||
$this->trans('commands.generate.plugin.rules.condition.options.class') | ||
) | ||
->addOption( | ||
'label', | ||
null, | ||
InputOption::VALUE_OPTIONAL, | ||
$this->trans('commands.generate.plugin.rules.condition.options.label') | ||
) | ||
->addOption( | ||
'plugin-id', | ||
null, | ||
InputOption::VALUE_OPTIONAL, | ||
$this->trans('commands.generate.plugin.rules.condition.options.plugin-id') | ||
) | ||
->addOption( | ||
'category', | ||
null, | ||
InputOption::VALUE_OPTIONAL, | ||
$this->trans('commands.generate.plugin.rules.condition.options.category') | ||
) | ||
->addOption( | ||
'context', | ||
null, | ||
InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, | ||
$this->trans('commands.generate.plugin.rules.condition.options.context') | ||
) | ||
->setAliases(['gprc']); | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
protected function execute(InputInterface $input, OutputInterface $output) | ||
{ | ||
// @see use Drupal\Console\Command\Shared\ConfirmationTrait::confirmOperation | ||
if (!$this->confirmOperation()) { | ||
return 1; | ||
} | ||
|
||
$module = $input->getOption('module'); | ||
$class_name = $this->validator->validateClassName($input->getOption('class')); | ||
$label = $input->getOption('label'); | ||
$plugin_id = $input->getOption('plugin-id'); | ||
$category = $input->getOption('category'); | ||
$context = $input->getOption('context'); | ||
$noInteraction = $input->getOption('no-interaction'); | ||
|
||
// Parse nested data. | ||
if ($noInteraction) { | ||
$context = $this->explodeInlineArray($context); | ||
} | ||
|
||
$this->generator->generate([ | ||
'module' => $module, | ||
'class_name' => $class_name, | ||
'label' => $label, | ||
'plugin_id' => $plugin_id, | ||
'category' => $category, | ||
'context' => $context, | ||
]); | ||
|
||
$this->chainQueue->addCommand('cache:rebuild', | ||
['cache' => 'discovery']); | ||
|
||
return 0; | ||
} | ||
|
||
protected function interact(InputInterface $input, OutputInterface $output) | ||
{ | ||
// --module option | ||
$this->getModuleOption(); | ||
|
||
// --class option | ||
$class_name = $input->getOption('class'); | ||
if (!$class_name) { | ||
$class_name = $this->getIo()->ask( | ||
$this->trans('commands.generate.plugin.rules.condition.options.class'), | ||
'DefaultCondition', | ||
function ($class_name) { | ||
return $this->validator->validateClassName($class_name); | ||
} | ||
); | ||
$input->setOption('class', $class_name); | ||
} | ||
|
||
// --label option | ||
$label = $input->getOption('label'); | ||
if (!$label) { | ||
$label = $this->getIo()->ask( | ||
$this->trans('commands.generate.plugin.rules.condition.options.label'), | ||
$this->stringConverter->camelCaseToHuman($class_name) | ||
); | ||
$input->setOption('label', $label); | ||
} | ||
|
||
// --plugin-id option | ||
$plugin_id = $input->getOption('plugin-id'); | ||
if (!$plugin_id) { | ||
$plugin_id = $this->getIo()->ask( | ||
$this->trans('commands.generate.plugin.rules.condition.options.plugin-id'), | ||
$this->stringConverter->camelCaseToUnderscore($class_name) | ||
); | ||
$input->setOption('plugin-id', $plugin_id); | ||
} | ||
|
||
// --category option | ||
$category = $input->getOption('category'); | ||
if (!$category) { | ||
$category = $this->getIo()->ask( | ||
$this->trans('commands.generate.plugin.rules.condition.options.category'), | ||
$this->stringConverter->camelCaseToUnderscore($class_name) | ||
); | ||
$input->setOption('category', $category); | ||
} | ||
|
||
// --context option | ||
$context = $input->getOption('context'); | ||
if (empty($context)) { | ||
|
||
$context = []; | ||
if ($this->getIo()->confirm( | ||
$this->trans('commands.generate.plugin.rules.condition.questions.context'), | ||
true | ||
)) { | ||
while (true) { | ||
$this->getIo()->newLine(); | ||
|
||
$input_name = $this->getIo()->ask( | ||
$this->trans('commands.generate.plugin.rules.condition.questions.context-name') | ||
); | ||
|
||
$input_type = $this->getIo()->ask( | ||
$this->trans('commands.generate.plugin.rules.condition.questions.context-type') | ||
); | ||
|
||
$input_label = $this->getIo()->ask( | ||
$this->trans('commands.generate.plugin.rules.condition.questions.context-label') | ||
); | ||
|
||
$input_description = $this->getIo()->ask( | ||
$this->trans('commands.generate.plugin.rules.condition.questions.context-description') | ||
); | ||
|
||
array_push( | ||
$context, | ||
[ | ||
'name' => $input_name, | ||
'type' => $input_type, | ||
'label' => $input_label, | ||
'description' => $input_description, | ||
] | ||
); | ||
|
||
$this->getIo()->newLine(); | ||
if (!$this->getIo()->confirm( | ||
$this->trans('commands.generate.plugin.rules.condition.questions.another-context'), | ||
true | ||
)) { | ||
break; | ||
} | ||
} | ||
} | ||
} else { | ||
$context = $this->explodeInlineArray($context); | ||
} | ||
|
||
$input->setOption('context', $context); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
<?php | ||
|
||
/** | ||
* @file | ||
* Contains \Drupal\Console\Generator\PluginBlockGenerator. | ||
*/ | ||
|
||
namespace Drupal\Console\Generator; | ||
|
||
use Drupal\Console\Core\Generator\Generator; | ||
use Drupal\Console\Extension\Manager; | ||
|
||
class PluginRulesConditionGenerator extends Generator | ||
{ | ||
/** | ||
* @var Manager | ||
*/ | ||
protected $extensionManager; | ||
|
||
/** | ||
* PluginRulesConditionGenerator constructor. | ||
* | ||
* @param Manager $extensionManager | ||
*/ | ||
public function __construct( | ||
Manager $extensionManager | ||
) { | ||
$this->extensionManager = $extensionManager; | ||
} | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function generate(array $parameters) | ||
{ | ||
$module = $parameters['module']; | ||
$class_name = $parameters['class_name']; | ||
|
||
$this->renderFile( | ||
'module/src/Plugin/Condition/rulescondition.php.twig', | ||
$this->extensionManager->getPluginPath($module, 'Condition') . '/' . $class_name . '.php', | ||
$parameters | ||
); | ||
} | ||
} |
43 changes: 43 additions & 0 deletions
43
templates/module/src/Plugin/Condition/rulescondition.php.twig
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
{% extends "base/class.php.twig" %} | ||
|
||
{% block file_path %} | ||
\Drupal\{{module}}\Plugin\Condition\{{class_name}}. | ||
{% endblock %} | ||
|
||
{% block namespace_class %} | ||
namespace Drupal\{{module}}\Plugin\Condition; | ||
{% endblock %} | ||
|
||
{% block use_class %} | ||
use Drupal\rules\Core\RulesConditionBase; | ||
{% endblock %} | ||
|
||
{% block class_declaration %} | ||
/** | ||
* Provides a '{{class_name}}' condition. | ||
* | ||
* @Condition( | ||
* id = "{{plugin_id}}", | ||
* label = @Translation("{{label}}"), | ||
* category = @Translation("{{category}}"), | ||
{% if context %} | ||
* context = { | ||
{% for item in context %} | ||
* "{{ item.name }}" = @ContextDefinition("{{ item.type }}", | ||
* label = @Translation("{{ item.label }}"), | ||
* description = @Translation("{{ item.description }}") | ||
* ), | ||
{% endfor %} | ||
* } | ||
{% endif %} | ||
* ) | ||
*/ | ||
class {{class_name}} extends RulesConditionBase {% endblock %} | ||
{% block class_methods %} | ||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function doEvaluate($object = NULL) { | ||
// Insert code here. | ||
} | ||
{% endblock %} |