/**
  * @see	\wcf\system\cache\builder\AbstractCacheBuilder::rebuild()
  */
 public function rebuild(array $parameters)
 {
     $data = array('contents' => array(), 'tree' => array());
     $list = new ContentList();
     $list->sqlOrderBy = 'parentID ASC, showOrder ASC';
     $list->readObjects();
     $data['contents'] = $list->getObjects();
     foreach ($data['contents'] as $content) {
         $data['tree'][$content->parentID][] = $content->contentID;
     }
     return $data;
 }
示例#2
0
 /**
  * Creates a new revision for pages.
  */
 protected function createRevision()
 {
     // get available languages
     $availableLanguages = LanguageFactory::getInstance()->getLanguages();
     if (empty($this->objects)) {
         $this->readObjects();
     }
     foreach ($this->objects as $object) {
         $contentData = array();
         $contentList = new ContentList();
         $contentList->getConditionBuilder()->add('content.pageID = ?', array($object->pageID));
         $contentList->readObjects();
         foreach ($contentList as $content) {
             $objectType = $content->getObjectType();
             $tmpContentData = $content->getData();
             $langItem = $tmpContentData['title'];
             $tmpContentData['title'] = array();
             foreach ($availableLanguages as $lang) {
                 $tmpContentData['title'][$lang->countryCode] = $lang->get($langItem);
             }
             foreach ($objectType->getProcessor()->multilingualFields as $field) {
                 if (isset($tmpContentData['contentData'][$field])) {
                     $langItem = $tmpContentData['contentData'][$field];
                     $tmpContentData['contentData'][$field] = array();
                     foreach ($availableLanguages as $lang) {
                         $tmpContentData['contentData'][$field][$lang->countryCode] = $lang->get($langItem);
                     }
                 }
             }
             $contentData[] = $tmpContentData;
         }
         $pageData = $object->getDecoratedObject()->getData();
         foreach ($pageData as $key => $element) {
             if ($key == 'title' || $key == 'description' || $key == 'metaDescription' || $key == 'metaKeywords') {
                 $langItem = $pageData[$key];
                 $pageData[$key] = array();
                 foreach ($availableLanguages as $lang) {
                     $pageData[$key][$lang->countryCode] = $lang->get($langItem);
                 }
             }
         }
         call_user_func(array($this->className, 'createRevision'), array('pageID' => $object->getObjectID(), 'action' => isset($this->parameters['action']) ? $this->parameters['action'] : 'create', 'userID' => WCF::getUser()->userID, 'username' => WCF::getUser()->username, 'time' => TIME_NOW, 'data' => base64_encode(serialize($pageData)), 'contentData' => base64_encode(serialize($contentData))));
     }
 }
 /**
  * Restores a specific revision.
  */
 public function restore()
 {
     // get available languages
     $availableLanguages = LanguageFactory::getInstance()->getLanguages();
     $revision = $this->getSingleObject();
     WCF::getDB()->beginTransaction();
     $pageData = base64_decode($revision->data);
     $pageData = @unserialize($pageData);
     $i18nfields = array();
     // save i18n
     foreach ($pageData as $key => $data) {
         if (($key == 'title' || $key == 'description' || $key == 'metaDescription' || $key == 'metaKeywords') && is_array($data)) {
             $langData = array();
             foreach ($availableLanguages as $lang) {
                 if (isset($data[$lang->countryCode])) {
                     $langData[$lang->languageID] = $data[$lang->countryCode];
                 } else {
                     $langData[$lang->languageID] = '';
                 }
             }
             I18nHandler::getInstance()->setValues($key, $langData);
             $i18nfields[] = $key;
             $pageData[$key] = '';
         }
     }
     // restore page
     $pageAction = new PageAction(array($revision->pageID), 'update', array('data' => $pageData));
     $pageAction->executeAction();
     // save i18n
     foreach ($pageData as $key => $data) {
         if (($key == 'title' || $key == 'description' || $key == 'metaDescription' || $key == 'metaKeywords') && in_array($key, $i18nfields)) {
             $this->saveI18nValue(new Page($revision->pageID), 'page', $key);
         }
     }
     // restore contents
     $contentData = base64_decode($revision->contentData);
     $contentData = @unserialize($contentData);
     $contentList = new ContentList();
     $contentList->getConditionBuilder()->add('content.pageID = ?', array($revision->pageID));
     $contentList->readObjects();
     $existingContentIDs = $contentList->getObjectIDs();
     $oldContents = array();
     foreach ($contentData as $data) {
         $oldContents[$data['contentID']] = $data;
     }
     // delete contents that where created after the revision
     $orphanedElementIDs = array_diff($existingContentIDs, array_keys($oldContents));
     if (!empty($orphanedElementIDs)) {
         $contentAction = new ContentAction($orphanedElementIDs, 'delete');
         $contentAction->executeAction();
     }
     foreach ($oldContents as $oldContent) {
         $objectType = ObjectTypeCache::getInstance()->getObjectType($oldContent['contentTypeID']);
         if (in_array($oldContent['contentID'], $existingContentIDs)) {
             // content this exists => update
             $i18ntitle = false;
             if (is_array($oldContent['title'])) {
                 $langData = array();
                 foreach ($availableLanguages as $lang) {
                     if (isset($oldContent['title'][$lang->countryCode])) {
                         $langData[$lang->languageID] = $oldContent['title'][$lang->countryCode];
                     } else {
                         $langData[$lang->languageID] = '';
                     }
                 }
                 I18nHandler::getInstance()->setValues($key, $langData);
                 $i18ntitle = true;
                 $oldContent['title'] = '';
             }
             $i18nfields = array();
             foreach ($objectType->getProcessor()->multilingualFields as $field) {
                 if (isset($oldContent['contentData'][$field]) && is_array($oldContent['contentData'][$field])) {
                     $langData = array();
                     foreach ($availableLanguages as $lang) {
                         if (isset($oldContent['contentData'][$field][$lang->countryCode])) {
                             $langData[$lang->languageID] = $oldContent['contentData'][$field][$lang->countryCode];
                         } else {
                             $langData[$lang->languageID] = '';
                         }
                     }
                     I18nHandler::getInstance()->setValues($field, $langData);
                     $i18nfields[] = $field;
                     $oldContent['contentData'][$field] = '';
                 }
             }
             $contentAction = new ContentAction(array($oldContent['contentID']), 'update', array('data' => $oldContent));
             $contentAction->executeAction();
             if ($i18ntitle) {
                 $this->saveI18nValue(new Content($oldContent['contentID']), 'content', 'title');
             }
             foreach ($objectType->getProcessor()->multilingualFields as $field) {
                 if (in_array($field, $i18nfields)) {
                     $this->saveI18nValue(new Content($oldContent['contentID']), 'content', $field, true);
                 }
             }
         } else {
             // content was deleted => re-create
             $i18ntitle = false;
             if (is_array($oldContent['title'])) {
                 $langData = array();
                 foreach ($availableLanguages as $lang) {
                     if (isset($oldContent['title'][$lang->countryCode])) {
                         $langData[$lang->languageID] = $oldContent['title'][$lang->countryCode];
                     } else {
                         $langData[$lang->languageID] = '';
                     }
                 }
                 I18nHandler::getInstance()->setValues($field, $langData);
                 $i18ntitle = true;
                 $oldContent['title'] = '';
             }
             $i18nfields = array();
             foreach ($objectType->getProcessor()->multilingualFields as $field) {
                 if (isset($oldContent['contentData'][$field])) {
                     $langData = array();
                     foreach ($availableLanguages as $lang) {
                         if (isset($oldContent['contentData'][$field][$lang->countryCode])) {
                             $langData[$lang->languageID] = $oldContent['contentData'][$field][$lang->countryCode];
                         } else {
                             $langData[$lang->languageID] = '';
                         }
                     }
                     I18nHandler::getInstance()->setValues($key, $langData);
                     $i18nfields[] = $field;
                     $oldContent['contentData'][$field] = '';
                 }
             }
             $contentAction = new ContentAction(array($oldContent['contentID']), 'create', array('data' => $oldContent));
             $contentAction->executeAction();
             if ($i18ntitle) {
                 $this->saveI18nValue(new Content($oldContent['contentID']), 'content', 'title');
             }
             foreach ($objectType->getProcessor()->multilingualFields as $field) {
                 if (in_array($field, $i18nfields)) {
                     $this->saveI18nValue(new Content($oldContent['contentID']), 'content', $field, true);
                 }
             }
         }
     }
     WCF::getDB()->commitTransaction();
 }
示例#4
0
<?php

use cms\data\content\ContentAction;
use cms\data\content\ContentList;
use wcf\data\object\type\ObjectTypeCache;
/**
 * @author	Jens Krumsieck
 * @copyright	2013 - 2015 codeQuake
 * @license	GNU Lesser General Public License <http://www.gnu.org/licenses/lgpl-3.0.txt>
 * @package	de.codequake.cms
 */
$id = ObjectTypeCache::getInstance()->getObjectTypeIDByName('de.codequake.cms.content.type', 'de.codequake.cms.content.type.headline');
$list = new ContentList();
$list->getConditionBuilder()->add('content.position', array('sidebar'));
$list->getConditionBuilder()->add('content.contentTypeID', array($id));
$list->readObjects();
$affectedObjects = $list->getObjects();
//delete all headlines
$action = new ContentAction($affectedObjects, 'delete', array());
$action->executeAction();