protected function setUp() { $this->dispatcher = $this->getMock('\\Symfony\\Component\\EventDispatcher\\EventDispatcherInterface'); $this->logger = $this->getMock('\\Psr\\Log\\LoggerInterface'); DataLogger::init($this->logger); Dispatcher::setDispatcher($this->dispatcher); }
/** * @expectedException \RedKiteCms\Exception\Event\EventAbortedException * @expectedExceptionMessage abort message */ public function testEventAborted() { $eventName = 'foo.event'; $this->eventDispatcher->expects($this->once())->method('dispatch')->with($eventName, $this->event); $this->event->expects($this->once())->method('getAbort')->will($this->returnValue(true)); $this->event->expects($this->once())->method('getAbortMessage')->will($this->returnValue("abort message")); Dispatcher::setDispatcher($this->eventDispatcher); $this->assertEquals($this->event, Dispatcher::dispatch($eventName, $this->event)); }
/** * Removes the block from the given slot * * @param $sourceDir * @param array $options * @param $username */ public function remove($sourceDir, array $options, $username) { $dir = $this->init($sourceDir, $options, $username)->getDirInUse(); $blockName = $options["blockname"]; $blocksDir = $dir . '/blocks'; $filename = sprintf('%s/%s.json', $blocksDir, $blockName); $options["block"] = JsonTools::jsonDecode(FilesystemTools::readFile($filename)); Dispatcher::dispatch(BlockEvents::BLOCK_REMOVING, new BlockRemovingEvent($this->serializer, $filename)); $this->filesystem->remove($filename); $this->removeBlockFromSlotFile($options, $dir); Dispatcher::dispatch(BlockEvents::BLOCK_REMOVED, new BlockRemovedEvent($this->serializer, $filename)); DataLogger::log(sprintf('Block "%s" has been removed from the "%s" slot on page "%s" for the "%s_%s" language', $options["blockname"], $options["slot"], $options["page"], $options["language"], $options["country"])); }
private function addBlock($dir, array $options, $blockName) { $filename = sprintf('%s/blocks/%s.json', $dir, $blockName); $block = BlockFactory::createBlock($options["type"]); $block->setName($blockName); $block->setSlotName($options["slot"]); $blockClass = get_class($block); $encodedBlock = $this->serializer->serialize($block, 'json'); $event = Dispatcher::dispatch(BlockEvents::BLOCK_ADDING, new BlockAddingEvent($this->serializer, $filename, $encodedBlock, $blockClass)); $blockContent = $event->getFileContent(); FilesystemTools::writeFile($filename, $blockContent); Dispatcher::dispatch(BlockEvents::BLOCK_ADDED, new BlockAddedEvent($this->serializer, $filename, $encodedBlock, $blockClass)); return $blockContent; }
/** * Edits the given block * * @param string $sourceDir * @param array $options * @param string $username * @param array $values */ public function edit($sourceDir, array $options, $username, $values) { $this->resolveOptions($options); $this->init($sourceDir, $options, $username); $this->createContributorDir($sourceDir, $options, $username); $filename = sprintf('%s/blocks/%s.json', $this->getDirInUse(), $options["blockname"]); $currentBlock = $options["baseBlock"] = JsonTools::jsonDecode(FilesystemTools::readFile($filename)); $values = $this->parseChildren($values); $block = JsonTools::join($currentBlock, $values); $encodedBlock = json_encode($block); $blockClass = BlockFactory::getBlockClass($block["type"]); $event = Dispatcher::dispatch(BlockEvents::BLOCK_EDITING, new BlockEditingEvent($this->serializer, $filename, $encodedBlock, $blockClass)); $blockContent = $event->getFileContent(); FilesystemTools::writeFile($filename, $blockContent); Dispatcher::dispatch(BlockEvents::BLOCK_EDITED, new BlockEditedEvent($this->serializer, $filename, $encodedBlock, $blockClass)); DataLogger::log(sprintf('Block "%s" has been edited on the "%s" slot on page "%s" for the "%s_%s" language', $options["blockname"], $options["slot"], $options["page"], $options["language"], $options["country"])); }
/** * Approves the removal of the given contribution * * @param string $sourceDir * @param array $options * @param string $username */ public function approveRemoval($sourceDir, array $options, $username) { $this->init($sourceDir, $options, $username); $targetFilename = sprintf('%s/blocks/%s.json', $this->productionDir, $options['blockname']); if (!file_exists($targetFilename)) { // @codeCoverageIgnoreStart return; // @codeCoverageIgnoreEnd } Dispatcher::dispatch(BlockEvents::BLOCK_APPROVING_REMOVAL, new BlockApprovingRemovalEvent($this->serializer, $targetFilename)); $this->filesystem->remove($targetFilename); $slotDefinition = $this->getSlotDefinition($this->productionDir); $blocks = $slotDefinition["blocks"]; $key = array_search($options['blockname'], $blocks); unset($blocks[$key]); $slotDefinition["blocks"] = $blocks; $this->saveSlotDefinition($this->productionDir, $slotDefinition, $username); Dispatcher::dispatch(BlockEvents::BLOCK_APPROVED_REMOVAL, new BlockApprovedRemovalEvent($this->serializer, $targetFilename)); DataLogger::log(sprintf('Block "%s" has been approved for removal on the "%s" slot on page "%s" for the "%s_%s" language', $options["blockname"], $options["slot"], $options["page"], $options["language"], $options["country"])); }
public function restore($sourceDir, array $options, $username, $restoringBlockName) { $this->createContributorDir($sourceDir, $options, $username); $historyFileName = sprintf('%s/%s/history.json', $this->getArchiveDir(), $options["blockname"]); $history = json_decode(file_get_contents($historyFileName), true); // This happens when a user confirms a restoration then returns back and confirms again. // In this case there's nothing to restore. if (!array_key_exists($restoringBlockName, $history)) { return; } $restoringBlock = $history[$restoringBlockName]; $filename = sprintf('%s/blocks/%s.json', $this->contributorDir, $options["blockname"]); $currentBlock = file_get_contents($filename); Dispatcher::dispatch(BlockEvents::BLOCK_RESTORING, new BlockRestoringEvent($this->serializer, $filename, $restoringBlock)); file_put_contents($filename, json_encode($restoringBlock)); unset($history[$restoringBlockName]); $now = date("Y-m-d-H.i.s"); $history[$now] = json_decode($currentBlock, true); file_put_contents($historyFileName, json_encode($history)); Dispatcher::dispatch(BlockEvents::BLOCK_RESTORED, new BlockRestoredEvent($this->serializer, $filename, $restoringBlock)); DataLogger::log(sprintf('Block "%s" has been restored as "%s" on the slot "%s" on "%s" page for "%s_%s" language', $restoringBlockName, $options["blockname"], $options["slot"], $options["page"], $options["language"], $options["country"])); }
private function boot() { BlockFactory::boot($this->app["red_kite_cms.configuration_handler"]); Dispatcher::setDispatcher($this->app["dispatcher"]); DataLogger::init($this->app["monolog"]); Translator::setTranslator($this->app["translator"]); $this->app["red_kite_cms.plugin_manager"]->boot(); $theme = $this->app["red_kite_cms.plugin_manager"]->getActiveTheme(); $this->app["red_kite_cms.theme"]->boot($theme); $this->app["red_kite_cms.theme_generator"]->boot($theme); $this->app["red_kite_cms.slots_generator"]->boot($theme); $this->app["red_kite_cms.theme_aligner"]->boot($theme); $siteIncompleteFile = $this->app["red_kite_cms.root_dir"] . '/app/data/' . $this->siteName . '/incomplete.json'; if (file_exists($siteIncompleteFile)) { $this->createWebsitePages($theme); unlink($siteIncompleteFile); } $this->app["dispatcher"]->dispatch(CmsEvents::CMS_BOOTING, new CmsBootingEvent($this->app["red_kite_cms.configuration_handler"])); $this->app["red_kite_cms.template_assets"]->boot(); $this->app["red_kite_cms.assetic"]->addFilter('cssrewrite', new CssRewriteFilter()); }
/** * Dispatches the events * * @param $baseEventName * @param \RedKiteCms\FilesystemEntity\Page $page * @param array $slots * * @return array */ protected function dispatchSlotsEvent($baseEventName, Page $page, array $slots) { $eventNames = $this->generateEventNames($baseEventName, $page); $event = new SlotsRenderingEvent($slots); foreach ($eventNames as $eventName) { $event = Dispatcher::dispatch($eventName, $event); } return $event->getSlots(); }
private function moveBlockToSameSlot($baseDir, array $options, $username) { $sourceDir = $this->init($baseDir, $options, $username)->getDirInUse(); $slotsFilename = sprintf('%s/slot.json', $sourceDir); $slot = JsonTools::jsonDecode(FilesystemTools::readFile($slotsFilename), true); $blocks = $slot["blocks"]; $key = array_search($options["blockname"], $blocks); $blockName = $blocks[$key]; unset($blocks[$key]); array_splice($blocks, $options["position"], 0, $blockName); $slot["blocks"] = $blocks; $encodedSlot = json_encode($slot); $targetFile = sprintf('%s/blocks/%s.json', $sourceDir, $options["blockname"]); $event = Dispatcher::dispatch(BlockEvents::BLOCK_MOVING_SAME_SLOT, new BlockMovingSameSlotEvent($this->serializer, $blocks, $options["position"], $targetFile, $encodedSlot)); $slotContent = $event->getFileContent(); FilesystemTools::writeFile($slotsFilename, $slotContent); $block = FilesystemTools::readFile($targetFile); Dispatcher::dispatch(BlockEvents::BLOCK_MOVED_SAME_SLOT, new BlockMovedSameSlotEvent($this->serializer, $blocks, $options["position"], $targetFile, $encodedSlot)); DataLogger::log(sprintf('Block "%s" has been moved to position "%s" on the slot "%s" on "%s" page for "%s_%s" language', $options["blockname"], $options["position"], $options["slot"], $options["page"], $options["language"], $options["country"])); return $block; }
private function dispatchPermalinkChanged(array $currentPage, array $values) { if ($currentPage["permalink"] == $values["permalink"]) { return; } if (!array_key_exists("current_permalink", $values)) { $values["current_permalink"] = $currentPage["permalink"]; } $this->changedPermalink = array('old' => $currentPage["permalink"], 'new' => $values["permalink"]); Dispatcher::dispatch(PageEvents::PERMALINK_CHANGED, new PermalinkChangedEvent($currentPage["permalink"], $values["permalink"])); }
private function slugifyPageName(array $values) { $slugPageName = Utils::slugify($values["name"]); if ($slugPageName == $values["name"]) { return $values; } $event = Dispatcher::dispatch(PageCollectionEvents::SLUGGING_PAGE_COLLECTION_NAME, new SluggingPageNameEvent($values["name"], $slugPageName)); $sluggedText = $event->getChangedText(); // @codeCoverageIgnoreStart if ($sluggedText != $slugPageName) { $slugPageName = $sluggedText; } // @codeCoverageIgnoreEnd $values["name"] = $slugPageName; return $values; }
/** * Save the all website pages * * @param \RedKiteCms\Content\BlockManager\BlockManagerApprover $approver * @param array $languages * @param bool $saveCommonSlots Saves the common slots when true */ public function saveAllPages(BlockManagerApprover $approver, array $languages, $saveCommonSlots = true) { $this->contributorDefined(); $finder = new Finder(); $pages = $finder->directories()->depth(0)->in($this->pagesDir); foreach ($pages as $page) { $page = (string) $page; $pageName = basename($page); foreach ($languages as $language) { $tokens = explode("_", $language); $options = array('page' => $pageName, 'language' => $tokens[0], 'country' => $tokens[1]); $this->save($approver, $options, $saveCommonSlots); } $saveCommonSlots = false; } Dispatcher::dispatch(PageCollectionEvents::SITE_SAVED, new SiteSavedEvent()); DataLogger::log('The whole website\'s pages were successfully saved in production'); }