From 9eb41c7333ae0c7bde430f4574995fda3cfbf3b2 Mon Sep 17 00:00:00 2001 From: mbouchaala Date: Sun, 2 May 2021 15:20:39 +0200 Subject: [PATCH 1/7] Add meta checkbox field type for rendering meta robots --- bundle/Core/FieldType/Metas/FormMapper.php | 11 ++--- .../MetasStorage/Gateway/LegacyStorage.php | 3 ++ bundle/Core/FieldType/Metas/Type.php | 5 ++- bundle/Core/Meta.php | 41 +++++++++++++++---- bundle/DependencyInjection/Configuration.php | 6 +++ bundle/Form/Type/MetaType.php | 30 ++++++++++---- bundle/Form/Type/MetasCollectionType.php | 2 +- bundle/Form/Type/MetasFieldType.php | 8 +++- bundle/Resources/config/default_settings.yml | 7 ++++ .../css/views/fields/edit/novaseometas.css | 14 +++++++ bundle/Resources/sql/update-shema.sql | 2 + .../views/fields/novaseometas.html.twig | 2 + .../views/fields/novaseometas_admin.html.twig | 2 +- documentation/INSTALL.md | 2 +- 14 files changed, 108 insertions(+), 27 deletions(-) create mode 100644 bundle/Resources/sql/update-shema.sql diff --git a/bundle/Core/FieldType/Metas/FormMapper.php b/bundle/Core/FieldType/Metas/FormMapper.php index f046016..bd081ac 100644 --- a/bundle/Core/FieldType/Metas/FormMapper.php +++ b/bundle/Core/FieldType/Metas/FormMapper.php @@ -85,11 +85,11 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $formConfig = $fieldForm->getConfig(); $metasConfig = $this->configResolver->getParameter('fieldtype_metas', 'nova_ezseo'); - - if (empty($data->value->metas)) { - foreach (array_keys($metasConfig) as $key) { - $data->value->metas[$key] = new Meta($key, ''); - } + $metasData = $data->value->metas; + foreach ($metasConfig as $key => $meta) { + $content = isset($metasData[$key]) ? $metasData[$key]->getContent() : null; + $fieldType = isset($metasData[$key]) && $metasData[$key]->getFieldType() != '' ? $metasData[$key]->getFieldType() : $meta['type']; + $data->value->metas[$key] = new Meta($key, $content, $fieldType); } $fieldForm @@ -101,6 +101,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) [ 'required' => $fieldDefinition->isRequired, 'label' => $fieldDefinition->getName($formConfig->getOption('languageCode')), + 'metaConfig' => $metasConfig ] ) ->setAutoInitialize(false) diff --git a/bundle/Core/FieldType/Metas/MetasStorage/Gateway/LegacyStorage.php b/bundle/Core/FieldType/Metas/MetasStorage/Gateway/LegacyStorage.php index 9680b09..a798581 100644 --- a/bundle/Core/FieldType/Metas/MetasStorage/Gateway/LegacyStorage.php +++ b/bundle/Core/FieldType/Metas/MetasStorage/Gateway/LegacyStorage.php @@ -89,6 +89,9 @@ public function storeFieldData(VersionInfo $versionInfo, Field $field) )->set( $connection->quoteColumn('meta_content'), $insertQuery->bindValue($meta['meta_content'], null, PDO::PARAM_STR) + )->set( + $connection->quoteColumn('meta_fieldtype'), + $insertQuery->bindValue($meta['meta_fieldtype'], null, PDO::PARAM_STR) )->set( $connection->quoteColumn('objectattribute_id'), $insertQuery->bindValue($field->id, null, PDO::PARAM_INT) diff --git a/bundle/Core/FieldType/Metas/Type.php b/bundle/Core/FieldType/Metas/Type.php index 5786653..975d9e3 100644 --- a/bundle/Core/FieldType/Metas/Type.php +++ b/bundle/Core/FieldType/Metas/Type.php @@ -186,7 +186,9 @@ public function fromHash($hash) } $meta = new Meta(); $meta->setName($hashItem['meta_name']); - $meta->setContent($hashItem['meta_content']); + $meta->setFieldType(isset($hashItem['meta_fieldtype']) ? $hashItem['meta_fieldtype'] : ''); + $content = isset($hashItem['meta_fieldtype']) && $hashItem['meta_fieldtype'] == "boolean" ? ($hashItem['meta_content'] == "1" ? true : false) : $hashItem['meta_content']; + $meta->setContent($content); $metas[] = $meta; } @@ -208,6 +210,7 @@ public function toHash(SPIValue $value) $hash[$meta->getName()] = [ 'meta_name' => $meta->getName(), 'meta_content' => $meta->getContent(), + 'meta_fieldtype' => $meta->getFieldType(), ]; } diff --git a/bundle/Core/Meta.php b/bundle/Core/Meta.php index a9c2527..ef93c4f 100644 --- a/bundle/Core/Meta.php +++ b/bundle/Core/Meta.php @@ -29,16 +29,25 @@ class Meta */ protected $content; + /** + * Meta fieldType. + * + * @var string + */ + protected $fieldType; + /** * Constructor. * * @param string $name - * @param string $content + * @param mixed $content + * @param string $fieldType */ - public function __construct(?string $name = null, ?string $content = null) + public function __construct(?string $name = null, $content = null, ?string $fieldType = null) { - $this->name = $name; - $this->content = $content; + $this->name = $name; + $this->content = $content; + $this->fieldType = $fieldType; } public function getName(): string @@ -53,14 +62,26 @@ public function setName(?string $name): self return $this; } - public function getContent(): string + public function getFieldType(): string + { + return $this->fieldType ?? ''; + } + + public function setFieldType(?string $fieldType): self + { + $this->fieldType = $fieldType ?? ''; + + return $this; + } + + public function getContent() { - return $this->content ?? ''; + return $this->content ?? null; } - public function setContent(?string $content): self + public function setContent($content): self { - $this->content = $content ?? ''; + $this->content = $content ?? null; return $this; } @@ -81,6 +102,7 @@ public function attributes(): array return [ 'name', 'content', + 'fieldType' ]; } @@ -96,6 +118,9 @@ public function attribute(string $name): ?string case 'content': return $this->getContent(); break; + case 'fieldType': + return $this->getFieldType(); + break; default: throw new PropertyNotFoundException($name, \get_class($this)); break; diff --git a/bundle/DependencyInjection/Configuration.php b/bundle/DependencyInjection/Configuration.php index a877816..a11a0d9 100644 --- a/bundle/DependencyInjection/Configuration.php +++ b/bundle/DependencyInjection/Configuration.php @@ -34,6 +34,12 @@ public function getConfigTreeBuilder(): TreeBuilder ->prototype('array') ->children() ->scalarNode('label')->isRequired()->end() + ->enumNode( 'type' )->values(['boolean', 'text'])->defaultValue( 'text' )->end() + ->arrayNode( 'params' ) + ->children() + ->scalarNode( 'label' )->end() + ->end() + ->end() ->scalarNode('default_pattern')->end() ->scalarNode('icon')->end() ->end() diff --git a/bundle/Form/Type/MetaType.php b/bundle/Form/Type/MetaType.php index 8af80b3..471b494 100644 --- a/bundle/Form/Type/MetaType.php +++ b/bundle/Form/Type/MetaType.php @@ -13,6 +13,7 @@ use Novactive\Bundle\eZSEOBundle\Core\Meta; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\HiddenType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; @@ -35,20 +36,33 @@ public function getBlockPrefix(): string public function buildForm(FormBuilderInterface $builder, array $options): void { + $label = false; + $type = ''; + if (isset($options['metaConfig'][$builder->getName()])) { + $meta = $options['metaConfig'][$builder->getName()]; + $type = $meta['type']; + $label = isset($meta['params']) ? $meta['params']['label'] : $label; + } $builder - ->add('name', HiddenType::class) - ->add( - 'content', - TextType::class, - [ + ->add('name', HiddenType::class); + if ($type == 'boolean') { + $builder->add('content', CheckboxType::class, [ + 'label' => $label, + 'attr' => [ + 'class' => 'form-control', + 'false_values' => '0' + ] + ]); + } else { + $builder->add('content', TextType::class, [ 'label' => false, 'empty_data' => '', - ] - ); + ]); + } } public function configureOptions(OptionsResolver $resolver): void { - $resolver->setDefault('data_class', Meta::class); + $resolver->setDefaults(['data_class' => Meta::class, 'metaConfig' => null]); } } diff --git a/bundle/Form/Type/MetasCollectionType.php b/bundle/Form/Type/MetasCollectionType.php index ef28b17..cbeea18 100644 --- a/bundle/Form/Type/MetasCollectionType.php +++ b/bundle/Form/Type/MetasCollectionType.php @@ -37,7 +37,7 @@ public function configureOptions(OptionsResolver $resolver): void 'allow_add' => false, 'allow_delete' => false, 'entry_type' => MetaType::class, - 'entry_options' => ['required' => false], + 'entry_options' => ['required' => false, 'metaConfig' => null], 'required' => false, 'label' => 'field_definition', 'translation_domain' => 'fieldtypes', diff --git a/bundle/Form/Type/MetasFieldType.php b/bundle/Form/Type/MetasFieldType.php index ac153e6..ac589a8 100644 --- a/bundle/Form/Type/MetasFieldType.php +++ b/bundle/Form/Type/MetasFieldType.php @@ -34,11 +34,15 @@ public function getBlockPrefix(): string public function buildForm(FormBuilderInterface $builder, array $options): void { $builder - ->add('metas', MetasCollectionType::class); + ->add('metas', MetasCollectionType::class, + [ + 'entry_options' => ['required' => false, 'metaConfig' => $options['metaConfig']] + ]) + ; } public function configureOptions(OptionsResolver $resolver): void { - $resolver->setDefault('data_class', Value::class); + $resolver->setDefaults([ 'metaConfig' => null, 'data_class' => Value::class]); } } diff --git a/bundle/Resources/config/default_settings.yml b/bundle/Resources/config/default_settings.yml index ea3db65..8f92a84 100644 --- a/bundle/Resources/config/default_settings.yml +++ b/bundle/Resources/config/default_settings.yml @@ -80,3 +80,10 @@ parameters: label: 'Twitter - Image' default_pattern: "" icon: 'twitter-square' + 'robots': + label: 'Robots' + type: 'boolean' + params: + label: 'NOINDEX' + default_pattern: 'all' + icon: 'book' diff --git a/bundle/Resources/public/css/views/fields/edit/novaseometas.css b/bundle/Resources/public/css/views/fields/edit/novaseometas.css index ceb0ba1..cf2a26e 100644 --- a/bundle/Resources/public/css/views/fields/edit/novaseometas.css +++ b/bundle/Resources/public/css/views/fields/edit/novaseometas.css @@ -118,3 +118,17 @@ float: left; clear: right; } + +.ez-field-edit--novaseometas .ez-data-source__input-wrapper .ez-data-source__input-wrapper .form-check .form-check-label { + display: none; +} + +.ez-field-edit--novaseometas .ez-data-source__input-wrapper .ez-data-source__input-wrapper .form-check .form-check-input { + margin-top: 0; + position: relative; + height: 30px; +} + +.ez-field-edit--novaseometas .ez-data-source__input-wrapper .ez-data-source__input-wrapper .form-check .form-check-input:focus { + box-shadow: none; +} diff --git a/bundle/Resources/sql/update-shema.sql b/bundle/Resources/sql/update-shema.sql new file mode 100644 index 0000000..a8db9dd --- /dev/null +++ b/bundle/Resources/sql/update-shema.sql @@ -0,0 +1,2 @@ +ALTER TABLE `novaseo_meta` +ADD `meta_fieldtype` varchar(255) COLLATE 'utf8_general_ci' NOT NULL AFTER `meta_content`; diff --git a/bundle/Resources/views/fields/novaseometas.html.twig b/bundle/Resources/views/fields/novaseometas.html.twig index 43f5290..3bf2366 100644 --- a/bundle/Resources/views/fields/novaseometas.html.twig +++ b/bundle/Resources/views/fields/novaseometas.html.twig @@ -16,6 +16,8 @@ {% elseif meta.name|trim starts with "og" %} + {% elseif meta.name == "robots" and meta.content %} + {% else %} {% endif %} diff --git a/bundle/Resources/views/fields/novaseometas_admin.html.twig b/bundle/Resources/views/fields/novaseometas_admin.html.twig index ffe7cfa..4cb3afc 100644 --- a/bundle/Resources/views/fields/novaseometas_admin.html.twig +++ b/bundle/Resources/views/fields/novaseometas_admin.html.twig @@ -7,7 +7,7 @@
  • {% set default_value = nova_ezseo.fieldtype_metas[meta.name] %} {{ default_value.label }}: - {{ meta.isEmpty() ? default_value.default_pattern|raw|escape : meta.content }} + {{ meta.isEmpty() ? default_value.default_pattern|raw|escape : (meta.name == 'robots' ? (meta.content ? 'noindex' : default_value.default_pattern|raw|escape) : meta.content) }}
  • {% endif %} {% endfor %} diff --git a/documentation/INSTALL.md b/documentation/INSTALL.md index 7c3abeb..7801549 100644 --- a/documentation/INSTALL.md +++ b/documentation/INSTALL.md @@ -57,7 +57,7 @@ _novaezseo_routes: ### Create the table -See the file `bundle/Resources/sql/shema.sql` +See the folder `bundle/Resources/sql` ### Remove the Robots.txt (native RewriteRules ) From ea58641faa90b9dab249ba7e1e8a9215e8e748f0 Mon Sep 17 00:00:00 2001 From: mbouchaala Date: Wed, 26 May 2021 08:22:22 +0200 Subject: [PATCH 2/7] Fix retours --- .../SeoMetadataBooleanFieldType.php | 45 +++++++++++++ .../SeoMetadataDefaultFieldType.php | 44 +++++++++++++ .../SeoMetadataFieldTypeInterface.php | 38 +++++++++++ .../SeoMetadataFieldTypeRegistry.php | 65 +++++++++++++++++++ bundle/Core/FieldType/Metas/FormMapper.php | 12 ++-- bundle/Core/FieldType/Metas/Type.php | 27 ++++---- bundle/Core/Meta.php | 4 +- bundle/DependencyInjection/Configuration.php | 8 +-- bundle/Form/Type/MetaType.php | 56 +++++++++------- bundle/Form/Type/MetasCollectionType.php | 2 +- bundle/Form/Type/MetasFieldType.php | 9 +-- bundle/NovaeZSEOBundle.php | 3 + bundle/Resources/config/admin_ui/services.yml | 4 ++ bundle/Resources/config/default_settings.yml | 30 +++++++++ bundle/Resources/config/services.yml | 5 ++ 15 files changed, 294 insertions(+), 58 deletions(-) create mode 100644 bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php create mode 100644 bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php create mode 100644 bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeInterface.php create mode 100644 bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php new file mode 100644 index 0000000..54ac1e7 --- /dev/null +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php @@ -0,0 +1,45 @@ + + * @copyright 2021 Novactive + * @license https://github.com/Novactive/NovaeZSEOBundle/blob/master/LICENSE MIT Licence + */ + +namespace Novactive\Bundle\eZSEOBundle\Core\FieldType\MetaFieldConverter; + +use Novactive\Bundle\eZSEOBundle\Core\Meta; +use Symfony\Component\Form\Extension\Core\Type\CheckboxType; +use Symfony\Component\Form\FormBuilderInterface; + +class SeoMetadataBooleanFieldType extends SeoMetadataDefaultFieldType +{ + + public function support(string $fieldType): bool + { + return 'boolean' === $fieldType; + } + + public function fromHash($hash): Meta + { + $meta = new Meta(); + $meta->setName($hash['meta_name']); + $meta->setFieldType($hash['meta_fieldtype']); + $content = $hash['meta_content'] == "1" ? true : false; + $meta->setContent($content); + + return $meta; + } + + public function mapForm(FormBuilderInterface &$builder, array $params) + { + $builder->add( + 'content', + CheckboxType::class, + $params + ); + } +} \ No newline at end of file diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php new file mode 100644 index 0000000..d520e47 --- /dev/null +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php @@ -0,0 +1,44 @@ + + * @copyright 2021 Novactive + * @license https://github.com/Novactive/NovaeZSEOBundle/blob/master/LICENSE MIT Licence + */ + +namespace Novactive\Bundle\eZSEOBundle\Core\FieldType\MetaFieldConverter; + +use Novactive\Bundle\eZSEOBundle\Core\Meta; +use Symfony\Component\Form\Extension\Core\Type\TextType; +use Symfony\Component\Form\FormBuilderInterface; + +class SeoMetadataDefaultFieldType implements SeoMetadataFieldTypeInterface +{ + public function support(string $fieldType): bool + { + return 'text' === $fieldType; + } + + public function fromHash($hash): Meta + { + $meta = new Meta(); + $meta->setName($hash['meta_name']); + $meta->setFieldType($hash['meta_fieldtype']); + $content = $hash['meta_content']; + $meta->setContent($content); + + return $meta; + } + + public function mapForm(FormBuilderInterface &$builder, array $params) + { + $builder->add( + 'content', + TextType::class, + $params + ); + } +} \ No newline at end of file diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeInterface.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeInterface.php new file mode 100644 index 0000000..ce7676f --- /dev/null +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeInterface.php @@ -0,0 +1,38 @@ + + * @copyright 2021 Novactive + * @license https://github.com/Novactive/NovaeZSEOBundle/blob/master/LICENSE MIT Licence + */ + +namespace Novactive\Bundle\eZSEOBundle\Core\FieldType\MetaFieldConverter; + +use Novactive\Bundle\eZSEOBundle\Core\Meta; +use Symfony\Component\Form\FormBuilderInterface; + +interface SeoMetadataFieldTypeInterface +{ + /** + * @param $hash + * + * @return Meta + */ + public function fromHash($hash): Meta; + + /** + * @param string $fieldType + * + * @return bool + */ + public function support(string $fieldType): bool; + + /** + * @param FormBuilderInterface $builder + * @param array $params + */ + public function mapForm(FormBuilderInterface &$builder, array $params); +} \ No newline at end of file diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php new file mode 100644 index 0000000..53114b0 --- /dev/null +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php @@ -0,0 +1,65 @@ + + * @copyright 2021 Novactive + * @license https://github.com/Novactive/NovaeZSEOBundle/blob/master/LICENSE MIT Licence + */ + +namespace Novactive\Bundle\eZSEOBundle\Core\FieldType\MetaFieldConverter; + +use Symfony\Component\Form\FormBuilderInterface; + +class SeoMetadataFieldTypeRegistry +{ + /** @var SeoMetadataFieldTypeInterface[] */ + protected $metaFieldTypes; + + /** + * SeoMetadataFieldTypeRegistry constructor. + * + * @param SeoMetadataFieldTypeInterface[] $metaFieldTypes + */ + public function __construct(iterable $metaFieldTypes) + { + foreach ($metaFieldTypes as $metaFieldType) { + $this->addMetaFieldType($metaFieldType); + } + } + + public function addMetaFieldType(SeoMetadataFieldTypeInterface $metaFieldType): void + { + $this->metaFieldTypes[] = $metaFieldType; + } + + public function fromHash($hash): array + { + $metas = []; + foreach ($hash as $hashItem) { + if (!is_array($hashItem)) { + continue; + } + foreach ($this->metaFieldTypes as $metaFieldType) { + if (!$metaFieldType->support($hashItem['meta_fieldtype'])) { + continue; + } + $metas[] = $metaFieldType->fromHash($hashItem); + } + } + + return $metas; + } + + public function mapForm(FormBuilderInterface &$builder, array $params, string $fieldType) + { + foreach ($this->metaFieldTypes as $metaFieldType) { + if (!$metaFieldType->support($fieldType)) { + continue; + } + $metaFieldType->mapForm($builder, $params); + } + } +} \ No newline at end of file diff --git a/bundle/Core/FieldType/Metas/FormMapper.php b/bundle/Core/FieldType/Metas/FormMapper.php index bd081ac..4a97e9a 100644 --- a/bundle/Core/FieldType/Metas/FormMapper.php +++ b/bundle/Core/FieldType/Metas/FormMapper.php @@ -85,10 +85,13 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) $formConfig = $fieldForm->getConfig(); $metasConfig = $this->configResolver->getParameter('fieldtype_metas', 'nova_ezseo'); - $metasData = $data->value->metas; + $metasData = $data->value->metas; foreach ($metasConfig as $key => $meta) { - $content = isset($metasData[$key]) ? $metasData[$key]->getContent() : null; - $fieldType = isset($metasData[$key]) && $metasData[$key]->getFieldType() != '' ? $metasData[$key]->getFieldType() : $meta['type']; + $content = isset($metasData[$key]) ? $metasData[$key]->getContent() : null; + $fieldType = $meta['type']; + if (isset($metasData[$key]) && $metasData[$key]->getFieldType() != '') { + $fieldType = $metasData[$key]->getFieldType(); + } $data->value->metas[$key] = new Meta($key, $content, $fieldType); } @@ -100,8 +103,7 @@ public function mapFieldValueForm(FormInterface $fieldForm, FieldData $data) MetasFieldType::class, [ 'required' => $fieldDefinition->isRequired, - 'label' => $fieldDefinition->getName($formConfig->getOption('languageCode')), - 'metaConfig' => $metasConfig + 'label' => $fieldDefinition->getName($formConfig->getOption('languageCode')) ] ) ->setAutoInitialize(false) diff --git a/bundle/Core/FieldType/Metas/Type.php b/bundle/Core/FieldType/Metas/Type.php index 975d9e3..04c1af4 100644 --- a/bundle/Core/FieldType/Metas/Type.php +++ b/bundle/Core/FieldType/Metas/Type.php @@ -17,12 +17,16 @@ use eZ\Publish\Core\FieldType\Value as CoreValue; use eZ\Publish\SPI\FieldType\Value as SPIValue; use eZ\Publish\SPI\Persistence\Content\FieldValue; +use Novactive\Bundle\eZSEOBundle\Core\FieldType\MetaFieldConverter\SeoMetadataFieldTypeRegistry; use Novactive\Bundle\eZSEOBundle\Core\Meta; class Type extends FieldType { const IDENTIFIER = 'novaseometas'; + /** @var SeoMetadataFieldTypeRegistry */ + protected $metaData; + /** * @var array */ @@ -33,6 +37,15 @@ class Type extends FieldType ], ]; + /** + * Type constructor. + * @param SeoMetadataFieldTypeRegistry $metaData + */ + public function __construct(SeoMetadataFieldTypeRegistry $metaData) + { + $this->metaData = $metaData; + } + /** * Validates the fieldSettings of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct. * @@ -179,20 +192,8 @@ public function fromHash($hash) if (!is_array($hash)) { return new Value([]); } - $metas = []; - foreach ($hash as $hashItem) { - if (!is_array($hashItem)) { - continue; - } - $meta = new Meta(); - $meta->setName($hashItem['meta_name']); - $meta->setFieldType(isset($hashItem['meta_fieldtype']) ? $hashItem['meta_fieldtype'] : ''); - $content = isset($hashItem['meta_fieldtype']) && $hashItem['meta_fieldtype'] == "boolean" ? ($hashItem['meta_content'] == "1" ? true : false) : $hashItem['meta_content']; - $meta->setContent($content); - $metas[] = $meta; - } - return new Value($metas); + return new Value($this->metaData->fromHash($hash)); } /** diff --git a/bundle/Core/Meta.php b/bundle/Core/Meta.php index ef93c4f..8cf3c7d 100644 --- a/bundle/Core/Meta.php +++ b/bundle/Core/Meta.php @@ -76,12 +76,12 @@ public function setFieldType(?string $fieldType): self public function getContent() { - return $this->content ?? null; + return $this->content; } public function setContent($content): self { - $this->content = $content ?? null; + $this->content = $content; return $this; } diff --git a/bundle/DependencyInjection/Configuration.php b/bundle/DependencyInjection/Configuration.php index a11a0d9..0584d5e 100644 --- a/bundle/DependencyInjection/Configuration.php +++ b/bundle/DependencyInjection/Configuration.php @@ -34,11 +34,9 @@ public function getConfigTreeBuilder(): TreeBuilder ->prototype('array') ->children() ->scalarNode('label')->isRequired()->end() - ->enumNode( 'type' )->values(['boolean', 'text'])->defaultValue( 'text' )->end() - ->arrayNode( 'params' ) - ->children() - ->scalarNode( 'label' )->end() - ->end() + ->enumNode('type')->values(['boolean', 'text'])->defaultValue('text')->end() + ->arrayNode('params') + ->prototype('variable')->end() ->end() ->scalarNode('default_pattern')->end() ->scalarNode('icon')->end() diff --git a/bundle/Form/Type/MetaType.php b/bundle/Form/Type/MetaType.php index 471b494..57a58c1 100644 --- a/bundle/Form/Type/MetaType.php +++ b/bundle/Form/Type/MetaType.php @@ -11,11 +11,11 @@ namespace Novactive\Bundle\eZSEOBundle\Form\Type; +use eZ\Publish\Core\MVC\ConfigResolverInterface; +use Novactive\Bundle\eZSEOBundle\Core\FieldType\MetaFieldConverter\SeoMetadataFieldTypeRegistry; use Novactive\Bundle\eZSEOBundle\Core\Meta; use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\HiddenType; -use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -24,6 +24,20 @@ */ class MetaType extends AbstractType { + /** @var ConfigResolverInterface */ + protected $configResolver; + + /** @var SeoMetadataFieldTypeRegistry */ + protected $metaData; + /** + * FormMapper constructor. + */ + public function __construct(ConfigResolverInterface $configResolver, SeoMetadataFieldTypeRegistry $metaData) + { + $this->configResolver = $configResolver; + $this->metaData = $metaData; + } + public function getName(): string { return $this->getBlockPrefix(); @@ -36,33 +50,25 @@ public function getBlockPrefix(): string public function buildForm(FormBuilderInterface $builder, array $options): void { - $label = false; - $type = ''; - if (isset($options['metaConfig'][$builder->getName()])) { - $meta = $options['metaConfig'][$builder->getName()]; - $type = $meta['type']; - $label = isset($meta['params']) ? $meta['params']['label'] : $label; + $metasConfig = $this->configResolver->getParameter('fieldtype_metas', 'nova_ezseo'); + + $type = 'text'; + $options = [ + 'label' => false, + 'empty_data' => '', + ]; + if (isset($metasConfig[$builder->getName()])) { + $meta = $metasConfig[$builder->getName()]; + $type = $meta['type']; + $options = !empty($meta['params']) ? $meta['params'] : $options; } - $builder - ->add('name', HiddenType::class); - if ($type == 'boolean') { - $builder->add('content', CheckboxType::class, [ - 'label' => $label, - 'attr' => [ - 'class' => 'form-control', - 'false_values' => '0' - ] - ]); - } else { - $builder->add('content', TextType::class, [ - 'label' => false, - 'empty_data' => '', - ]); - } + + $builder->add('name', HiddenType::class); + $this->metaData->mapForm($builder, $options, $type); } public function configureOptions(OptionsResolver $resolver): void { - $resolver->setDefaults(['data_class' => Meta::class, 'metaConfig' => null]); + $resolver->setDefault('data_class', Meta::class); } } diff --git a/bundle/Form/Type/MetasCollectionType.php b/bundle/Form/Type/MetasCollectionType.php index cbeea18..ef28b17 100644 --- a/bundle/Form/Type/MetasCollectionType.php +++ b/bundle/Form/Type/MetasCollectionType.php @@ -37,7 +37,7 @@ public function configureOptions(OptionsResolver $resolver): void 'allow_add' => false, 'allow_delete' => false, 'entry_type' => MetaType::class, - 'entry_options' => ['required' => false, 'metaConfig' => null], + 'entry_options' => ['required' => false], 'required' => false, 'label' => 'field_definition', 'translation_domain' => 'fieldtypes', diff --git a/bundle/Form/Type/MetasFieldType.php b/bundle/Form/Type/MetasFieldType.php index ac589a8..1a98c2f 100644 --- a/bundle/Form/Type/MetasFieldType.php +++ b/bundle/Form/Type/MetasFieldType.php @@ -33,16 +33,11 @@ public function getBlockPrefix(): string public function buildForm(FormBuilderInterface $builder, array $options): void { - $builder - ->add('metas', MetasCollectionType::class, - [ - 'entry_options' => ['required' => false, 'metaConfig' => $options['metaConfig']] - ]) - ; + $builder->add('metas', MetasCollectionType::class); } public function configureOptions(OptionsResolver $resolver): void { - $resolver->setDefaults([ 'metaConfig' => null, 'data_class' => Value::class]); + $resolver->setDefault('data_class', Value::class); } } diff --git a/bundle/NovaeZSEOBundle.php b/bundle/NovaeZSEOBundle.php index 5e9f470..e58b8ef 100644 --- a/bundle/NovaeZSEOBundle.php +++ b/bundle/NovaeZSEOBundle.php @@ -12,6 +12,7 @@ namespace Novactive\Bundle\eZSEOBundle; use LogicException; +use Novactive\Bundle\eZSEOBundle\Core\FieldType\MetaFieldConverter\SeoMetadataFieldTypeInterface; use Novactive\Bundle\eZSEOBundle\DependencyInjection\Compiler\CustomFallbackPass; use Novactive\Bundle\eZSEOBundle\DependencyInjection\Security\PolicyProvider\PolicyProvider; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -27,6 +28,8 @@ public function build(ContainerBuilder $container): void $container->addCompilerPass(new CustomFallbackPass()); $eZExtension = $container->getExtension('ezpublish'); $eZExtension->addPolicyProvider(new PolicyProvider()); + $container->registerForAutoconfiguration(SeoMetadataFieldTypeInterface::class) + ->addTag('seometa.fieldtype'); } public function getContainerExtension() diff --git a/bundle/Resources/config/admin_ui/services.yml b/bundle/Resources/config/admin_ui/services.yml index 859cb8b..c5024fc 100644 --- a/bundle/Resources/config/admin_ui/services.yml +++ b/bundle/Resources/config/admin_ui/services.yml @@ -1,8 +1,12 @@ services: + Novactive\Bundle\eZSEOBundle\Core\FieldType\MetaFieldConverter\SeoMetadataFieldTypeRegistry: + arguments: [!tagged seometa.fieldtype] + # FIELD TYPE Novactive\Bundle\eZSEOBundle\Core\FieldType\Metas\Type: parent: ezpublish.fieldType + autowire: true tags: - { name: ezpublish.fieldType, alias: novaseometas } diff --git a/bundle/Resources/config/default_settings.yml b/bundle/Resources/config/default_settings.yml index 8f92a84..28ed031 100644 --- a/bundle/Resources/config/default_settings.yml +++ b/bundle/Resources/config/default_settings.yml @@ -43,9 +43,15 @@ parameters: title: label: 'Title' default_pattern: "" + params: + label: false + empty_data: '' icon: 'book' description: label: 'Description' + params: + label: false + empty_data: '' default_pattern: ~ icon: 'book' keywords: @@ -54,30 +60,51 @@ parameters: icon: 'tags' 'canonical': label: 'External Canonical URL' + params: + label: false + empty_data: '' default_pattern: ~ icon: 'link' 'og:title': label: 'Facebook - Title' + params: + label: false + empty_data: '' default_pattern: "" icon: 'facebook-official' 'og:description': label: 'Facebook - Description' + params: + label: false + empty_data: '' default_pattern: "" icon: 'facebook-official' 'og:image': label: 'Facebook - Image' + params: + label: false + empty_data: '' default_pattern: "" icon: 'facebook-official' 'twitter:title': label: 'Twitter - Title' + params: + label: false + empty_data: '' default_pattern: "" icon: 'twitter-square' 'twitter:description': label: 'Twitter - Description' + params: + label: false + empty_data: '' default_pattern: "" icon: 'twitter-square' 'twitter:image': label: 'Twitter - Image' + params: + label: false + empty_data: '' default_pattern: "" icon: 'twitter-square' 'robots': @@ -85,5 +112,8 @@ parameters: type: 'boolean' params: label: 'NOINDEX' + attr: + class: form-control + false_values: '0' default_pattern: 'all' icon: 'book' diff --git a/bundle/Resources/config/services.yml b/bundle/Resources/config/services.yml index 6675a83..af5a20a 100644 --- a/bundle/Resources/config/services.yml +++ b/bundle/Resources/config/services.yml @@ -43,6 +43,9 @@ services: Novactive\Bundle\eZSEOBundle\Twig\NovaeZSEOExtension: ~ Novactive\Bundle\eZSEOBundle\Core\DummyCustomFallback: ~ + Novactive\Bundle\eZSEOBundle\Core\FieldType\MetaFieldConverter\: + resource: '../../Core/FieldType/MetaFieldConverter/*' + Novactive\Bundle\eZSEOBundle\Core\MetaNameSchema: arguments: $contentTypeHandler: "@ezpublish.spi.persistence.content_type_handler" @@ -85,3 +88,5 @@ services: novaezmailing.doctrine.entity_manager: class: Doctrine\ORM\EntityManagerInterface factory: 'Novactive\Bundle\eZSEOBundle\Core\SiteAccessAwareEntityManagerFactory:get' + + Novactive\Bundle\eZSEOBundle\Form\Type\MetaType: ~ \ No newline at end of file From 141fb255763cbc16e0c919083b20be08e46c5527 Mon Sep 17 00:00:00 2001 From: mbouchaala Date: Wed, 26 May 2021 08:25:35 +0200 Subject: [PATCH 3/7] clean code --- .../MetaFieldConverter/SeoMetadataBooleanFieldType.php | 2 +- .../MetaFieldConverter/SeoMetadataDefaultFieldType.php | 2 +- .../MetaFieldConverter/SeoMetadataFieldTypeInterface.php | 2 +- .../MetaFieldConverter/SeoMetadataFieldTypeRegistry.php | 2 +- bundle/Form/Type/MetaType.php | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php index 54ac1e7..827903a 100644 --- a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php @@ -42,4 +42,4 @@ public function mapForm(FormBuilderInterface &$builder, array $params) $params ); } -} \ No newline at end of file +} diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php index d520e47..571b4b3 100644 --- a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php @@ -41,4 +41,4 @@ public function mapForm(FormBuilderInterface &$builder, array $params) $params ); } -} \ No newline at end of file +} diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeInterface.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeInterface.php index ce7676f..f2eb494 100644 --- a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeInterface.php +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeInterface.php @@ -35,4 +35,4 @@ public function support(string $fieldType): bool; * @param array $params */ public function mapForm(FormBuilderInterface &$builder, array $params); -} \ No newline at end of file +} diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php index 53114b0..4c11280 100644 --- a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php @@ -62,4 +62,4 @@ public function mapForm(FormBuilderInterface &$builder, array $params, string $f $metaFieldType->mapForm($builder, $params); } } -} \ No newline at end of file +} diff --git a/bundle/Form/Type/MetaType.php b/bundle/Form/Type/MetaType.php index 57a58c1..52ea699 100644 --- a/bundle/Form/Type/MetaType.php +++ b/bundle/Form/Type/MetaType.php @@ -35,7 +35,7 @@ class MetaType extends AbstractType public function __construct(ConfigResolverInterface $configResolver, SeoMetadataFieldTypeRegistry $metaData) { $this->configResolver = $configResolver; - $this->metaData = $metaData; + $this->metaData = $metaData; } public function getName(): string From e793e685a636484fd6fdfc655fc7ef0f9dc2fa0d Mon Sep 17 00:00:00 2001 From: mbouchaala Date: Thu, 27 May 2021 12:55:39 +0200 Subject: [PATCH 4/7] Fix retours V2 --- .../SeoMetadataBooleanFieldType.php | 6 ++- .../SeoMetadataChoiceFieldType.php | 45 +++++++++++++++++++ .../SeoMetadataDefaultFieldType.php | 1 + bundle/Core/FieldType/Metas/Type.php | 10 ++--- bundle/DependencyInjection/Configuration.php | 2 +- bundle/Form/Type/MetaType.php | 15 +++---- bundle/Resources/config/default_settings.yml | 37 +++------------ .../views/fields/novaseometas.html.twig | 2 - .../views/fields/novaseometas_admin.html.twig | 2 +- 9 files changed, 70 insertions(+), 50 deletions(-) create mode 100644 bundle/Core/FieldType/MetaFieldConverter/SeoMetadataChoiceFieldType.php diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php index 827903a..ef10460 100644 --- a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php @@ -36,10 +36,14 @@ public function fromHash($hash): Meta public function mapForm(FormBuilderInterface &$builder, array $params) { + $option = [ + 'class' => 'form-control', + 'false_values' => '0' + ]; $builder->add( 'content', CheckboxType::class, - $params + array_merge($params, $option) ); } } diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataChoiceFieldType.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataChoiceFieldType.php new file mode 100644 index 0000000..0e349b6 --- /dev/null +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataChoiceFieldType.php @@ -0,0 +1,45 @@ + + * @copyright 2021 Novactive + * @license https://github.com/Novactive/NovaeZSEOBundle/blob/master/LICENSE MIT Licence + */ + +namespace Novactive\Bundle\eZSEOBundle\Core\FieldType\MetaFieldConverter; + +use Novactive\Bundle\eZSEOBundle\Core\Meta; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; +use Symfony\Component\Form\FormBuilderInterface; + +class SeoMetadataChoiceFieldType extends SeoMetadataDefaultFieldType +{ + + public function support(string $fieldType): bool + { + return 'select' === $fieldType; + } + + public function fromHash($hash): Meta + { + $meta = new Meta(); + $meta->setName($hash['meta_name']); + $meta->setFieldType($hash['meta_fieldtype']); + $content = $hash['meta_content']; + $meta->setContent($content); + + return $meta; + } + + public function mapForm(FormBuilderInterface &$builder, array $params) + { + $builder->add( + 'content', + ChoiceType::class, + $params + ); + } +} diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php index 571b4b3..5462f69 100644 --- a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php @@ -35,6 +35,7 @@ public function fromHash($hash): Meta public function mapForm(FormBuilderInterface &$builder, array $params) { + $params['empty_data'] = ''; $builder->add( 'content', TextType::class, diff --git a/bundle/Core/FieldType/Metas/Type.php b/bundle/Core/FieldType/Metas/Type.php index 04c1af4..3a0d608 100644 --- a/bundle/Core/FieldType/Metas/Type.php +++ b/bundle/Core/FieldType/Metas/Type.php @@ -25,7 +25,7 @@ class Type extends FieldType const IDENTIFIER = 'novaseometas'; /** @var SeoMetadataFieldTypeRegistry */ - protected $metaData; + protected $metadataFieldTypeRegistry; /** * @var array @@ -39,11 +39,11 @@ class Type extends FieldType /** * Type constructor. - * @param SeoMetadataFieldTypeRegistry $metaData + * @param SeoMetadataFieldTypeRegistry $metadataFieldTypeRegistry */ - public function __construct(SeoMetadataFieldTypeRegistry $metaData) + public function __construct(SeoMetadataFieldTypeRegistry $metadataFieldTypeRegistry) { - $this->metaData = $metaData; + $this->metadataFieldTypeRegistry = $metadataFieldTypeRegistry; } /** @@ -193,7 +193,7 @@ public function fromHash($hash) return new Value([]); } - return new Value($this->metaData->fromHash($hash)); + return new Value($this->metadataFieldTypeRegistry->fromHash($hash)); } /** diff --git a/bundle/DependencyInjection/Configuration.php b/bundle/DependencyInjection/Configuration.php index 0584d5e..0b23314 100644 --- a/bundle/DependencyInjection/Configuration.php +++ b/bundle/DependencyInjection/Configuration.php @@ -34,7 +34,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->prototype('array') ->children() ->scalarNode('label')->isRequired()->end() - ->enumNode('type')->values(['boolean', 'text'])->defaultValue('text')->end() + ->enumNode('type')->values(['boolean', 'text', 'select'])->defaultValue('text')->end() ->arrayNode('params') ->prototype('variable')->end() ->end() diff --git a/bundle/Form/Type/MetaType.php b/bundle/Form/Type/MetaType.php index 52ea699..b2fc193 100644 --- a/bundle/Form/Type/MetaType.php +++ b/bundle/Form/Type/MetaType.php @@ -28,14 +28,14 @@ class MetaType extends AbstractType protected $configResolver; /** @var SeoMetadataFieldTypeRegistry */ - protected $metaData; + protected $metadataFieldTypeRegistry; /** * FormMapper constructor. */ - public function __construct(ConfigResolverInterface $configResolver, SeoMetadataFieldTypeRegistry $metaData) + public function __construct(ConfigResolverInterface $configResolver, SeoMetadataFieldTypeRegistry $metadataFieldTypeRegistry) { - $this->configResolver = $configResolver; - $this->metaData = $metaData; + $this->configResolver = $configResolver; + $this->metadataFieldTypeRegistry = $metadataFieldTypeRegistry; } public function getName(): string @@ -54,17 +54,16 @@ public function buildForm(FormBuilderInterface $builder, array $options): void $type = 'text'; $options = [ - 'label' => false, - 'empty_data' => '', + 'label' => false, ]; if (isset($metasConfig[$builder->getName()])) { $meta = $metasConfig[$builder->getName()]; $type = $meta['type']; - $options = !empty($meta['params']) ? $meta['params'] : $options; + $options = array_merge($options, $meta['params']); } $builder->add('name', HiddenType::class); - $this->metaData->mapForm($builder, $options, $type); + $this->metadataFieldTypeRegistry->mapForm($builder, $options, $type); } public function configureOptions(OptionsResolver $resolver): void diff --git a/bundle/Resources/config/default_settings.yml b/bundle/Resources/config/default_settings.yml index 28ed031..1bec686 100644 --- a/bundle/Resources/config/default_settings.yml +++ b/bundle/Resources/config/default_settings.yml @@ -43,15 +43,9 @@ parameters: title: label: 'Title' default_pattern: "" - params: - label: false - empty_data: '' icon: 'book' description: label: 'Description' - params: - label: false - empty_data: '' default_pattern: ~ icon: 'book' keywords: @@ -60,60 +54,39 @@ parameters: icon: 'tags' 'canonical': label: 'External Canonical URL' - params: - label: false - empty_data: '' default_pattern: ~ icon: 'link' 'og:title': label: 'Facebook - Title' - params: - label: false - empty_data: '' default_pattern: "" icon: 'facebook-official' 'og:description': label: 'Facebook - Description' - params: - label: false - empty_data: '' default_pattern: "" icon: 'facebook-official' 'og:image': label: 'Facebook - Image' - params: - label: false - empty_data: '' default_pattern: "" icon: 'facebook-official' 'twitter:title': label: 'Twitter - Title' - params: - label: false - empty_data: '' default_pattern: "" icon: 'twitter-square' 'twitter:description': label: 'Twitter - Description' - params: - label: false - empty_data: '' default_pattern: "" icon: 'twitter-square' 'twitter:image': label: 'Twitter - Image' - params: - label: false - empty_data: '' default_pattern: "" icon: 'twitter-square' 'robots': label: 'Robots' - type: 'boolean' + type: 'select' params: - label: 'NOINDEX' - attr: - class: form-control - false_values: '0' + choices: + all: 'all' + nofollow: 'nofollow' + noindex: 'noindex' default_pattern: 'all' icon: 'book' diff --git a/bundle/Resources/views/fields/novaseometas.html.twig b/bundle/Resources/views/fields/novaseometas.html.twig index 3bf2366..43f5290 100644 --- a/bundle/Resources/views/fields/novaseometas.html.twig +++ b/bundle/Resources/views/fields/novaseometas.html.twig @@ -16,8 +16,6 @@ {% elseif meta.name|trim starts with "og" %} - {% elseif meta.name == "robots" and meta.content %} - {% else %} {% endif %} diff --git a/bundle/Resources/views/fields/novaseometas_admin.html.twig b/bundle/Resources/views/fields/novaseometas_admin.html.twig index 4cb3afc..ffe7cfa 100644 --- a/bundle/Resources/views/fields/novaseometas_admin.html.twig +++ b/bundle/Resources/views/fields/novaseometas_admin.html.twig @@ -7,7 +7,7 @@
  • {% set default_value = nova_ezseo.fieldtype_metas[meta.name] %} {{ default_value.label }}: - {{ meta.isEmpty() ? default_value.default_pattern|raw|escape : (meta.name == 'robots' ? (meta.content ? 'noindex' : default_value.default_pattern|raw|escape) : meta.content) }} + {{ meta.isEmpty() ? default_value.default_pattern|raw|escape : meta.content }}
  • {% endif %} {% endfor %} From fcdbc01275458f19cc230d82829614fdfc65b511 Mon Sep 17 00:00:00 2001 From: mbouchaala Date: Thu, 27 May 2021 13:28:36 +0200 Subject: [PATCH 5/7] clean code --- bundle/Form/Type/MetaType.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/bundle/Form/Type/MetaType.php b/bundle/Form/Type/MetaType.php index b2fc193..766cdaf 100644 --- a/bundle/Form/Type/MetaType.php +++ b/bundle/Form/Type/MetaType.php @@ -32,10 +32,12 @@ class MetaType extends AbstractType /** * FormMapper constructor. */ - public function __construct(ConfigResolverInterface $configResolver, SeoMetadataFieldTypeRegistry $metadataFieldTypeRegistry) - { - $this->configResolver = $configResolver; - $this->metadataFieldTypeRegistry = $metadataFieldTypeRegistry; + public function __construct( + ConfigResolverInterface $configResolver, + SeoMetadataFieldTypeRegistry $metadataFieldTypeRegistry + ) { + $this->configResolver = $configResolver; + $this->metadataFieldTypeRegistry = $metadataFieldTypeRegistry; } public function getName(): string From 469b99ce6fa5b1bdac62d5673c53d64fd561bb3c Mon Sep 17 00:00:00 2001 From: Florian ALEXANDRE Date: Thu, 27 May 2021 15:32:15 +0200 Subject: [PATCH 6/7] feat: remove duplicate code and fix issue with existing fields Signed-off-by: Florian ALEXANDRE --- .../SeoMetadataBooleanFieldType.php | 11 ++--------- .../SeoMetadataChoiceFieldType.php | 17 +---------------- .../SeoMetadataDefaultFieldType.php | 6 ++++-- .../SeoMetadataFieldTypeRegistry.php | 2 +- 4 files changed, 8 insertions(+), 28 deletions(-) diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php index ef10460..9e123f0 100644 --- a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataBooleanFieldType.php @@ -17,17 +17,10 @@ class SeoMetadataBooleanFieldType extends SeoMetadataDefaultFieldType { - - public function support(string $fieldType): bool - { - return 'boolean' === $fieldType; - } - + public const IDENTIFIER = 'boolean'; public function fromHash($hash): Meta { - $meta = new Meta(); - $meta->setName($hash['meta_name']); - $meta->setFieldType($hash['meta_fieldtype']); + $meta = parent::fromHash($hash); $content = $hash['meta_content'] == "1" ? true : false; $meta->setContent($content); diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataChoiceFieldType.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataChoiceFieldType.php index 0e349b6..16c4d68 100644 --- a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataChoiceFieldType.php +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataChoiceFieldType.php @@ -17,22 +17,7 @@ class SeoMetadataChoiceFieldType extends SeoMetadataDefaultFieldType { - - public function support(string $fieldType): bool - { - return 'select' === $fieldType; - } - - public function fromHash($hash): Meta - { - $meta = new Meta(); - $meta->setName($hash['meta_name']); - $meta->setFieldType($hash['meta_fieldtype']); - $content = $hash['meta_content']; - $meta->setContent($content); - - return $meta; - } + public const IDENTIFIER = 'select'; public function mapForm(FormBuilderInterface &$builder, array $params) { diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php index 5462f69..3cea234 100644 --- a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataDefaultFieldType.php @@ -17,16 +17,18 @@ class SeoMetadataDefaultFieldType implements SeoMetadataFieldTypeInterface { + public const IDENTIFIER = 'text'; + public function support(string $fieldType): bool { - return 'text' === $fieldType; + return static::IDENTIFIER === $fieldType; } public function fromHash($hash): Meta { $meta = new Meta(); $meta->setName($hash['meta_name']); - $meta->setFieldType($hash['meta_fieldtype']); + $meta->setFieldType(self::IDENTIFIER); $content = $hash['meta_content']; $meta->setContent($content); diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php index 4c11280..b1ce3cb 100644 --- a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php @@ -43,7 +43,7 @@ public function fromHash($hash): array continue; } foreach ($this->metaFieldTypes as $metaFieldType) { - if (!$metaFieldType->support($hashItem['meta_fieldtype'])) { + if (!$metaFieldType->support($hashItem['meta_fieldtype'] ?? SeoMetadataDefaultFieldType::IDENTIFIER)) { continue; } $metas[] = $metaFieldType->fromHash($hashItem); From dba1be9b4008f2153bda343dc282279348bf417a Mon Sep 17 00:00:00 2001 From: Florian ALEXANDRE Date: Thu, 27 May 2021 16:58:42 +0200 Subject: [PATCH 7/7] feat: don't store meta fieldtype in db Signed-off-by: Florian ALEXANDRE --- .../SeoMetadataFieldTypeRegistry.php | 19 ++++++++++++++++++- .../MetasStorage/Gateway/LegacyStorage.php | 3 --- bundle/Core/FieldType/Metas/Type.php | 3 +-- bundle/Resources/config/admin_ui/services.yml | 1 + bundle/Resources/sql/update-shema.sql | 2 -- 5 files changed, 20 insertions(+), 8 deletions(-) delete mode 100644 bundle/Resources/sql/update-shema.sql diff --git a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php index b1ce3cb..66e97d4 100644 --- a/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php +++ b/bundle/Core/FieldType/MetaFieldConverter/SeoMetadataFieldTypeRegistry.php @@ -11,6 +11,7 @@ namespace Novactive\Bundle\eZSEOBundle\Core\FieldType\MetaFieldConverter; +use eZ\Publish\Core\MVC\ConfigResolverInterface; use Symfony\Component\Form\FormBuilderInterface; class SeoMetadataFieldTypeRegistry @@ -18,6 +19,9 @@ class SeoMetadataFieldTypeRegistry /** @var SeoMetadataFieldTypeInterface[] */ protected $metaFieldTypes; + /** @var ConfigResolverInterface */ + protected $configResolver; + /** * SeoMetadataFieldTypeRegistry constructor. * @@ -30,6 +34,15 @@ public function __construct(iterable $metaFieldTypes) } } + /** + * @required + * @param ConfigResolverInterface $configResolver + */ + public function setConfigResolver( ConfigResolverInterface $configResolver ): void + { + $this->configResolver = $configResolver; + } + public function addMetaFieldType(SeoMetadataFieldTypeInterface $metaFieldType): void { $this->metaFieldTypes[] = $metaFieldType; @@ -37,13 +50,17 @@ public function addMetaFieldType(SeoMetadataFieldTypeInterface $metaFieldType): public function fromHash($hash): array { + $metasConfig = $this->configResolver->getParameter('fieldtype_metas', 'nova_ezseo'); + $metas = []; foreach ($hash as $hashItem) { if (!is_array($hashItem)) { continue; } + $fieldConfig = $metasConfig[$hashItem['meta_name']] ?? null; + $fieldType = $fieldConfig['type'] ?? SeoMetadataDefaultFieldType::IDENTIFIER; foreach ($this->metaFieldTypes as $metaFieldType) { - if (!$metaFieldType->support($hashItem['meta_fieldtype'] ?? SeoMetadataDefaultFieldType::IDENTIFIER)) { + if (!$metaFieldType->support($fieldType)) { continue; } $metas[] = $metaFieldType->fromHash($hashItem); diff --git a/bundle/Core/FieldType/Metas/MetasStorage/Gateway/LegacyStorage.php b/bundle/Core/FieldType/Metas/MetasStorage/Gateway/LegacyStorage.php index a798581..9680b09 100644 --- a/bundle/Core/FieldType/Metas/MetasStorage/Gateway/LegacyStorage.php +++ b/bundle/Core/FieldType/Metas/MetasStorage/Gateway/LegacyStorage.php @@ -89,9 +89,6 @@ public function storeFieldData(VersionInfo $versionInfo, Field $field) )->set( $connection->quoteColumn('meta_content'), $insertQuery->bindValue($meta['meta_content'], null, PDO::PARAM_STR) - )->set( - $connection->quoteColumn('meta_fieldtype'), - $insertQuery->bindValue($meta['meta_fieldtype'], null, PDO::PARAM_STR) )->set( $connection->quoteColumn('objectattribute_id'), $insertQuery->bindValue($field->id, null, PDO::PARAM_INT) diff --git a/bundle/Core/FieldType/Metas/Type.php b/bundle/Core/FieldType/Metas/Type.php index 3a0d608..60b75cc 100644 --- a/bundle/Core/FieldType/Metas/Type.php +++ b/bundle/Core/FieldType/Metas/Type.php @@ -210,8 +210,7 @@ public function toHash(SPIValue $value) /* @var Meta $meta */ $hash[$meta->getName()] = [ 'meta_name' => $meta->getName(), - 'meta_content' => $meta->getContent(), - 'meta_fieldtype' => $meta->getFieldType(), + 'meta_content' => $meta->getContent() ]; } diff --git a/bundle/Resources/config/admin_ui/services.yml b/bundle/Resources/config/admin_ui/services.yml index c5024fc..bd00881 100644 --- a/bundle/Resources/config/admin_ui/services.yml +++ b/bundle/Resources/config/admin_ui/services.yml @@ -1,6 +1,7 @@ services: Novactive\Bundle\eZSEOBundle\Core\FieldType\MetaFieldConverter\SeoMetadataFieldTypeRegistry: + autowire: true arguments: [!tagged seometa.fieldtype] # FIELD TYPE diff --git a/bundle/Resources/sql/update-shema.sql b/bundle/Resources/sql/update-shema.sql deleted file mode 100644 index a8db9dd..0000000 --- a/bundle/Resources/sql/update-shema.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE `novaseo_meta` -ADD `meta_fieldtype` varchar(255) COLLATE 'utf8_general_ci' NOT NULL AFTER `meta_content`;