/** * Will join all localKey relations * @return myDoctrineQuery */ public function joinLocals(myDoctrineQuery $query) { $rootAlias = $query->getRootAlias(); foreach ($this->getRelationHolder()->getLocals() as $relation) { $query->leftJoin(sprintf('%s.%s %s', $rootAlias, $relation->getAlias(), dmString::lcfirst($relation->getAlias()))); } return $query; }
/** * Shortcut for myDoctrineQuery::create * * @return myDoctrineQuery the query with filled from */ public static function query($from = null, $conn = null) { if ($from instanceof Doctrine_Connection) { $conn = $from; $from = null; } $query = new myDoctrineQuery($conn); if ($from) { $query->from($from); } return $query; }
/** * Will join all localKey relations * @return myDoctrineQuery */ public function joinLocals(myDoctrineQuery $query, $withI18n = false) { $rootAlias = $query->getRootAlias(); foreach ($this->getRelationHolder()->getLocals() as $relation) { if ($relation->getClass() === 'DmMedia') { $query->withDmMedia($relation->getAlias()); } 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; }
public function updateRecursive($module) { if (!$module->hasPage()) { foreach ($module->getChildren() as $child) { $this->updateRecursive($child); } return; } $this->currentModule = $module; /* * get pages */ $pdoPages = dmDb::pdo(' SELECT p.id, p.lft, p.rgt, p.record_id, t.auto_mod, t.slug, t.name, t.title, t.h1, t.description, t.keywords, t.is_active, t.id as exist FROM dm_page p LEFT JOIN dm_page_translation t ON (t.id = p.id AND t.lang = ?) WHERE p.module = ? AND p.action = ?', array($this->culture, $module->getKey(), 'show'))->fetchAll(PDO::FETCH_ASSOC); $pages = array(); foreach ($pdoPages as $p) { $pages[$p['id']] = $p; } unset($pdoPages); /* * get records */ $records = $module->getTable()->createQuery('r INDEXBY r.id')->withI18n($this->culture, $module->getModel(), 'r')->fetchRecords()->getData(); /* * get autoSeo patterns */ $autoSeoRecord = dmDb::query('DmAutoSeo a')->withI18n($this->culture, null, 'a')->where('a.module = ?', $module->getKey())->andWhere('a.action = ?', 'show')->fetchOne(); if (!$autoSeoRecord) { $autoSeoRecord = dmDb::table('DmAutoSeo')->createFromModuleAndAction($module->getKey(), 'show', $this->culture)->saveGet(); } $autoSeoRecordTranslation = $autoSeoRecord->getOrCreateCurrentTranslation(); $patterns = array(); foreach ($module->getTable()->getAutoSeoFields() as $patternField) { $patterns[$patternField] = $autoSeoRecordTranslation->get($patternField); } if (isset($patterns['keywords']) && !sfConfig::get('dm_seo_use_keywords')) { unset($patterns['keywords']); } /* * get parent slugs * if slug pattern starts with a / * we don't use parent slug to build the page slug */ if ($patterns['slug'][0] === '/') { $parentSlugs = array(); } else { $parentSlugs = $this->getParentSlugs($module); } $modifiedPages = array(); foreach ($pages as $page) { if (isset($records[$page['record_id']])) { $record = $records[$page['record_id']]; } else { continue; } if (!empty($parentSlugs)) { $parentId = $this->getNodeParentId($page); $parentSlug = isset($parentSlugs[$parentId]) ? $parentSlugs[$parentId] : ''; } else { $parentSlug = ''; } //@todo make this behavior optional ? $tmp = array(); if ($record && $record->getTable()->isNestedSet()) { if ($record->getNode()->hasParent() && ($parentNode = $record->getNode()->getParent())) { $parentSlugs = explode('/', $parentNode->getDmPage()->get('slug')); } elseif (count($parentSlugs) > 1) { array_pop($parentSlugs); } $parentSlug = implode('/', $parentSlugs); } $modifiedFields = $this->updatePage($page, $module, $record, $patterns, $parentSlug); if (!empty($modifiedFields)) { $modifiedPages[$page['id']] = $modifiedFields; } } /* * Save modifications */ if (!empty($modifiedPages)) { /* * Fix bug when no DmPage instance have been loaded yet * ( this can happen when synchronization is run in a thread ) * DmPageTranslation class does not exist */ if (!class_exists('DmPageTranslation')) { new DmPage(); } $conn = Doctrine_Manager::getInstance()->getCurrentConnection(); try { $conn->beginTransaction(); foreach ($modifiedPages as $id => $modifiedFields) { if (!$pages[$id]['exist']) { $modifiedFields['id'] = $id; $modifiedFields['lang'] = $this->culture; $translation = new DmPageTranslation(); $translation->fromArray($modifiedFields); $conn->unitOfWork->processSingleInsert($translation); if (array_key_exists('slug', $modifiedFields)) { // verify the slug is not already in use if (!dmDb::table('DmPage')->isSlugUnique($translation->get('slug'), $id)) { myDoctrineQuery::create($conn)->update('DmPageTranslation')->set(array('slug' => dmDb::table('DmPage')->createUniqueSlug($translation->get('slug'), $id, $parentSlug)))->where('id = ?', $id)->andWhere('lang = ?', $this->culture)->execute(); } } } else { if (array_key_exists('slug', $modifiedFields)) { // verify the slug is not already in use if (!dmDb::table('DmPage')->isSlugUnique($modifiedFields['slug'], $id)) { $modifiedFields['slug'] = dmDb::table('DmPage')->createUniqueSlug($modifiedFields['slug'], $id, $parentSlug); } } myDoctrineQuery::create($conn)->update('DmPageTranslation')->set($modifiedFields)->where('id = ?', $id)->andWhere('lang = ?', $this->culture)->execute(); } } $conn->commit(); } catch (Doctrine_Exception $e) { $conn->rollback(); throw $e; } } unset($pages); foreach ($module->getChildren() as $child) { $this->updateRecursive($child); } }