/** * Join translation results if they exist * if $model is specified, will verify that it has I18n * return @myDoctrineQuery $this */ public function withI18n($culture = null, $model = null, $rootAlias = null, $joinSide = 'left') { if (null === $model) { $_rootAlias = $this->getRootAlias(); $from = explode(' ', $this->_dqlParts['from'][0]); $model = $from[0]; if (strlen($model) === 0) { $this->getRootAlias(); $models = array_keys($this->_queryComponents); $model = $models[0]; } } if (!dmDb::table($model)->hasI18n()) { return $this; } $culture = null === $culture ? myDoctrineRecord::getDefaultCulture() : $culture; if (null === $rootAlias) { // refresh query for introspection if (empty($this->_execParams)) { //prevent bugs for subqueries $this->fixArrayParameterValues($this->_params); } $this->buildSqlQuery(); $rootAlias = $this->getRootAlias(); $translationAlias = $rootAlias . 'Translation'; // i18n already joined if ($this->hasAliasDeclaration($translationAlias)) { return $this; } } else { $translationAlias = $rootAlias . 'Translation'; } $joinMethod = $joinSide . 'Join'; return $this->{$joinMethod}($rootAlias . '.Translation ' . $translationAlias . ' ON ' . $rootAlias . '.id = ' . $translationAlias . '.id AND ' . $translationAlias . '.lang = ?', $culture); }
/** * Implementation of filterSet() to call set on Translation relationship to allow * access to I18n properties from the main object. * * @param Doctrine_Record $record * @param string $name Name of the property * @param string $value Value of the property * @return void */ public function filterSet(Doctrine_Record $record, $fieldName, $value) { $translation = $record->get('Translation'); $culture = myDoctrineRecord::getDefaultCulture(); if ($translation->contains($culture)) { $i18n = $record->get('Translation')->get($culture); } else { $i18n = $record->get('Translation')->get($culture); /* * If translation is new * populate it with i18n fallback */ if ($i18n->state() == Doctrine_Record::STATE_TDIRTY) { if ($fallback = $record->getI18nFallBack()) { $fallBackData = $fallback->toArray(); unset($fallBackData['id'], $fallBackData['lang']); $i18n->fromArray($fallBackData); } } } if (!ctype_lower($fieldName) && !$i18n->contains($fieldName)) { $underscoredFieldName = dmString::underscore($fieldName); if (strpos($underscoredFieldName, '_') !== false && $i18n->contains($underscoredFieldName)) { $fieldName = $underscoredFieldName; } } $i18n->set($fieldName, $value); return $value; }
protected function createPageTranslations($pageId) { $cultures = $this->getOption('cultures'); $translationTable = dmDb::table('DmPageTranslation'); $existingCultures = $translationTable->createQuery('t')->where('t.id = ? ', $pageId)->andWhereIn('t.lang', $cultures)->select('t.lang')->fetchFlat(); // can not generate translations from nothing if (empty($existingCultures)) { return; } // calculate missing cultures for this page $missingCultures = array_diff($cultures, $existingCultures); // all translations exist if (empty($missingCultures)) { return; } if (in_array(sfConfig::get('sf_default_culture'), $existingCultures)) { $mainCulture = sfConfig::get('sf_default_culture'); } elseif (in_array(myDoctrineRecord::getDefaultCulture(), $existingCultures)) { $mainCulture = myDoctrineRecord::getDefaultCulture(); } else { $mainCulture = dmArray::first($existingCultures); } $mainTranslationArray = $translationTable->createQuery('t')->select('t.slug, t.name, t.title, t.h1, t.description, t.keywords, t.is_active')->where('t.id = ?', $pageId)->andWhere('t.lang = ?', $mainCulture)->limit(1)->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY); $missingTranslations = new myDoctrineCollection(dmDb::table('DmPageTranslation')); if ($this->getOption('activate_new_translations')) { $isActive = $mainTranslationArray['is_active']; } else { $isActive = false; } foreach ($missingCultures as $culture) { $missingTranslations->add($translationTable->create(array_merge($mainTranslationArray, array('lang' => $culture, 'is_active' => $isActive)))); } $missingTranslations->save(); }
public function execute(array $onlyModules, $culture) { $this->setCulture($culture); $recordDefaultCulture = myDoctrineRecord::getDefaultCulture(); myDoctrineRecord::setDefaultCulture($this->culture); if (empty($onlyModules)) { $onlyModules = $this->moduleManager->getProjectModules(); } elseif (is_string(dmArray::first($onlyModules))) { $onlyModules = $this->moduleManager->keysToModules($onlyModules); } $onlyModules = dmModuleManager::removeModulesChildren($onlyModules); foreach ($onlyModules as $module) { $this->updateRecursive($module); } myDoctrineRecord::setDefaultCulture($recordDefaultCulture); }
/** * @return DmAutoSeo created record */ public function createFromModuleAndAction($module, $action, $culture = null) { $module = $this->getModuleManager()->getModule($module); $moduleUnderscore = $module->getUnderscore(); $identifierColumnName = $module->getTable()->getIdentifierColumnName(); $culture = null === $culture ? myDoctrineRecord::getDefaultCulture() : $culture; if ('id' == $identifierColumnName) { $column = ''; } else { $column = '.' . $identifierColumnName; } $descriptionColumnCandidates = array('excerpt', 'resume', 'description', 'body', 'text'); $descriptionColumn = $column; foreach ($descriptionColumnCandidates as $descriptionColumnCandidate) { if ($module->getTable()->hasField($descriptionColumnCandidate)) { $descriptionColumn = '.' . $descriptionColumnCandidate; break; } } return $this->create(array('module' => $module->getKey(), 'action' => $action, 'Translation' => array($culture => array('slug' => '%' . $moduleUnderscore . $column . '%', 'name' => '%' . $moduleUnderscore . $column . '%', 'title' => '%' . $moduleUnderscore . $column . '%', 'description' => '%' . $moduleUnderscore . $descriptionColumn . '%', 'lang' => $culture)))); }
/** * Join translation results if they exist * if $model is specified, will verify that it has I18n * return @myDoctrineQuery $this */ public function withI18n($culture = null, $model = null, $rootAlias = null) { if (null !== $model) { if (!dmDb::table($model)->hasI18n()) { return $this; } } if (null === $rootAlias) { // refresh query for introspection $this->buildSqlQuery(); $rootAlias = $this->getRootAlias(); $translationAlias = $rootAlias . 'Translation'; // i18n already joined if ($this->hasAliasDeclaration($translationAlias)) { return $this; } } else { $translationAlias = $rootAlias . 'Translation'; } $culture = null === $culture ? myDoctrineRecord::getDefaultCulture() : $culture; return $this->leftJoin($rootAlias . '.Translation ' . $translationAlias . ' ON ' . $rootAlias . '.id = ' . $translationAlias . '.id AND ' . $translationAlias . '.lang = ?', $culture); }
/** * Will join named relations */ public function joinRelations(array $aliases, $withI18n = false) { $rootAlias = $query->getRootAlias(); foreach ($aliases as $alias) { if (!($relation = $this->getRelationHolder()->get($alias))) { throw new dmException(sprintf('%s is not a valid alias for the table %s', $alias, $this->getComponentName())); } if ($relation->getAlias() === 'Translation') { $query->withI18n(); } elseif ($relation->getClass() === 'DmMedia') { $mediaJoinAlias = dmString::lcfirst($relation->getAlias()); $query->leftJoin(sprintf('%s.%s %s', $rootAlias, $relation->getAlias(), $mediaJoinAlias))->leftJoin(sprintf('%s.%s %s', $mediaJoinAlias, 'Folder', $mediaJoinAlias . 'Folder')); } else { $joinAlias = dmString::lcfirst($relation->getAlias()); $query->leftJoin(sprintf('%s.%s %s', $rootAlias, $relation->getAlias(), $joinAlias)); if ($withI18n && $relation->getTable()->hasI18n()) { $joinTranslationAlias = $joinAlias . 'Translation'; $query->leftJoin($joinAlias . '.Translation ' . $joinTranslationAlias . ' ON ' . $joinAlias . '.id = ' . $joinTranslationAlias . '.id AND ' . $joinTranslationAlias . '.lang = ?', myDoctrineRecord::getDefaultCulture()); } } } return $query; }
<?php require_once dirname(__FILE__) . '/helper/dmUnitTestHelper.php'; $helper = new dmUnitTestHelper(); $helper->boot(); $t = new lime_test(24); $t->diag('default culture tests'); $user = $helper->get('user'); $userCulture = $user->getCulture(); $t->is(myDoctrineRecord::getDefaultCulture(), $user->getCulture(), 'default culture is ' . $user->getCulture()); $user->setCulture('en'); $t->is(myDoctrineRecord::getDefaultCulture(), $user->getCulture(), 'default culture is ' . $user->getCulture()); $user->setCulture('es'); $t->is(myDoctrineRecord::getDefaultCulture(), $user->getCulture(), 'default culture is ' . $user->getCulture()); $user->setCulture($userCulture); $t->is(myDoctrineRecord::getDefaultCulture(), $user->getCulture(), 'default culture is ' . $user->getCulture()); $t->diag('Basic record tests'); $layout = dmDb::create('DmLayout', array('name' => dmString::random(), 'css_class' => 'the_class'))->saveGet(); $t->ok($layout instanceof DmLayout, 'call saveGet() returns the record'); $t->is(dmDb::create('DmLayout')->orNull(), null, 'call orNull() on new record returns null'); $t->is($layout->orNull(), $layout, 'call orNull() on existing record returns the record'); $t->diag('Property access tests'); $t->is($layout->get('css_class'), 'the_class', '->get("css_class")'); $t->is($layout->getCssClass(), 'the_class', '->getCssClass()'); $t->is($layout->css_class, 'the_class', '->css_class'); $t->is($layout->cssClass, 'the_class', '->cssClass'); $t->is($layout['cssClass'], 'the_class', '["css_class"]'); $t->ok($layout->set('css_class', 'other_class'), '->set("css_class")'); $t->ok($layout->setCssClass('other_class'), '->setCssClass()'); $t->ok($layout->css_class = 'other_class', '->css_class'); $t->ok($layout->cssClass = 'other_class', '->cssClass');