Skip to content

Commit

Permalink
Generator of rules condition (#3827)
Browse files Browse the repository at this point in the history
* Add Rules Condition command

* Add generate:plugin:rules:condition command. Generator for the command and templates
  • Loading branch information
LOBsTerr authored Apr 6, 2019
1 parent a0714c5 commit aa5197b
Show file tree
Hide file tree
Showing 5 changed files with 371 additions and 4 deletions.
3 changes: 3 additions & 0 deletions config/services/generate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,9 @@ services:
arguments: ['@console.extension_manager', '@console.plugin_rules_action_generator','@console.string_converter', '@console.validator', '@console.chain_queue']
tags:
- { name: drupal.command }
console.generate_plugin_rules_condition:
class: Drupal\Console\Command\Generate\PluginRulesConditionCommand
arguments: ['@console.extension_manager', '@console.plugin_rules_condition_generator','@console.string_converter', '@console.validator', '@console.chain_queue']
console.generate_plugin_rules_dataprocessor:
class: Drupal\Console\Command\Generate\PluginRulesDataprocessorCommand
arguments: ['@console.extension_manager', '@console.plugin_rules_dataprocessor_generator','@console.string_converter', '@console.validator', '@console.chain_queue']
Expand Down
13 changes: 9 additions & 4 deletions config/services/generator.yml
Original file line number Diff line number Diff line change
Expand Up @@ -126,11 +126,16 @@ services:
arguments: ['@console.extension_manager']
tags:
- { name: drupal.generator }
console.plugin_rules_condition_generator:
class: Drupal\Console\Generator\PluginRulesConditionGenerator
arguments: ['@console.extension_manager']
tags:
- { name: drupal.generator }
console.plugin_rules_dataprocessor_generator:
class: Drupal\Console\Generator\PluginRulesDataprocessorGenerator
arguments: ['@console.extension_manager']
tags:
- { name: drupal.generator }
class: Drupal\Console\Generator\PluginRulesDataprocessorGenerator
arguments: ['@console.extension_manager']
tags:
- { name: drupal.generator }
console.plugin_skeleton_generator:
class: Drupal\Console\Generator\PluginSkeletonGenerator
arguments: ['@console.extension_manager']
Expand Down
271 changes: 271 additions & 0 deletions src/Command/Generate/PluginRulesConditionCommand.php
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);
}
}
45 changes: 45 additions & 0 deletions src/Generator/PluginRulesConditionGenerator.php
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 templates/module/src/Plugin/Condition/rulescondition.php.twig
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 %}

0 comments on commit aa5197b

Please sign in to comment.