Neos\ContentRepository\TypeConverter\NodeConverter::convertFrom PHP Method

convertFrom() public method

If $source is a UUID it is expected to refer to the identifier of a NodeData record of the "live" workspace Otherwise $source has to be a valid node path: The node path must be an absolute context node path and can be specified as a string or as an array item with the key "__contextNodePath". The latter case is for updating existing nodes. This conversion method does not support / allow creation of new nodes because new nodes should be created through the createNode() method of an existing reference node. Also note that the context's "current node" is not affected by this object converter, you will need to set it to whatever node your "current" node is, if any. All elements in the source array which start with two underscores (like __contextNodePath) are specially treated by this converter. All elements in the source array which start with a *single underscore (like _hidden) are *directly* set on the Node object. All other elements, not being prefixed with underscore, are properties of the node.
public convertFrom ( string | array $source, string $targetType = null, array $subProperties = [], Neos\Flow\Property\PropertyMappingConfigurationInterface $configuration = null ) : mixed
$source string | array Either a string or array containing the absolute context node path which identifies the node. For example "/sites/mysitecom/homepage/about@user-admin"
$targetType string not used
$subProperties array not used
$configuration Neos\Flow\Property\PropertyMappingConfigurationInterface
return mixed An object or \Neos\Error\Messages\Error if the input format is not supported or could not be converted for other reasons
    public function convertFrom($source, $targetType = null, array $subProperties = array(), PropertyMappingConfigurationInterface $configuration = null)
    {
        if (is_string($source)) {
            $source = array('__contextNodePath' => $source);
        }
        if (!is_array($source) || !isset($source['__contextNodePath'])) {
            return new Error('Could not convert ' . gettype($source) . ' to Node object, a valid absolute context node path as a string or array is expected.', 1302879936);
        }
        try {
            $nodePathAndContext = NodePaths::explodeContextPath($source['__contextNodePath']);
            $nodePath = $nodePathAndContext['nodePath'];
            $workspaceName = $nodePathAndContext['workspaceName'];
            $dimensions = $nodePathAndContext['dimensions'];
        } catch (\InvalidArgumentException $exception) {
            return new Error('Could not convert array to Node object because the node path was invalid.', 1285162903);
        }
        $context = $this->contextFactory->create($this->prepareContextProperties($workspaceName, $configuration, $dimensions));
        $workspace = $context->getWorkspace(false);
        if (!$workspace) {
            return new Error(sprintf('Could not convert the given source to Node object because the workspace "%s" as specified in the context node path does not exist.', $workspaceName), 1383577859);
        }
        $node = $context->getNode($nodePath);
        if (!$node) {
            return new Error(sprintf('Could not convert array to Node object because the node "%s" does not exist.', $nodePath), 1370502328);
        }
        if (isset($source['_nodeType']) && $source['_nodeType'] !== $node->getNodeType()->getName()) {
            if ($context->getWorkspace()->getName() === 'live') {
                throw new NodeException('Could not convert the node type in live workspace', 1429989736);
            }
            $oldNodeType = $node->getNodeType();
            $targetNodeType = $this->nodeTypeManager->getNodeType($source['_nodeType']);
            $node->setNodeType($targetNodeType);
            $this->nodeService->setDefaultValues($node);
            $this->nodeService->cleanUpAutoCreatedChildNodes($node, $oldNodeType);
            $this->nodeService->createChildNodes($node);
        }
        unset($source['_nodeType']);
        $this->setNodeProperties($node, $node->getNodeType(), $source, $context, $configuration);
        return $node;
    }

Usage Example

 /**
  * @test
  */
 public function convertFromDecodesJsonEncodedArraysAsAssociative()
 {
     $contextPath = '/foo/bar@user-demo';
     $nodePath = '/foo/bar';
     $nodeTypeProperties = array('quux' => array('type' => 'array'));
     $decodedPropertyValue = array('foo' => 'bar');
     $source = array('__contextNodePath' => $contextPath, 'quux' => json_encode($decodedPropertyValue));
     $mockNode = $this->setUpNodeWithNodeType($nodePath, $nodeTypeProperties);
     $mockNode->expects($this->once())->method('setProperty')->with('quux', $decodedPropertyValue);
     $this->nodeConverter->convertFrom($source, null, array(), $this->mockConverterConfiguration);
 }
All Usage Examples Of Neos\ContentRepository\TypeConverter\NodeConverter::convertFrom