diff --git a/src/Plugin/AiFunctionCall/ActionPluginBase.php b/src/Plugin/AiFunctionCall/ActionPluginBase.php index 69216b4b3ac7216d0c36aee45ea96f018a04ac42..bb287600e1b7e967914e0d166b86c4e3c75be95d 100644 --- a/src/Plugin/AiFunctionCall/ActionPluginBase.php +++ b/src/Plugin/AiFunctionCall/ActionPluginBase.php @@ -3,6 +3,7 @@ namespace Drupal\ai\Plugin\AiFunctionCall; use Drupal\Component\Plugin\ConfigurableInterface; +use Drupal\Core\Action\ActionManager; use Drupal\Core\Action\ActionPluginCollection; use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\ai\Attribute\FunctionCall; @@ -25,32 +26,56 @@ use Symfony\Component\DependencyInjection\ContainerInterface; )] class ActionPluginBase extends FunctionCallBase implements ExecutableFunctionCallInterface { + /** + * The action manager service. + * + * @var \Drupal\Core\Action\ActionManager + */ + protected ActionManager $actionManager; + /** * The action plugin. * - * @var \Drupal\Core\Action\ActionInterface + * @var \Drupal\Core\Action\ActionPluginCollection */ protected $pluginCollection; /** - * The action plugin manager. + * Constructs a FunctionCall plugin. * - * @var \Drupal\Core\Action\ActionManager + * @param array $configuration + * A configuration array containing information about the plugin instance. + * @param string $plugin_id + * The plugin_id for the plugin instance. + * @param mixed $plugin_definition + * The plugin implementation definition. + * @param \Drupal\ai\Utility\ContextDefinitionNormalizer $context_definition_normalizer + * The context definition normalizer service. + * @param \Drupal\Core\Action\ActionManager $action_manager + * The action manager service. */ - protected $actionManager; + public function __construct( + array $configuration, + $plugin_id, + $plugin_definition, + protected ContextDefinitionNormalizer $context_definition_normalizer, + protected ActionManager $action_manager, + ) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $context_definition_normalizer); + $this->actionManager = $action_manager; + } /** * Load from dependency injection container. */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): FunctionCallInterface|static { - $instance = new static( + return new static( $configuration, $plugin_id, $plugin_definition, - new ContextDefinitionNormalizer(), + $container->get('ai.context_definition_normalizer'), + $container->get('plugin.manager.action') ); - $instance->actionManager = $container->get('plugin.manager.action'); - return $instance; } /** @@ -62,19 +87,23 @@ class ActionPluginBase extends FunctionCallBase implements ExecutableFunctionCal $params = []; $configuration = $action_plugin->getConfiguration(); // If context keys exist, not in configuration, set to execute. - foreach ($this->getContexts() as $key => $context) { + foreach ($this->getContextValues() as $key => $value) { if (isset($configuration[$key])) { - $configuration[$key] = $context->getContextValue(); + $configuration[$key] = $value; } else { - $params[$key] = $context; + $params[$key] = $value; } } + $action_plugin->setConfiguration($configuration); } else { - $params = $this->getContexts(); + $params = $this->getContextValues(); } - + $params = array_values($params); + // @todo Add access check. + // @todo Count params? or find something better. + // $this->actionPlugin->access($entity, \Drupal::currentUser()); $action_plugin->execute(...$params); }