From db3492a41b5654999d0f8945fab801228d662eb9 Mon Sep 17 00:00:00 2001 From: Mats Mikkel Rummelhoff Date: Mon, 10 Jul 2023 14:42:51 +0200 Subject: [PATCH] Adds support for fields config --- src/AIMate.php | 67 ++++++++++++++++++++++++++++++++++----- src/templates/button.twig | 4 ++- 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/src/AIMate.php b/src/AIMate.php index b9c0ec8..60235f9 100644 --- a/src/AIMate.php +++ b/src/AIMate.php @@ -5,19 +5,19 @@ use Craft; use craft\base\ElementInterface; use craft\base\Field; -use craft\base\FieldLayoutElement; use craft\base\Model; use craft\base\Plugin; use craft\events\CreateFieldLayoutFormEvent; use craft\events\DefineFieldHtmlEvent; use craft\events\TemplateEvent; use craft\fieldlayoutelements\entries\EntryTitleField; -use craft\fieldlayoutelements\TitleField; use craft\fields\PlainText; use craft\fields\Table; +use craft\helpers\Db; use craft\helpers\StringHelper; use craft\log\MonologTarget; use craft\models\FieldLayout; +use craft\records\MatrixBlockType; use craft\web\View; use Illuminate\Support\Collection; @@ -96,10 +96,15 @@ static function (DefineFieldHtmlEvent $event) { return; } $field = $event->sender; - if (!$field instanceof Field || !static::isFieldEnabled($field)) { + if (!$field instanceof Field || !static::isFieldSupported($field)) { return; } - $buttonHtml = Craft::$app->view->renderTemplate('_aimate/button.twig', ['field' => $field, 'element' => $element], View::TEMPLATE_MODE_CP); + $fieldConfig = static::getFieldConfig($field, $element); + if ($fieldConfig === null) { + return; + } + $prompts = $fieldConfig['prompts'] ?? null; + $buttonHtml = Craft::$app->view->renderTemplate('_aimate/button.twig', ['field' => $field, 'element' => $element, 'prompts' => $prompts,], View::TEMPLATE_MODE_CP); if ($field instanceof \craft\ckeditor\Field) { $event->html = str_replace('', "$buttonHtml", $event->html); } else { @@ -117,17 +122,23 @@ static function (CreateFieldLayoutFormEvent $event) { if (!$element instanceof ElementInterface) { return; } + $settings = AIMate::getInstance()->getSettings(); + $fieldsConfig = $settings->fields; + if (!empty($fieldsConfig) && !in_array('title', array_keys($fieldsConfig))) { + return; + } + $prompts = $fieldsConfig['title']['prompts'] ?? null; Event::on( View::class, View::EVENT_AFTER_RENDER_TEMPLATE, - static function (TemplateEvent $event) use ($element) { - if ($event->template !== '_includes/forms/text.twig') { + static function (TemplateEvent $event) use ($element, $prompts) { + if ($event->templateMode !== View::TEMPLATE_MODE_CP || $event->template !== '_includes/forms/text.twig') { return; } if (!StringHelper::startsWith($event->output, 'view->renderTemplate('_aimate/button.twig', ['field' => ['id' => 'title'], 'element' => $element], View::TEMPLATE_MODE_CP); + $buttonHtml = Craft::$app->view->renderTemplate('_aimate/button.twig', ['field' => ['id' => 'title'], 'element' => $element, 'prompts' => $prompts], View::TEMPLATE_MODE_CP); $event->output = $buttonHtml . $event->output; } ); @@ -140,7 +151,7 @@ static function (TemplateEvent $event) use ($element) { * @param Field $field * @return bool */ - private static function isFieldEnabled(Field $field): bool + private static function isFieldSupported(Field $field): bool { // Only a subset of field types are supported if (!in_array(get_class($field), [ @@ -158,4 +169,44 @@ private static function isFieldEnabled(Field $field): bool return true; } + /** + * @param Field $field + * @param ElementInterface $element + * @return array|null + * @throws \yii\base\InvalidConfigException + */ + private static function getFieldConfig(Field $field, ElementInterface $element): ?array + { + $fieldsConfig = AIMate::getInstance()->getSettings()->fields; + if (empty($fieldsConfig)) { + // They didn't configure anything, so anything goes! + return []; + } + $fieldHandle = null; + if ($field->context !== 'global') { + $contextParts = explode(':', $field->context); + if ($contextParts[0] ?? null === 'matrixBlockType' && !empty($contextParts[1])) { + $matrixBlockType = \Craft::$app->getMatrix()->getBlockTypeById(Db::idByUid(MatrixBlockType::tableName(), $contextParts[1])); + $matrixField = $matrixBlockType->getField(); + $fieldHandle = $matrixField->handle . '.' . $matrixBlockType->handle . ':' . $field->handle; + } + } else { + $fieldHandle = $field->handle; + } + if (!$fieldHandle) { + return null; + } + // Look for config by field handle + $fieldConfig = $fieldsConfig[$fieldHandle] ?? null; + // Look for config by field type + if ($fieldConfig === null) { + $fieldType = get_class($field); + $fieldConfig = $fieldsConfig[$fieldType] ?? null; + } + if ($fieldConfig === null || $fieldConfig === false) { + return null; + } + return is_array($fieldConfig) ? $fieldConfig : []; + } + } diff --git a/src/templates/button.twig b/src/templates/button.twig index dd4d4dc..62234e2 100644 --- a/src/templates/button.twig +++ b/src/templates/button.twig @@ -1,7 +1,9 @@ {% import '_includes/forms.twig' as forms %} {% set settings = craft.app.plugins.plugin('_aimate').settings %} -{% set prompts = settings.prompts|default([]) %} +{% set allPrompts = settings.prompts|default([]) %} +{% set promptsToRender = prompts ?? allPrompts|column('handle') %} +{% set prompts = allPrompts|filter(prompt => prompt.handle in promptsToRender) %} {% js %}