/**
  * This aspect will block loadNodeTypes from being called and will instead
  * call overrideNodeTypes with a modified configuration.
  *
  * @Flow\Around("method(TYPO3\TYPO3CR\Domain\Service\NodeTypeManager->loadNodeTypes())")
  * @param JoinPointInterface $joinPoint The current join point
  * @return void
  */
 public function addDynamicNodeConfiguration(JoinPointInterface $joinPoint)
 {
     $completeNodeTypeConfiguration = $this->configurationManager->getConfiguration('NodeTypes');
     $dynamicNodeTypes = $this->dynamicNodeTypeRepository->findAll();
     /* @var $dynamicNodeType DynamicNodeType */
     foreach ($dynamicNodeTypes as $dynamicNodeType) {
         $dynamicNodeName = $dynamicNodeType->getValidNodeTypeName($this->settings['nodeNamespace']);
         if (!array_key_exists($dynamicNodeName, $completeNodeTypeConfiguration)) {
             $dynamicProperties = array();
             /* @var $dynamicProperty DynamicProperty */
             foreach ($dynamicNodeType->getDynamicProperties() as $dynamicProperty) {
                 $dynamicPropertyName = $dynamicProperty->getValidPropertyName($this->settings['propertyPrefix']);
                 $dynamicProperties[$dynamicPropertyName] = array('type' => 'string', 'defaultValue' => $dynamicProperty->getDefaultValue(), 'ui' => array('label' => $dynamicProperty->getLabel(), 'reloadIfChanged' => TRUE, 'inlineEditable' => TRUE, 'aloha' => array('placeholder' => $dynamicProperty->getPlaceholder()), 'inspector' => array('group' => 'dynamicProperties', 'editorOptions' => array('placeholder' => $dynamicProperty->getPlaceholder()))));
             }
             $newNodeConfiguration = array('superTypes' => $this->settings['superTypes'], 'abstract' => FALSE, 'ui' => array('label' => $dynamicNodeType->getLabel()));
             // Only set properties if there are any.
             // If properties is set to an empty array a bug in Neos will break the node configuration.
             // This leads to an empty inspector and strange error messages.
             if (count($dynamicProperties)) {
                 $newNodeConfiguration['properties'] = $dynamicProperties;
             }
             $completeNodeTypeConfiguration[$dynamicNodeName] = $newNodeConfiguration;
         }
     }
     /* @var $nodeTypeManager NodeTypeManager */
     $nodeTypeManager = $joinPoint->getProxy();
     $nodeTypeManager->overrideNodeTypes($completeNodeTypeConfiguration);
 }
 /**
  * Returns the processed Configuration
  *
  * @param \TYPO3\TYPO3CR\Domain\Model\NodeType $nodeType (uninitialized) The node type to process
  * @param array $configuration input configuration
  * @param array $options The processor options
  * @return void
  */
 public function process(NodeType $nodeType, array &$configuration, array $options)
 {
     $dynamicNodeTypes = $this->dynamicNodeTypeRepository->findAll();
     $typesList = array();
     /** @var DynamicNodeType $dynamicNodeType */
     foreach ($dynamicNodeTypes as $dynamicNodeType) {
         $typesList[$dynamicNodeType->getValidNodeTypeName($this->settings['nodeNamespace'])] = array('label' => $dynamicNodeType->getLabel());
     }
     $configuration['properties']['selectedNodeTypes']['ui']['inspector']['editorOptions']['values'] = $typesList;
 }
 /**
  * @param DynamicNodeType $dynamicNodeType
  * @param string $label
  * @param string $placeholder
  * @param string $defaultValue
  * @throws \TYPO3\Flow\Persistence\Exception\IllegalObjectTypeException
  */
 public function createDynamicPropertyAction(DynamicNodeType $dynamicNodeType, $label, $placeholder = '', $defaultValue = '')
 {
     $dynamicProperties = $dynamicNodeType->getDynamicProperties();
     $dynamicProperties[] = new DynamicProperty($label, $dynamicNodeType, $placeholder, $defaultValue);
     $this->dynamicNodeTypeRepository->update($dynamicNodeType);
     $this->redirect('edit', 'DynamicNodeType', 'Shel.DynamicNodes', array('dynamicNodeType' => $dynamicNodeType));
 }