GemsTracker/gemstracker-library

View on GitHub
classes/Gems/Model/Transform/TranslateDatabaseFields.php

Summary

Maintainability
C
1 day
Test Coverage
F
0%
<?php

namespace Gems\Model\Transform;

use Gems\Db\DbTranslateTrait;
use MUtil\Registry\TargetTrait;

class TranslateDatabaseFields extends \MUtil_Model_ModelTransformerAbstract implements \MUtil_Registry_TargetInterface
{
    use TargetTrait;
    use DbTranslateTrait;

    /**
     * @var \Zend_Locale
     */
    protected $locale;

    /**
     * @var \Gems_Project_ProjectSettings
     */
    public $project;

    protected $tableKeys = [];

    public function __construct($config=null)
    {
        if ($config) {
            $this->config = $config;
        }
    }

    public function getFieldInfo(\MUtil_Model_ModelAbstract $model)
    {
        //$labeledNames = $model->getColNames('label');
        $tablesWithTranslations = $this->getTablesWithTranslations();

        if ($model instanceof \MUtil_Model_UnionModel) {
            $tableKeys = $model->getKeys();
            $table = null;
            $tables = [];
            //$this->translateTables = array_intersect_key($tablesWithTranslations, $tables);

            if ($table !== null) {
                $this->tableKeys[$table] = $tableKeys;
            }
            $itemNames = $model->getColNames('table');
            foreach ($itemNames as $itemName) {
                $item = $model->get($itemName);
                if (!isset($item['table']) || !$item['table'] || !isset($this->translateTables[$item['table']])) {
                    continue;
                }
                if (!isset($this->tableKeys[$item['table']])) {
                    $this->tableKeys[$item['table']] = $tableKeys;
                }
            }
            $this->translateTables = array_intersect_key($tablesWithTranslations, $this->tableKeys);
        }

        if ($model instanceof \MUtil_Model_DatabaseModelAbstract) {
            $itemNames = $model->getColNames('table');
            foreach ($itemNames as $itemName) {
                $item = $model->get($itemName);
                if (!isset($item['table']) || !$item['table'] || !isset($tablesWithTranslations[$item['table']])) {
                    continue;
                }
                if (isset($item['key']) && $item['key'] && (!isset($tableKeys[$item['table']]) || !in_array($item['key'], $tableKeys[$item['table']]))) {
                    $this->tableKeys[$item['table']][] = $itemName;
                }
            }
        }

        return parent::getFieldInfo($model); // TODO: Change the autogenerated stub
    }

    public function transformFilter(\MUtil_Model_ModelAbstract $model, array $filter)
    {
        if (is_array($this->tableKeys)) {
            foreach($this->tableKeys as $tableName => $itemNames) {
                foreach($itemNames as $itemName) {
                    // Makes the key column available in the query
                    $model->get($itemName, 'label');
                }
            }
        }

        return parent::transformFilter($model, $filter);
    }

    protected function translateData(\MUtil_Model_ModelAbstract $model, $data)
    {
        $translations = $this->getTranslations();
        foreach($this->translateTables as $tableName=>$fields) {
            foreach($fields as $field) {
                foreach ($data as $key => $row) {
                    if (isset($row[$field])) {
                        $tableKeys = $this->tableKeys[$tableName];
                        $keyValues = [];
                        foreach ($tableKeys as $tableKey) {
                            $keyValues[] = $row[$tableKey];
                        }
                        $keyname = $this->getKey($tableName, $field, $keyValues);
                        if (isset($translations[$keyname])) {
                            $data[$key][$field] = $translations[$keyname];
                        }
                    }
                }
            }
        }

        return $data;
    }

    public function transformLoad(\MUtil_Model_ModelAbstract $model, array $data, $new = false, $isPostData = false)
    {
        if (!($model instanceof \MUtil_Model_DatabaseModelAbstract || $model instanceof \MUtil_Model_UnionModel)) {
            return $data;
        }

        $language = $this->locale->getLanguage();

        if ($language == $this->project->getLocaleDefault()) {
            return $data;
        }

        $translatedData = $this->translateData($model, $data);

        return $translatedData;
    }
}