diff --git a/core/Controller/Admin/Crud/CrudController.php b/core/Controller/Admin/Crud/CrudController.php index dd9d7d7..6e2a5bc 100644 --- a/core/Controller/Admin/Crud/CrudController.php +++ b/core/Controller/Admin/Crud/CrudController.php @@ -46,6 +46,9 @@ abstract class CrudController extends AdminController protected function doNew(EntityInterface $entity, EntityManager $entityManager, Request $request, callable $beforeCreate = null): Response { $configuration = $this->getConfiguration(); + + $this->prepareEntity($entity); + $form = $this->createForm($configuration->getForm('new'), $entity); if ($request->isMethod('POST')) { @@ -86,6 +89,9 @@ abstract class CrudController extends AdminController protected function doEdit(EntityInterface $entity, EntityManager $entityManager, Request $request, callable $beforeUpdate = null): Response { $configuration = $this->getConfiguration(); + + $this->prepareEntity($entity); + $form = $this->createForm($configuration->getForm('edit'), $entity); if ($request->isMethod('POST')) { @@ -181,4 +187,15 @@ abstract class CrudController extends AdminController $session->set($form->getName(), $filters); } } + + protected function prepareEntity(EntityInterface $entity) + { + $configuration = $this->getConfiguration(); + + if ($configuration->isI18n()) { + foreach ($configuration->getLocales() as $locale) { + $entity->addTranslation($entity->translate($locale, false)); + } + } + } } diff --git a/core/Crud/CrudConfiguration.php b/core/Crud/CrudConfiguration.php index 51f3ab5..4af2e4b 100644 --- a/core/Crud/CrudConfiguration.php +++ b/core/Crud/CrudConfiguration.php @@ -19,6 +19,8 @@ class CrudConfiguration protected array $viewDatas = []; protected array $fields = []; protected array $maxPerPage = []; + protected array $locales = []; + protected ?string $defaultLocale = null; protected static $self; @@ -198,4 +200,29 @@ class CrudConfiguration { return $this->maxPerPage[$page] ?? $default; } + + /* -- */ + + public function setI18n(array $locales, string $defaultLocale): self + { + $this->locales = $locales; + $this->defaultLocale = $defaultLocale; + + return $this; + } + + public function getLocales(): array + { + return $this->locales; + } + + public function getDefaultLocale(): ?string + { + return $this->defaultLocale; + } + + public function isI18n(): bool + { + return !empty($this->locales); + } } diff --git a/core/Crud/Field/Field.php b/core/Crud/Field/Field.php index aaac0eb..16513e9 100644 --- a/core/Crud/Field/Field.php +++ b/core/Crud/Field/Field.php @@ -2,8 +2,8 @@ namespace App\Core\Crud\Field; -use App\Core\Crud\Exception\CrudConfigurationException; use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException; use Symfony\Component\PropertyAccess\PropertyAccess; use Twig\Environment; @@ -14,11 +14,11 @@ use Twig\Environment; */ abstract class Field { - public function buildView(Environment $twig, $entity, array $options) + public function buildView(Environment $twig, $entity, array $options, ?string $locale = null) { return $twig->render($this->getView($options), [ 'entity' => $entity, - 'value' => $this->getValue($entity, $options), + 'value' => $this->getValue($entity, $options, $locale), 'options' => $options, ]); } @@ -43,12 +43,20 @@ abstract class Field return $resolver; } - protected function getValue($entity, array $options) + protected function getValue($entity, array $options, ?string $locale = null) { if (null !== $options['property']) { $propertyAccessor = PropertyAccess::createPropertyAccessorBuilder()->getPropertyAccessor(); - $value = $propertyAccessor->getValue($entity, $options['property']); + try { + $value = $propertyAccessor->getValue($entity, $options['property']); + } catch (NoSuchPropertyException $e) { + if (null !== $locale) { + $value = $propertyAccessor->getValue($entity->translate($locale), $options['property']); + } else { + throw $e; + } + } } elseif (null !== $options['property_builder']) { $value = call_user_func($options['property_builder'], $entity, $options); } else { diff --git a/core/Crud/Field/ImageField.php b/core/Crud/Field/ImageField.php new file mode 100644 index 0000000..bbecab8 --- /dev/null +++ b/core/Crud/Field/ImageField.php @@ -0,0 +1,27 @@ + + */ +class ImageField extends Field +{ + public function configureOptions(OptionsResolver $resolver): OptionsResolver + { + parent::configureOptions($resolver); + + $resolver->setDefaults([ + 'view' => '@Core/admin/crud/field/image.html.twig', + 'image_attr' => [], + ]); + + $resolver->setAllowedTypes('image_attr', ['array']); + + return $resolver; + } +} diff --git a/core/Manager/TranslatableEntityManager.php b/core/Manager/TranslatableEntityManager.php new file mode 100644 index 0000000..2cb87a0 --- /dev/null +++ b/core/Manager/TranslatableEntityManager.php @@ -0,0 +1,20 @@ + + */ +class TranslatableEntityManager extends EntityManager +{ + protected function persist(EntityInterface $entity) + { + $this->entityManager->persist($entity); + $entity->mergeNewTranslations(); + $this->flush(); + } +} diff --git a/core/Resources/views/admin/crud/_form.html.twig b/core/Resources/views/admin/crud/_form.html.twig index 796d8a5..4733513 100644 --- a/core/Resources/views/admin/crud/_form.html.twig +++ b/core/Resources/views/admin/crud/_form.html.twig @@ -1,6 +1,12 @@
- {{ form_widget(form) }} + {% for item in form %} + {% if configuration.isI18n and item.vars.name == 'translations' %} + {{ include(configuration.view('form_translations', '@Core/admin/crud/_form_translations.html.twig')) }} + {% else %} + {{ include(configuration.view('form_widget', '@Core/admin/crud/_form_widget.html.twig')) }} + {% endif %} + {% endfor %}
diff --git a/core/Resources/views/admin/crud/_form_translations.html.twig b/core/Resources/views/admin/crud/_form_translations.html.twig new file mode 100644 index 0000000..3a18edb --- /dev/null +++ b/core/Resources/views/admin/crud/_form_translations.html.twig @@ -0,0 +1,21 @@ + + +
+ {% for locale in configuration.locales %} +
+ {% for item in item.children[locale] %} + {{ include(configuration.view('form_widget', '@Core/admin/crud/_form_widget.html.twig')) }} + {% endfor %} +
+ {% endfor %} +
diff --git a/core/Resources/views/admin/crud/_form_widget.html.twig b/core/Resources/views/admin/crud/_form_widget.html.twig new file mode 100644 index 0000000..f6ad702 --- /dev/null +++ b/core/Resources/views/admin/crud/_form_widget.html.twig @@ -0,0 +1 @@ +{{ form_row(item) }} diff --git a/core/Resources/views/admin/crud/edit.html.twig b/core/Resources/views/admin/crud/edit.html.twig index 0893338..d74c15c 100644 --- a/core/Resources/views/admin/crud/edit.html.twig +++ b/core/Resources/views/admin/crud/edit.html.twig @@ -70,7 +70,7 @@
- {{ include(configuration.view('editForm', '@Core/admin/crud/_form.html.twig')) }} + {{ include(configuration.view('form', '@Core/admin/crud/_form.html.twig')) }}
diff --git a/core/Resources/views/admin/crud/field/image.html.twig b/core/Resources/views/admin/crud/field/image.html.twig new file mode 100644 index 0000000..1efa29b --- /dev/null +++ b/core/Resources/views/admin/crud/field/image.html.twig @@ -0,0 +1 @@ + diff --git a/core/Resources/views/admin/crud/index.html.twig b/core/Resources/views/admin/crud/index.html.twig index af73b81..840c0c8 100644 --- a/core/Resources/views/admin/crud/index.html.twig +++ b/core/Resources/views/admin/crud/index.html.twig @@ -65,7 +65,15 @@ {% for item in pager %} {% block list_item %} - + {%- set dbClick %} + {% if configuration.action('index', 'show', true) %} + {{ path(configuration.pageRoute('show'), {entity: item.id}) }} + {% elseif configuration.action('index', 'edit', true) %} + {{ path(configuration.pageRoute('edit'), {entity: item.id}) }} + {% endif %} + {% endset -%} + + {% for config in configuration.fields('index') %} {% set attr = config.options.attr is defined ? config.options.attr : [] %} {% set action = config.options.action is defined ? config.options.action : null %} @@ -73,14 +81,14 @@ {% if action == 'show' %} - {{ render_field(item, config) }} + {{ render_field(item, config, configuration.defaultLocale) }} {% elseif action == 'edit' %} - {{ render_field(item, config) }} + {{ render_field(item, config, configuration.defaultLocale) }} {% else %} - {{ render_field(item, config) }} + {{ render_field(item, config, configuration.defaultLocale) }} {% endif %} {% endfor %} diff --git a/core/Resources/views/admin/crud/new.html.twig b/core/Resources/views/admin/crud/new.html.twig index e9fa50f..6d5610d 100644 --- a/core/Resources/views/admin/crud/new.html.twig +++ b/core/Resources/views/admin/crud/new.html.twig @@ -36,7 +36,7 @@
- {{ include(configuration.view('newForm', '@Core/admin/crud/_form.html.twig')) }} + {{ include(configuration.view('form', '@Core/admin/crud/_form.html.twig')) }}
diff --git a/core/Resources/views/admin/crud/show.html.twig b/core/Resources/views/admin/crud/show.html.twig index 948fb0c..2eb5ea7 100644 --- a/core/Resources/views/admin/crud/show.html.twig +++ b/core/Resources/views/admin/crud/show.html.twig @@ -37,7 +37,7 @@ {% block show %}
- {{ include(configuration.view('showEntity', '@Core/admin/crud/_show.html.twig')) }} + {{ include(configuration.view('show_entity', '@Core/admin/crud/_show.html.twig')) }}
{% endblock %} diff --git a/core/Twig/Extension/CrudExtension.php b/core/Twig/Extension/CrudExtension.php index 480d421..fc34ecb 100644 --- a/core/Twig/Extension/CrudExtension.php +++ b/core/Twig/Extension/CrudExtension.php @@ -33,12 +33,12 @@ class CrudExtension extends AbstractExtension ]; } - public function renderField($entity, array $config): string + public function renderField($entity, array $config, ?string $locale = null): string { $field = $config['field']; $instance = new $field(); $resolver = $instance->configureOptions(new OptionsResolver()); - return $instance->buildView($this->twig, $entity, $resolver->resolve($config['options'])); + return $instance->buildView($this->twig, $entity, $resolver->resolve($config['options']), $locale); } }