예제 #1
0
 /**
  * Prefix url of document with current resourcelocator prefix.
  *
  * @param IndexRebuildEvent $event
  */
 public function onIndexRebuild(IndexRebuildEvent $event)
 {
     $output = $event->getOutput();
     $filter = $event->getFilter();
     $output->writeln('<info>Rebuilding content index</info>');
     $typeMap = $this->baseMetadataFactory->getPhpcrTypeMap();
     $phpcrTypes = [];
     foreach ($typeMap as $type) {
         $phpcrType = $type['phpcr_type'];
         if ($phpcrType !== 'sulu:path') {
             $phpcrTypes[] = sprintf('[jcr:mixinTypes] = "%s"', $phpcrType);
         }
     }
     $condition = implode(' or ', $phpcrTypes);
     // TODO: We cannot select all contents via. the parent type, see: https://github.com/jackalope/jackalope-doctrine-dbal/issues/217
     $query = $this->documentManager->createQuery('SELECT * FROM [nt:unstructured] AS a WHERE ' . $condition);
     $count = [];
     $documents = $query->execute();
     $progress = new ProgressHelper();
     $progress->start($output, count($documents));
     foreach ($documents as $document) {
         if ($document instanceof SecurityBehavior && !empty($document->getPermissions())) {
             $progress->advance();
             continue;
         }
         $locales = $this->inspector->getLocales($document);
         foreach ($locales as $locale) {
             try {
                 $this->documentManager->find($document->getUuid(), $locale);
                 $documentClass = get_class($document);
                 if ($filter && !preg_match('{' . $filter . '}', $documentClass)) {
                     continue;
                 }
                 $this->searchManager->index($document, $locale);
                 if (!isset($count[$documentClass])) {
                     $count[$documentClass] = 0;
                 }
                 ++$count[$documentClass];
             } catch (\Exception $e) {
                 $output->writeln(sprintf('<error>Error indexing or de-indexing page (path: %s locale: %s)</error>: %s', $this->inspector->getPath($document), $locale, $e->getMessage()));
             }
         }
         $progress->advance();
     }
     $output->writeln('');
     foreach ($count as $className => $count) {
         if ($count == 0) {
             continue;
         }
         $output->writeln(sprintf('<comment>Content</comment>: %s <info>%s</info> indexed', $className, $count));
     }
 }
예제 #2
0
 /**
  * Set the document parent to be the webspace content path
  * when the document has no parent.
  *
  * @param FormEvent $event
  */
 public function postSubmitDocumentParent(FormEvent $event)
 {
     $document = $event->getData();
     if ($document->getParent()) {
         return;
     }
     $form = $event->getForm();
     $webspaceKey = $form->getConfig()->getAttribute('webspace_key');
     $parent = $this->documentManager->find($this->sessionManager->getContentPath($webspaceKey));
     if (null === $parent) {
         throw new \InvalidArgumentException(sprintf('Could not determine parent for document with title "%s" in webspace "%s"', $document->getTitle(), $webspaceKey));
     }
     $document->setParent($parent);
 }
예제 #3
0
 /**
  * Load the given fixture classes.
  *
  * @param array           $fixtures
  * @param mixed           $purge
  * @param mixed           $initialize
  * @param OutputInterface $output
  */
 public function execute(array $fixtures, $purge = true, $initialize = true, OutputInterface $output = null)
 {
     $output = $output ?: new NullOutput();
     if (true === $initialize) {
         $output->writeln('<comment>Initializing repository</comment>');
         $this->initializer->initialize($output, $purge);
     }
     $output->writeln('<comment>Loading fixtures</comment>');
     foreach ($fixtures as $fixture) {
         $output->writeln(sprintf(' - %s<info>loading "</info>%s<info>"</info>', $fixture instanceof OrderedFixtureInterface ? '[' . $fixture->getOrder() . ']' : '', get_class($fixture)));
         $fixture->load($this->documentManager);
         $this->documentManager->clear();
     }
 }
