classes/Gems/Model/Transform/TranslateDatabaseFields.php
<?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;
}
}