diff --git a/.github/workflows/diagnostics.yml b/.github/workflows/diagnostics.yml
index dd22e9133..0fbc0d314 100644
--- a/.github/workflows/diagnostics.yml
+++ b/.github/workflows/diagnostics.yml
@@ -1,4 +1,5 @@
name: MetaModels core
+
on:
pull_request:
push:
diff --git a/composer.json b/composer.json
index 3ba031772..dd5fb4331 100644
--- a/composer.json
+++ b/composer.json
@@ -26,13 +26,12 @@
"email": "mail@metamodel.me",
"issues": "https://github.com/MetaModels/core/issues",
"wiki": "https://de.contaowiki.org/MetaModels",
- "irc": "irc://irc.freenode.org/contao.mm",
"source": "https://github.com/MetaModels/core"
},
"require": {
"php": "^8.1",
"ext-dom": "*",
- "contao-community-alliance/dc-general": "^2.3.16",
+ "contao-community-alliance/dc-general": "^2.3.17",
"contao-community-alliance/events-contao-bindings": "^4.13.1",
"contao-community-alliance/meta-palettes": "^2.0.10",
"contao-community-alliance/translator": "^2.4.2",
diff --git a/src/CoreBundle/Contao/Hooks/LoadDataContainer.php b/src/CoreBundle/Contao/Hooks/LoadDataContainer.php
index 64df899e6..f196b791e 100644
--- a/src/CoreBundle/Contao/Hooks/LoadDataContainer.php
+++ b/src/CoreBundle/Contao/Hooks/LoadDataContainer.php
@@ -32,6 +32,7 @@
use MetaModels\IFactory;
use MetaModels\IMetaModel;
use MetaModels\ViewCombination\ViewCombination;
+use Symfony\Contracts\Translation\TranslatorInterface;
/**
* This class handles loading of the virtual data containers.
@@ -137,6 +138,8 @@ private function handleMetaModelTable(string $tableName): void
return;
}
+ $this->controller->loadDataContainer('tl_metamodel_item');
+
if (!isset($GLOBALS['TL_DCA'][$tableName])) {
$GLOBALS['TL_DCA'][$tableName] = [];
}
@@ -156,6 +159,7 @@ private function handleMetaModelTable(string $tableName): void
*
* @SuppressWarnings(PHPMD.Superglobals)
* @SuppressWarnings(PHPMD.CamelCaseVariableName)
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
private function handleNonMetaModelTable(string $tableName): void
{
@@ -176,16 +180,16 @@ private function handleNonMetaModelTable(string $tableName): void
$parentDCA = &$GLOBALS['TL_DCA'][$tableName];
- $this->controller->loadLanguageFile('default');
foreach ($map[$tableName] as $metaModelTable => $inputScreen) {
$metaModel = $this->factory->getMetaModel($metaModelTable);
assert($metaModel instanceof IMetaModel);
- $caption = $this->buildCaption($metaModel, $inputScreen);
+ $translationPrefix = 'metamodel_edit_as_child.'
+ . $metaModel->getTableName()
+ . '.' . $inputScreen['meta']['id'];
$operationName = 'edit_' . $metaModel->getTableName();
$parentDCA['list']['operations'][$operationName] = [
- 'label' => &$caption,
'href' => 'table=' . $metaModelTable,
'icon' => $this->iconBuilder->getBackendIcon($inputScreen['meta']['backendicon']),
'attributes' => 'onclick="Backend.getScrollOffset()"',
@@ -211,13 +215,15 @@ function (
string $icon,
string $attributes,
string $table
- ) use ($idParameter): string {
+ ) use (
+ $idParameter,
+ $translationPrefix
+ ): string {
return $this->buildChildOperationButton(
$idParameter,
$row['id'],
$href,
- $label,
- $name,
+ $translationPrefix,
$icon,
$attributes,
$table
@@ -242,49 +248,16 @@ private function buildMap(): array
return $map;
}
- /**
- * Build the caption for a table.
- *
- * @param IMetaModel $metaModel The MetaModel to build the caption for.
- * @param array $inputScreen The input screen information.
- *
- * @return array
- *
- * @SuppressWarnings(PHPMD.Superglobals)
- * @SuppressWarnings(PHPMD.CamelCaseVariableName)
- */
- private function buildCaption(IMetaModel $metaModel, array $inputScreen): array
- {
- $caption = [
- \sprintf($GLOBALS['TL_LANG']['MSC']['metamodel_edit_as_child']['label'], $metaModel->getName()),
- ''
- ];
-
- // @deprecated usage of TL_LANGUAGE - remove for Contao 5.0.
- $currentLanguage = LocaleUtil::formatAsLocale($GLOBALS['TL_LANGUAGE']);
- foreach ($inputScreen['label'] as $langCode => $label) {
- if ($label !== '' && $langCode === $currentLanguage) {
- $caption = [
- $label,
- $inputScreen['description'][$langCode]
- ];
- }
- }
-
- return $caption;
- }
-
/**
* This method exists only for being compatible when MetaModels are being used as child table from DC_Table context.
*
* @param string $idParameter The id parameter in use.
- * @param string $itemId The current data row.
- * @param string $href The href to be appended.
- * @param string $label The operation label.
- * @param string $name The operation name.
- * @param string $icon The icon path.
- * @param string $attributes The button attributes.
- * @param string $table The table name.
+ * @param string $itemId The current data row.
+ * @param string $href The href to be appended.
+ * @param string $transPrefix The operation button label translation prefix.
+ * @param string $icon The icon path.
+ * @param string $attributes The button attributes.
+ * @param string $table The table name.
*
* @return string
*/
@@ -292,8 +265,7 @@ private function buildChildOperationButton(
string $idParameter,
string $itemId,
string $href,
- string $label,
- string $name,
+ string $transPrefix,
string $icon,
string $attributes,
string $table
@@ -311,7 +283,19 @@ private function buildChildOperationButton(
$url = \preg_replace('#(&)id=(?:&)?#', '$1', $url);
}
- $title = \sprintf($label ?: $name, $itemId);
+ $translator = System::getContainer()->get('translator');
+ assert($translator instanceof TranslatorInterface);
+
+ $label = $translator->trans(
+ $transPrefix . '.label',
+ ['%id%' => $itemId],
+ $table
+ );
+ $title = $translator->trans(
+ $transPrefix . '.description',
+ ['%id%' => $itemId],
+ $table
+ );
return \sprintf(
'%4$s ',
diff --git a/src/CoreBundle/EventListener/DcGeneral/DefinitionBuilder/CommandBuilder.php b/src/CoreBundle/EventListener/DcGeneral/DefinitionBuilder/CommandBuilder.php
index 628736d88..2dbddfa27 100644
--- a/src/CoreBundle/EventListener/DcGeneral/DefinitionBuilder/CommandBuilder.php
+++ b/src/CoreBundle/EventListener/DcGeneral/DefinitionBuilder/CommandBuilder.php
@@ -233,14 +233,16 @@ private function parseModelOperations(Contao2BackendViewDefinitionInterface $vie
// Check if we have some children.
foreach ($this->viewCombination->getChildrenOf($this->container->getName()) as $tableName => $screen) {
+ $screenId = (string) ($screen['meta']['id'] ?? '');
+ assert('' !== $screenId);
$this->createCommand(
$collection,
'edit_' . $tableName,
['table' => $tableName],
$this->iconBuilder->getBackendIcon($screen['meta']['backendicon']),
[
- 'label' => 'metamodel_edit_as_child.' . $tableName . '.label',
- 'description' => 'metamodel_edit_as_child.' . $tableName . '.description',
+ 'label' => 'metamodel_edit_as_child.' . $tableName . '.' . $screenId . '.label',
+ 'description' => 'metamodel_edit_as_child.' . $tableName . '.' . $screenId . '.description',
'idparam' => 'pid'
]
);
diff --git a/src/CoreBundle/Resources/translations/tl_metamodel_dca_sortgroup.en.xlf b/src/CoreBundle/Resources/translations/tl_metamodel_dca_sortgroup.en.xlf
index 77d4b05fe..dab68c5c4 100644
--- a/src/CoreBundle/Resources/translations/tl_metamodel_dca_sortgroup.en.xlf
+++ b/src/CoreBundle/Resources/translations/tl_metamodel_dca_sortgroup.en.xlf
@@ -76,7 +76,7 @@
-
+
diff --git a/src/CoreBundle/Translator/MetaModelTranslationLoader.php b/src/CoreBundle/Translator/MetaModelTranslationLoader.php
index 7e3256731..488f775b8 100644
--- a/src/CoreBundle/Translator/MetaModelTranslationLoader.php
+++ b/src/CoreBundle/Translator/MetaModelTranslationLoader.php
@@ -124,43 +124,10 @@ public function load($resource, string $locale, string $domain = 'messages'): Me
}
// Check if we have some children - add child button translations then.
- foreach ($this->viewCombination->getChildrenOf($domain) as $tableName => $inputScreen) {
- $subMetaModel = $this->factory->getMetaModel($tableName);
- if (null === $subMetaModel) {
- continue;
- }
- $translationKey = 'metamodel_edit_as_child.' . $subMetaModel->getTableName();
-
- if (
- 'metamodel_edit_as_child.label' !==
- $baseValue = $catalog->get('metamodel_edit_as_child.label', $domain)
- ) {
- $catalog->set(
- $translationKey . '.label',
- strtr($baseValue, ['%child_name%' => $subMetaModel->getName()]),
- $domain,
- );
+ foreach (\array_keys($this->viewCombination->getChildrenOf($domain)) as $tableName) {
+ foreach ($this->builder->fetchAllInputScreensForTable($tableName) as $inputScreen) {
+ $this->handleChildInputScreen($domain, $tableName, $locale, $mainLanguage, $inputScreen, $catalog);
}
- if (
- 'metamodel_edit_as_child.description' !==
- $baseValue = $catalog->get('metamodel_edit_as_child.description', $domain)
- ) {
- $catalog->set(
- $translationKey . '.description',
- strtr($baseValue, ['%child_name%' => $subMetaModel->getName()]),
- $domain,
- );
- }
-
- $this->setTranslationLabelAndDescription(
- $domain,
- $locale,
- $mainLanguage,
- $translationKey,
- $inputScreen,
- $catalog,
- $tableName,
- );
}
foreach ($this->loaders as $loader) {
@@ -172,6 +139,53 @@ public function load($resource, string $locale, string $domain = 'messages'): Me
return $catalog;
}
+ private function handleChildInputScreen(
+ string $domain,
+ string $tableName,
+ string $locale,
+ string $mainLanguage,
+ array $inputScreen,
+ MessageCatalogue $catalog
+ ): void {
+ $subMetaModel = $this->factory->getMetaModel($tableName);
+ if (null === $subMetaModel) {
+ return;
+ }
+ $translationKey = 'metamodel_edit_as_child.' . $tableName . '.' . $inputScreen['meta']['id'];
+
+ if (
+ 'metamodel_edit_as_child.label' !==
+ $baseValue = $catalog->get('metamodel_edit_as_child.label', $domain)
+ ) {
+ $catalog->set(
+ $translationKey . '.label',
+ strtr($baseValue, ['%child_name%' => $subMetaModel->getName()]),
+ $domain,
+ );
+ }
+ if (
+ 'metamodel_edit_as_child.description' !==
+ $baseValue = $catalog->get('metamodel_edit_as_child.description', $domain)
+ ) {
+ $catalog->set(
+ $translationKey . '.description',
+ strtr($baseValue, ['%child_name%' => $subMetaModel->getName()]),
+ $domain,
+ );
+ }
+
+ $this->setTranslationLabelAndDescription(
+ $domain,
+ $locale,
+ $mainLanguage,
+ $translationKey,
+ $inputScreen,
+ $catalog,
+ $tableName,
+ ['%child_name%' => $subMetaModel->getName()]
+ );
+ }
+
/**
* Handle input screen.
*
@@ -209,10 +223,24 @@ private function handleInputScreen(
$inputScreen,
$catalog,
$domain,
+ [],
+ );
+ return;
+ }
+
+ if ('ctable' === $inputScreen['meta']['rendertype']) {
+ $this->handleChildInputScreen(
+ $inputScreen['meta']['ptable'],
+ $domain,
+ $locale,
+ $mainLanguage,
+ $inputScreen,
+ $catalog,
);
}
}
+ /** @param array $parameters The parameters. */
private function setTranslationLabelAndDescription(
string $domain,
string $locale,
@@ -220,16 +248,20 @@ private function setTranslationLabelAndDescription(
string $prefix,
array $inputScreen,
MessageCatalogue $catalog,
- string $headlineDomain
+ string $headlineDomain,
+ array $parameters,
): void {
$headlineKey = 'backend-module.' . $inputScreen['meta']['id'] . '.headline';
- $catalog->set($prefix . '.description', '', $domain);
if ('' !== $value = $this->extractLangString($inputScreen['description'], $locale, $mainLanguage) ?? '') {
+ $value = strtr($value, $parameters);
$catalog->set($prefix . '.description', $value, $domain);
- $catalog->set($headlineKey, $value, $headlineDomain);
+ if ($headlineKey === $catalog->get($headlineKey, $headlineDomain)) {
+ $catalog->set($headlineKey, $value, $headlineDomain);
+ }
}
if ('' !== $value = $this->extractLangString($inputScreen['label'], $locale, $mainLanguage) ?? '') {
+ $value = strtr($value, $parameters);
$catalog->set($prefix . '.label', $value, $domain);
if ($headlineKey === $catalog->get($headlineKey, $headlineDomain)) {
$catalog->set($headlineKey, $value, $headlineDomain);