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');
 }