/** * Add discriminator values to class MetaData when a content class is loaded * Occur on classcontent.include events. * * @param Event $event */ public static function onInclude(Event $event) { $dispatcher = $event->getDispatcher(); if (null !== $dispatcher->getApplication()) { $em = $dispatcher->getApplication()->getEntityManager(); $shortClassname = AbstractClassContent::getShortClassname($event->getTarget()); $fullClassname = AbstractClassContent::getFullClassname($event->getTarget()); foreach (class_parents($fullClassname) as $classname) { $em->getClassMetadata($classname)->addDiscriminatorMapClass($shortClassname, $fullClassname); if ('BackBee\\ClassContent\\AbstractClassContent' === $classname) { break; } } } }
/** * @expectedException \InvalidArgumentException */ public function testGetFullClassnameWithUnknownClass() { AbstractClassContent::getFullClassname('FakeClassName'); }
/** * @param Page $page * @param array $classnames * * @return AbstractContent */ public function getLastByMainnode(Page $page, $classnames = array()) { try { $q = $this->createQueryBuilder('c'); foreach ($classnames as $classname) { $q->orWhere('c INSTANCE OF ' . AbstractClassContent::getFullClassname($classname)); } $q->andWhere('c._mainnode = :node')->orderby('c._modified', 'desc')->setMaxResults(1)->setParameters(array('node' => $page)); $entity = $q->getQuery()->getSingleResult(); } catch (\Exception $e) { $entity = null; } return $entity; }
/** * Delete a Class Content * * @param AbstractClassContent $content * @param bool $mainContent if it's a main content, delete recursively under contents * * @return */ public function deleteContent(AbstractClassContent $content, $mainContent = true) { if (!$this->getEntityManager()->contains($content)) { // Ensure $content is managed $content = $this->getEntityManager()->getRepository(AbstractClassContent::getFullClassname($content))->find($content->getUid()); } if (null === $content) { return; } $parents = $this->getParentContents($content); $media = $this->_em->getRepository('BackBee\\NestedNode\\Media')->findOneBy(['_content' => $content->getUid()]); if (1 >= count($parents) && null === $media || true === $mainContent) { foreach ($content->getData() as $element) { if ($element instanceof AbstractClassContent) { $this->deleteContent($element, false); } } if ($content instanceof ContentSet) { $content->clear(); } foreach ($parents as $parent) { if (true === $mainContent && !$parent instanceof ContentSet && !$this->_em->getUnitOfWork()->isScheduledForDelete($parent)) { foreach ($parent->getData() as $key => $element) { if ($element instanceof AbstractClassContent && $element === $content) { $classname = get_class($element); $newContent = new $classname(); $this->_em->persist($newContent); $parent->{$key} = $newContent; } } } else { $parent->unsetSubContent($content); } } $this->cleanUpContentHardDelete($content); $this->_em->remove($content->setMainNode(null)); } }
/** * Resolves $content value. * * @param ContentSet $content * @param array $matches * * @return mixed */ private function resolveContentSet(ContentSet $content, array $matches) { if ('ContentSet' === $matches[1]) { return $content->item($matches[3]); } $index = intval($matches[3]); $classname = AbstractClassContent::getFullClassname(str_replace('/', NAMESPACE_SEPARATOR, $matches[1])); foreach ($content as $subcontent) { if (get_class($subcontent) !== $classname) { continue; } if (0 === $index) { return $subcontent; } $index--; } return $content; }