예제 #4
0
 /**
  * It should return the resource locators including the reosurce locator
  * of the shadow page.
  */
 public function testGetResourceLocatorsWithShadow()
 {
     $page = $this->documentManager->create('page');
     $page->setStructureType('overview');
     $page->setTitle('Beschreibung');
     $page->setResourceSegment('/beschreibung');
     $page->setWorkflowStage(WorkflowStage::PUBLISHED);
     $this->documentManager->persist($page, 'de', ['parent_path' => '/cmf/sulu_io/contents']);
     $this->documentManager->flush();
     $page->setTitle('Description');
     $page->setResourceSegment('/description');
     $page->setWorkflowStage(WorkflowStage::TEST);
     $this->documentManager->persist($page, 'en', ['parent_path' => '/cmf/sulu_io/contents']);
     $this->documentManager->flush();
     $page->setShadowLocaleEnabled(true);
     $page->setShadowLocale('de');
     $this->documentManager->persist($page, 'en', ['parent_path' => '/cmf/sulu_io/contents']);
     $this->documentManager->flush();
     $content = $this->mapper->load($page->getUuid(), 'sulu_io', 'en');
     $urls = $content->getUrls();
     $this->assertArrayHasKey('en', $urls);
     $this->assertEquals('/description', $urls['en']);
     $this->assertArrayNotHasKey('en_us', $urls);
     $this->assertArrayHasKey('de', $urls);
     $this->assertEquals('/beschreibung', $urls['de']);
     $this->assertArrayNotHasKey('de_at', $urls);
     $this->assertArrayNotHasKey('es', $urls);
 }
예제 #5
0
 /**
  * Prefix url of document with current resourcelocator prefix.
  *
  * @param IndexRebuildEvent $event
  */
 public function onIndexRebuild(IndexRebuildEvent $event)
 {
     $output = $event->getOutput();
     $purge = $event->getPurge();
     $filter = $event->getFilter();
     $output->writeln('<info>Rebuilding content index</info>');
     // TODO: We cannot select all contents via. the parent type, see: https://github.com/jackalope/jackalope-doctrine-dbal/issues/217
     $query = $this->documentManager->createQuery('SELECT * FROM [nt:unstructured] AS a WHERE [jcr:mixinTypes] = "sulu:page" or [jcr:mixinTypes] = "sulu:snippet"');
     $count = [];
     if ($purge) {
         $this->purgeContentIndexes($output);
     }
     $documents = $query->execute();
     $progress = new ProgressHelper();
     $progress->start($output, count($documents));
     foreach ($documents as $document) {
         $locales = $this->inspector->getLocales($document);
         foreach ($locales as $locale) {
             try {
                 $this->documentManager->find($document->getUuid(), $locale);
                 $documentClass = get_class($document);
                 if ($filter && !preg_match('{' . $filter . '}', $documentClass)) {
                     continue;
                 }
                 $this->searchManager->index($document, $locale);
                 if (!isset($count[$documentClass])) {
                     $count[$documentClass] = 0;
                 }
                 ++$count[$documentClass];
             } catch (\Exception $e) {
                 $output->writeln(sprintf('<error>Error indexing or de-indexing page (path: %s locale: %s)</error>: %s', $this->inspector->getPath($document), $locale, $e->getMessage()));
             }
         }
         $progress->advance();
     }
     $output->writeln('');
     foreach ($count as $className => $count) {
         if ($count == 0) {
             continue;
         }
         $output->writeln(sprintf('<comment>Content</comment>: %s <info>%s</info> indexed', $className, $count));
     }
 }
 /**
  * It should set the parent document.
  */
 public function testSetParentDocument()
 {
     $this->persistEvent->getDocument()->willReturn($this->document->reveal());
     $this->persistEvent->getLocale()->willReturn('fr');
     $this->metadataFactory->getMetadataForClass(get_class($this->document->reveal()))->willReturn($this->metadata->reveal());
     $this->metadata->getAlias()->willReturn('test');
     $this->nodeManager->createPath('/')->willReturn($this->parentNode->reveal());
     $this->persistEvent->hasParentNode()->shouldBeCalled();
     $this->persistEvent->setParentNode($this->parentNode->reveal())->shouldBeCalled();
     $this->documentManager->find('/test', 'fr')->willReturn($this->parentDocument);
     $this->subscriber->handlePersist($this->persistEvent->reveal());
 }
