示例#1
0
 /**
  * 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;
 }
示例#2
0
文件: dmDb.php 项目: theolymp/diem
 /**
  * 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;
 }
示例#3
0
 /**
  * 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;
 }
示例#4
0
    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);
        }
    }