/** * 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)))); } }
<?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();
/** * 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(); }
/** * @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(); $id = ObjectTypeCache::getInstance()->getObjectTypeIDByName('de.codequake.cms.content.type', 'de.codequake.cms.content.type.template'); $list = new ContentList(); $list->getConditionBuilder()->add('content.contentTypeID', array($id)); $list->readObjects(); $affectedObjects = $list->getObjects(); // clear compiled foreach ($affectedObjects as $content) { if (!empty($content->compiled)) { $contentData = $content->contentData; $tmpArray = unserialze($contentData); unset($tmpArray['compiled']); $contentData = serialze($tmpArray); $contentEditor = new ContentEditor($content); $contentEditor->update(array('contentData' => $contentData)); } }