예제 #7
0
 public function testOnIndexRebuild()
 {
     $event = $this->prophesize(IndexRebuildEvent::class);
     $query = $this->prophesize(Query::class);
     $document = $this->prophesize(StructureBehavior::class);
     $document->willImplement(UuidBehavior::class);
     $securableDocument = $this->prophesize(StructureBehavior::class);
     $securableDocument->willImplement(SecurityBehavior::class);
     $securableDocument->willImplement(UuidBehavior::class);
     $securableDocument->getPermissions()->willReturn([]);
     $securedDocument = $this->prophesize(StructureBehavior::class);
     $securedDocument->willImplement(SecurityBehavior::class);
     $securedDocument->willImplement(UuidBehavior::class);
     $securedDocument->getPermissions()->willReturn(['some' => 'permissions']);
     $typemap = [['phpcr_type' => 'page'], ['phpcr_type' => 'home'], ['phpcr_type' => 'snippet']];
     $output = $this->prophesize(OutputInterface::class);
     $event->getOutput()->willReturn($output->reveal());
     $event->getFilter()->shouldBeCalled();
     $this->baseMetadataFactory->getPhpcrTypeMap()->shouldBeCalled()->willReturn($typemap);
     $this->documentManager->createQuery('SELECT * FROM [nt:unstructured] AS a WHERE [jcr:mixinTypes] = "page" or [jcr:mixinTypes] = "home" or [jcr:mixinTypes] = "snippet"')->shouldBeCalled()->willReturn($query->reveal());
     $query->execute()->shouldBeCalled()->willReturn([$document->reveal(), $securableDocument->reveal(), $securedDocument->reveal()]);
     $this->inspector->getLocales($document->reveal())->shouldBeCalled()->willReturn(['de', 'en']);
     $document->getUuid()->shouldBeCalled()->willReturn('1');
     $this->documentManager->find('1', 'en')->shouldBeCalled();
     $this->searchManager->index($document->reveal(), 'en')->shouldBeCalled();
     $this->documentManager->find('1', 'de')->shouldBeCalled();
     $this->searchManager->index($document->reveal(), 'de')->shouldBeCalled();
     $this->inspector->getLocales($securableDocument->reveal())->shouldBeCalled()->willReturn(['de']);
     $securableDocument->getUuid()->willReturn('2');
     $this->documentManager->find('2', 'de')->shouldBeCalled();
     $this->searchManager->index($securableDocument->reveal(), 'de')->shouldBeCalled();
     $securedDocument->getUuid()->willReturn('3');
     $this->documentManager->find('3', 'de')->shouldNotBeCalled();
     $this->searchManager->index($securedDocument->reveal(), 'de')->shouldNotBeCalled();
     $this->reindexListener->onIndexRebuild($event->reveal());
 }
예제 #8
0
 private function processForm(Request $request, $document)
 {
     $locale = $this->getLocale($request);
     $data = $request->request->all();
     $data['workflowStage'] = $request->get('state', WorkflowStage::PUBLISHED);
     $form = $this->formFactory->create('snippet', $document, ['csrf_protection' => false]);
     $form->submit($data, false);
     if (!$form->isValid()) {
         throw new InvalidFormException($form);
     }
     $this->documentManager->persist($document, $locale, ['user' => $this->getUser()->getId(), 'clear_missing_content' => false]);
     $this->documentManager->publish($document, $locale);
     $this->documentManager->flush();
     return $form;
 }
예제 #9
0
파일: Webspace.php 프로젝트: sulu/sulu
 /**
  * Returns node path from given uuid.
  *
  * @param $uuids
  *
  * @return string[]
  */
 protected function getPathsByUuids($uuids)
 {
     $paths = [];
     $where = [];
     foreach ($uuids as $uuid) {
         $where[] = sprintf('[jcr:uuid] = "%s"', $uuid);
     }
     $queryString = 'SELECT * FROM [nt:unstructured] AS a WHERE ' . implode(' OR ', $where);
     $query = $this->documentManager->createQuery($queryString);
     $result = $query->execute();
     /** @var BasePageDocument $page */
     foreach ($result as $page) {
         $paths[$page->getUuid()] = $page->getPath();
     }
     return $paths;
 }
