/** * 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)); } }
/** * 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); }
/** * 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(); } }
/** * 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); }
/** * 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()); }
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()); }
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; }
/** * 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; }
/** * 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()); }
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()); }
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; }
/** * 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; }