From 5e4878fdc31ad6217986167f9b4bbc34f65e928a Mon Sep 17 00:00:00 2001 From: Bhupesh Pandey Date: Fri, 17 Jan 2025 16:34:32 +0530 Subject: [PATCH 1/2] Added: Support for table maker plugin --- src/Constants.php | 1 + src/services/fieldtranslator/Factory.php | 4 +- .../TableMakerFieldTranslator.php | 132 ++++++++++++++++++ 3 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 src/services/fieldtranslator/TableMakerFieldTranslator.php diff --git a/src/Constants.php b/src/Constants.php index 884e5570..39a19cdf 100644 --- a/src/Constants.php +++ b/src/Constants.php @@ -284,6 +284,7 @@ class Constants 'craft\fields\RadioButtons', 'benf\neo\Field', 'verbb\vizy\fields\VizyField', + 'verbb\tablemaker\fields\TableMakerField', 'craft\redactor\Field', 'presseddigital\linkit\fields\LinkitField', 'verbb\hyper\fields\HyperField', diff --git a/src/services/fieldtranslator/Factory.php b/src/services/fieldtranslator/Factory.php index 10bbd8e9..8fda435b 100644 --- a/src/services/fieldtranslator/Factory.php +++ b/src/services/fieldtranslator/Factory.php @@ -45,6 +45,7 @@ use lenz\linkfield\fields\LinkField as TypedLinkField; use verbb\hyper\fields\HyperField as HyperLinkField; use verbb\navigation\fields\NavigationField; +use verbb\tablemaker\fields\TableMakerField; class Factory { @@ -78,7 +79,8 @@ class Factory Embed::class => NsmFieldsTranslator::class, VizyField::class => VizyFieldTranslator::class, NavigationField::class => NavigationFieldTranslator::class, - CkEditorField::class => GenericFieldTranslator::class + CkEditorField::class => GenericFieldTranslator::class, + TableMakerField::class => TableMakerFieldTranslator::class ); public function makeTranslator(Field $field) diff --git a/src/services/fieldtranslator/TableMakerFieldTranslator.php b/src/services/fieldtranslator/TableMakerFieldTranslator.php new file mode 100644 index 00000000..320b89ac --- /dev/null +++ b/src/services/fieldtranslator/TableMakerFieldTranslator.php @@ -0,0 +1,132 @@ +getFieldValue($field->handle); + + $columnsData = $data['columns']; + $columns = $this->getTableColumns($columnsData); + + foreach ($data['rows'] as $i => $row) { + foreach ($columns as $id => $name) { + $key = sprintf('%s.%s.%s', $field->handle, $i, $name); + + // Check to translate dropdown lable not values + if ($this->isColumnDropdown($columnsData[$id])) { + $source[$key] = $columnsData[$id]['options'][$i]['label']; + } else { + $source[$key] = isset($row[$id]) ? $row[$id] : ''; + } + } + } + return $source; + } + + /** + * {@inheritdoc} + */ + public function toPostArray(ElementTranslator $elementTranslator, Element $element, Field $field) + { + $fieldHandle = $field->handle; + + $fieldData = $element->getFieldValue($fieldHandle); + + return $fieldData ? array($fieldHandle => $fieldData) : array(); + } + + /** + * {@inheritdoc} + */ + public function toPostArrayFromTranslationTarget(ElementTranslator $elementTranslator, Element $element, Field $field, $sourceSite, $targetSite, $fieldData) + { + $fieldHandle = $field->handle; + + $post = $this->toPostArray($elementTranslator, $element, $field); + + foreach ($fieldData as $i => $row) { + if (isset($post[$fieldHandle]['rows'][$i])) { + // Custom logic to replace the dropdown lable in place of value + $this->handleDropdownValues($post, $row, $fieldHandle, $i); + $post[$fieldHandle]['rows'][$i] = array_values($row); + } + } + return $post; + } + + /** + * {@inheritdoc} + */ + public function getWordCount(ElementTranslator $elementTranslator, Element $element, Field $field) + { + $wordCount = 0; + + $data = $element->getFieldValue($field->handle); + + $columns = $this->getTableColumns($data['columns']); + + foreach ($data['rows'] as $i => $row) { + foreach ($columns as $id => $name) { + $value = $row[$id] ?? ""; + + $wordCount += Translations::$plugin->wordCounter->getWordCount($value); + } + } + + return $wordCount; + } + + private function getTableColumns($columnsData) + { + $columns = []; + + foreach ($columnsData as $info) { + array_push($columns, $info['heading']); + } + + return $columns; + } + + private function isColumnDropdown($columnsData) + { + return $columnsData['type'] === 'select'; + } + + private function handleDropdownValues(&$post, &$row, $fieldHandle, $i) + { + $columnsData = $post[$fieldHandle]['columns']; + $columns = $this->getTableColumns($columnsData); + + foreach ($columns as $id => $name) { + if ($this->isColumnDropdown($columnsData[$id])) { + foreach ($post[$fieldHandle]['columns'][$id]['options'] as $index => $dd) { + if ($dd['value'] === $post[$fieldHandle]['rows'][$i][$id]) { + $post[$fieldHandle]['columns'][$id]['options'][$index]['label'] = $row[$name]; + $row[$name] = $post[$fieldHandle]['rows'][$i][$id]; + } + } + } + } + } +} \ No newline at end of file From 42f1bf4edebb447bbaa580a7a8b5defbc1d1c831 Mon Sep 17 00:00:00 2001 From: Bhupesh Pandey Date: Fri, 17 Jan 2025 21:39:39 +0530 Subject: [PATCH 2/2] added: table column headers translation support --- .../fieldtranslator/TableMakerFieldTranslator.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/services/fieldtranslator/TableMakerFieldTranslator.php b/src/services/fieldtranslator/TableMakerFieldTranslator.php index 320b89ac..d57f5901 100644 --- a/src/services/fieldtranslator/TableMakerFieldTranslator.php +++ b/src/services/fieldtranslator/TableMakerFieldTranslator.php @@ -28,9 +28,12 @@ public function toTranslationSource(ElementTranslator $elementTranslator, Elemen $columnsData = $data['columns']; $columns = $this->getTableColumns($columnsData); - + foreach ($data['rows'] as $i => $row) { foreach ($columns as $id => $name) { + $columnKey = sprintf('%s.%s.%s', $field->handle, 'columnTitle', $id); + $source[$columnKey] = $name; + $key = sprintf('%s.%s.%s', $field->handle, $i, $name); // Check to translate dropdown lable not values @@ -64,9 +67,12 @@ public function toPostArrayFromTranslationTarget(ElementTranslator $elementTrans $fieldHandle = $field->handle; $post = $this->toPostArray($elementTranslator, $element, $field); - foreach ($fieldData as $i => $row) { - if (isset($post[$fieldHandle]['rows'][$i])) { + if ($i === 'columnTitle') { + foreach ($row as $index => $columnTitle) { + $post[$fieldHandle]['columns'][$index]['heading'] = $columnTitle; + } + } else if (isset($post[$fieldHandle]['rows'][$i])) { // Custom logic to replace the dropdown lable in place of value $this->handleDropdownValues($post, $row, $fieldHandle, $i); $post[$fieldHandle]['rows'][$i] = array_values($row);