예제 #10
0
파일: Webspace.php 프로젝트: sulu/sulu
 /**
  * Prepare the settings value for the respective setter.
  *
  * @param $key
  * @param $value
  *
  * @return mixed|object
  */
 protected function getSetterValue($key, $value)
 {
     if (empty($value)) {
         return;
     }
     switch ($key) {
         case 'redirectTarget':
             $value = $this->documentManager->find($value);
             break;
         case 'permissions':
             $value = json_decode($value, true);
             break;
         case 'navigationContexts':
             $value = json_decode($value);
             break;
     }
     return $value;
 }
 public function testRun()
 {
     $this->initPhpcr();
     $snippet = $this->documentManager->create('snippet');
     $snippet->setStructureType('car');
     $snippet->setTitle('Hallo');
     $snippet->getStructure()->bind(['description' => 'This is a perfect description.']);
     $this->documentManager->persist($snippet, 'en', ['parent_path' => '/cmf/snippets/car']);
     $this->documentManager->flush();
     $this->tester->execute(['srcLocale' => 'en', 'destLocale' => 'de']);
     $output = $this->tester->getDisplay();
     $this->assertContains('Done', $output);
     $this->documentRegistry->clear();
     $resultEN = $this->documentManager->find($snippet->getUuid(), 'en');
     $resultDE = $this->documentManager->find($snippet->getUuid(), 'de');
     $this->assertEquals('Hallo', $resultDE->getTitle());
     $this->assertEquals('Hallo', $resultEN->getTitle());
     $this->assertEquals('This is a perfect description.', $resultDE->getStructure()->getProperty('description')->getValue());
     $this->assertEquals('This is a perfect description.', $resultEN->getStructure()->getProperty('description')->getValue());
 }
예제 #12
0
 public function testRun()
 {
     $this->initPhpcr();
     $page = $this->documentManager->create('page');
     $page->setStructureType('default');
     $page->setTitle('Hallo');
     $page->getStructure()->bind(['article' => 'This is a perfect description.']);
     $page->setResourceSegment('/hallo');
     $this->documentManager->persist($page, 'de', ['parent_path' => '/cmf/sulu_io/contents']);
     $this->documentManager->flush();
     $this->tester->execute(['webspaceKey' => 'sulu_io', 'srcLocale' => 'de', 'destLocale' => 'en']);
     $output = $this->tester->getDisplay();
     $this->assertContains('Done', $output);
     $this->documentRegistry->clear();
     $resultEN = $this->documentManager->find($page->getUuid(), 'en');
     $resultDE = $this->documentManager->find($page->getUuid(), 'de');
     $this->assertEquals('Hallo', $resultDE->getTitle());
     $this->assertEquals('Hallo', $resultEN->getTitle());
     $this->assertEquals('This is a perfect description.', $resultDE->getStructure()->getProperty('article')->getValue());
     $this->assertEquals('This is a perfect description.', $resultEN->getStructure()->getProperty('article')->getValue());
     $this->assertEquals('/hallo', $resultDE->getResourceSegment());
     $this->assertEquals('/hallo', $resultEN->getResourceSegment());
 }
예제 #13
0
 private function loadDocument($pathOrUuid, $locale, $options)
 {
     $document = $this->documentManager->find($pathOrUuid, $locale, array('load_ghost_content' => isset($options['load_ghost_content']) ? $options['load_ghost_content'] : true));
     if ($this->optionsShouldExcludeDocument($document, $options)) {
         return;
     }
     return $document;
 }
예제 #14
0
 /**
  * Return snippets.
  *
  * If $type is given then only return the snippets of that type.
  *
  * @param string $locale
  * @param string $type         Optional snippet type
  * @param int    $offset       Optional offset
  * @param int    $max          Optional max
  * @param string $search
  * @param string $sortBy
  * @param string $sortOrder
  *
  * @throws \InvalidArgumentException
  *
  * @return SnippetBridge[]
  */
 public function getSnippets($locale, $type = null, $offset = null, $max = null, $search = null, $sortBy = null, $sortOrder = null)
 {
     $query = $this->getSnippetsQuery($locale, $type, $offset, $max, $search, $sortBy, $sortOrder);
     $documents = $this->documentManager->createQuery($query, $locale, ['load_ghost_content' => true])->execute();
     return $documents;
 }