diff --git a/Neos.ContentRepository/Classes/Domain/Model/Node.php b/Neos.ContentRepository/Classes/Domain/Model/Node.php index d5d64d6a0ac..a2ee446c9d9 100644 --- a/Neos.ContentRepository/Classes/Domain/Model/Node.php +++ b/Neos.ContentRepository/Classes/Domain/Model/Node.php @@ -1272,6 +1272,10 @@ public function getChildNodes($nodeTypeFilter = null, $limit = null, $offset = n */ public function getNumberOfChildNodes($nodeTypeFilter = null): int { + $nodes = $this->context->getFirstLevelNodeCache()->getChildNodesByPathAndNodeTypeFilter($this->getPath(), $nodeTypeFilter); + if ($nodes !== false) { + return count($nodes); + } return $this->nodeData->getNumberOfChildNodes($nodeTypeFilter, $this->context->getWorkspace(), $this->context->getDimensions()); } diff --git a/Neos.ContentRepository/Classes/Domain/Repository/NodeDataRepository.php b/Neos.ContentRepository/Classes/Domain/Repository/NodeDataRepository.php index 95bc7ff6c3c..3f1365e5fbb 100644 --- a/Neos.ContentRepository/Classes/Domain/Repository/NodeDataRepository.php +++ b/Neos.ContentRepository/Classes/Domain/Repository/NodeDataRepository.php @@ -1618,6 +1618,10 @@ protected function addIdentifierConstraintToQueryBuilder(QueryBuilder $queryBuil */ protected function filterNodeDataByBestMatchInContext(array $nodeDataObjects, Workspace $workspace, array $dimensions, $includeRemovedNodes = false) { + if (!$nodeDataObjects) { + return []; + } + $workspaces = $this->collectWorkspaceAndAllBaseWorkspaces($workspace); $nonPersistedNodes = []; $nodeIdentifier = []; diff --git a/Neos.Media.Browser/Resources/Private/Translations/af/Main.xlf b/Neos.Media.Browser/Resources/Private/Translations/af/Main.xlf index a83c1523fcb..de3b6fd9d68 100644 --- a/Neos.Media.Browser/Resources/Private/Translations/af/Main.xlf +++ b/Neos.Media.Browser/Resources/Private/Translations/af/Main.xlf @@ -61,10 +61,11 @@ Descending Sort direction Ascending - Sort direction Ascending + Sorteer rigting Stygend Sort direction Descending - Sort direction Descending + +Sorteer rigting Dalend Drag and drop on tag or collection Drag and drop on tag or collection @@ -103,13 +104,13 @@ This operation cannot be undone. Cancel - Cancel + Kanselleer Replace Replace Replace asset resource - Replace asset resource + Vervang batehulpbron Save Save @@ -262,7 +263,7 @@ Basics Delete - Delete + verwyder Click to delete Click to delete @@ -316,7 +317,7 @@ Cannot upload the file No file selected - No file selected + Geen lêer is gekies nie The file size of {0} exceeds the allowed limit of {1} The file size of {0} exceeds the allowed limit of {1} @@ -422,13 +423,15 @@ Generate redirects from original file url to the new url 'Resources of type "{0}" can only be replaced by a similar resource. Got type "{1}"' - 'Resources of type "{0}" can only be replaced by a similar resource. Got type "{1}"' + +'Hulpbronne van die tipe' {0} 'kan slegs deur 'n soortgelyke bron vervang word. Het tipe "{1}" 'gekry No access to workspace "{0}" - No access to workspace "{0}" + Geen toegang tot werkruimte "{0}" No document node found for this node - No document node found for this node + +Geen dokumentknoop gevind vir hierdie knoop nie diff --git a/Neos.Neos/Classes/EventLog/Domain/Model/Event.php b/Neos.Neos/Classes/EventLog/Domain/Model/Event.php index 3cdbc5b7229..61d67710a0f 100644 --- a/Neos.Neos/Classes/EventLog/Domain/Model/Event.php +++ b/Neos.Neos/Classes/EventLog/Domain/Model/Event.php @@ -83,7 +83,7 @@ class Event * Child events, of this event * * @var ArrayCollection - * @ORM\OneToMany(targetEntity="Neos\Neos\EventLog\Domain\Model\Event", mappedBy="parentEvent", cascade="persist") + * @ORM\OneToMany(targetEntity="Neos\Neos\EventLog\Domain\Model\Event", mappedBy="parentEvent", cascade={"persist"}) */ protected $childEvents; diff --git a/Neos.Neos/Classes/Fusion/DimensionsMenuItemsImplementation.php b/Neos.Neos/Classes/Fusion/DimensionsMenuItemsImplementation.php index 6b0b0647145..aac5e060f97 100644 --- a/Neos.Neos/Classes/Fusion/DimensionsMenuItemsImplementation.php +++ b/Neos.Neos/Classes/Fusion/DimensionsMenuItemsImplementation.php @@ -237,6 +237,8 @@ protected function hasHiddenNodeParent(NodeInterface $node): bool $rootNode = $node->getContext()->getRootNode(); $nodesOnPath = $node->getContext()->getNodesOnPath($rootNode, $node); - return count($nodesOnPath) < $node->getDepth(); + // Because the depth is 0-based, but the nodes returned by getNodesOnPath() + // contain the root node, less-than-or-equal must be used. + return count($nodesOnPath) <= $node->getDepth(); } } diff --git a/Neos.Neos/Classes/Service/Controller/NodeController.php b/Neos.Neos/Classes/Service/Controller/NodeController.php index 3694bae42ba..058c45ae24e 100644 --- a/Neos.Neos/Classes/Service/Controller/NodeController.php +++ b/Neos.Neos/Classes/Service/Controller/NodeController.php @@ -13,6 +13,7 @@ use Neos\Flow\Annotations as Flow; use Neos\Eel\FlowQuery\FlowQuery; +use Neos\Flow\Http\Helper\SecurityHelper; use Neos\Flow\Property\TypeConverter\PersistentObjectConverter; use Neos\Neos\Domain\Repository\DomainRepository; use Neos\Neos\Domain\Service\NodeSearchServiceInterface; @@ -184,7 +185,7 @@ public function createAction(Node $referenceNode, array $nodeData, $position) { $newNode = $this->nodeOperations->create($referenceNode, $nodeData, $position); - if ($this->request->getHttpRequest()->isMethodSafe() === false) { + if (SecurityHelper::hasSafeMethod($this->request->getHttpRequest()) === false) { $this->persistenceManager->persistAll(); } @@ -237,7 +238,7 @@ public function moveAction(Node $node, Node $targetNode, $position) { $node = $this->nodeOperations->move($node, $targetNode, $position); - if ($this->request->getHttpRequest()->isMethodSafe() === false) { + if (SecurityHelper::hasSafeMethod($this->request->getHttpRequest()) === false) { $this->persistenceManager->persistAll(); } @@ -280,7 +281,7 @@ public function copyAction(Node $node, Node $targetNode, $position, $nodeName = { $copiedNode = $this->nodeOperations->copy($node, $targetNode, $position, $nodeName); - if ($this->request->getHttpRequest()->isMethodSafe() === false) { + if (SecurityHelper::hasSafeMethod($this->request->getHttpRequest()) === false) { $this->persistenceManager->persistAll(); } @@ -333,7 +334,7 @@ public function copyAndRenderAction(Node $node, Node $targetNode, $position, $fu */ public function updateAction(Node $node) { - if ($this->request->getHttpRequest()->isMethodSafe() === false) { + if (SecurityHelper::hasSafeMethod($this->request->getHttpRequest()) === false) { $this->persistenceManager->persistAll(); } @@ -373,7 +374,7 @@ public function updateAndRenderAction(Node $node, $fusionPath) */ public function deleteAction(Node $node) { - if ($this->request->getHttpRequest()->isMethodSafe() === false) { + if (SecurityHelper::hasSafeMethod($this->request->getHttpRequest()) === false) { $this->persistenceManager->persistAll(); } diff --git a/Neos.Neos/Documentation/Appendixes/ChangeLogs/533.rst b/Neos.Neos/Documentation/Appendixes/ChangeLogs/533.rst new file mode 100644 index 00000000000..b640b7947c7 --- /dev/null +++ b/Neos.Neos/Documentation/Appendixes/ChangeLogs/533.rst @@ -0,0 +1,113 @@ +`5.3.3 (2021-05-02) `_ +============================================================================================== + +Overview of merged pull requests +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +`BUGFIX: getAssetProxy failed for local assets `_ +---------------------------------------------------------------------------------------------------------------- + +With `836d739fa4f92b3c87c0fcaccd54f2909e188773 `_ a condition was added that prevented getting an AssetProxy for assets in the Neos AssetSource. But they all have one and therefore the query for an imported AssetProxy is not skipped for local assets. + +**What I did** + +Return AssetProxy for local assets. + +**How I did it** + +Check if the AssetSource is Neos itself. + +**How to verify it** + +Added functional test + +* Packages: ``Media`` + +`BUGFIX: Use "stable" identifier when auto-creating child nodes `_ +--------------------------------------------------------------------------------------------------------------------------------- + +Since ``node:repair`` uses the ``buildAutoCreatedChildNodeIdentifier``, it would +best to ensure the ``identifier`` is already correct when auto-creating child nodes. + +Otherwise the identifier will be changed to a so called "stable" +identifier during a ``node:repair`` run which can lead to unwanted +behaviour in certain applications. + +* Packages: ``Browser`` ``ContentRepository`` + +`TASK: Relax version constraint and allow Neos.Fusion.Form 2.0 `_ +-------------------------------------------------------------------------------------------------------------------------------- + +Starting with Neos 5.2 the Neos Package required Neos.Fusion.Form `^1.0` instead of `*` which will not allow to use version 2.0+ of said package. + +This change adjusts the constraint to `^1.0 || ^2.0` to allow projects to benefit from the Fusion.Form Runtime. + +~~Hint: When upmerged to master constraint should be adjusted to `^2.0`. If this is forgotten i will take care in a second pr.~~ + +Relates: https://github.com/neos/fusion-form/issues/42 + +* Packages: ``Neos`` + +`BUGFIX: Open delete dialog on edit user view `_ +--------------------------------------------------------------------------------------------------------------- + +On the edit view of the user management module it was not possible to delete the user caused by the missing confirmation dialog. This has not been open caused by a wrong if condition. + +* Fixes: `#3310 `_ +* Packages: ``Neos`` + +`TASK: Mark migrations as applied after behat setup `_ +--------------------------------------------------------------------------------------------------------------------- + +This should work around an edge-case regression in doctrine/migrations 3.1.1 - see https://github.com/neos/neos-development-collection/pull/3311#issuecomment-803560353 + +* Packages: ``github`` ``Neos`` + +`BUGFIX: Re-Enable formerly unsupported editors for NodeCreationDialog `_ +---------------------------------------------------------------------------------------------------------------------------------------- + +Hi there, + +this PR accompanies https://github.com/neos/neos-ui/pull/2870 and re-enables editor functionalities that were disabled in https://github.com/neos/neos-development-collection/commit/`029572e38c163a5475c0ed3a8a29a988a60e4f4c `_#diff-`5dcd744af0bf44e044a96b272818323abc9ed49d `_284f5e40ff33f62b440ff801R91 ff. due to a lack of support for secondary editor views in the NodeCreationDialog. + +* Packages: ``Neos`` + +`BUGFIX: Adjust user menu dropdown width `_ +---------------------------------------------------------------------------------------------------------- + +Limit the minimum width of the dropdown to the width of the trigger button +and make it possible to become wider and float from right side of the trigger button to the left. + +* Fixes: `#3297 `_ +* Packages: ``github`` ``Neos`` + +`BUGFIX: Adjust logout button style `_ +----------------------------------------------------------------------------------------------------- + +Remove border from logout button in the user menu ot the top nav. + +* Fixes: `#3296 `_ +* Packages: ``Neos`` + +`TASK: Add GH action for builds `_ +------------------------------------------------------------------------------------------------- + +See https://github.com/neos/flow-development-collection/pull/2390 and https://github.com/neos/flow-development-collection/pull/2273 + +Resolves neos/team#54 + +* Packages: ``Neos`` + +`BUGFIX: Fix cache identifier collision in \`Neos_Fusion_ObjectTree\` cache. `_ +---------------------------------------------------------------------------------------------------------------------------------------------- + +The `Neos_Fusion_ObjectTree` cache is used to store parsed fusion ASTs, the identifier is calculated from the configured fusionPathPatterns. Previously the string `@package` was replaced at runtime and thus became not part of the cache identifier calculation. That way two packages using the same fusionPathPatterns would end up with the same cacheIdentifier. + +This change extracts the replacement of the `@package` into a separate method that is called from the CachingAspect. +That way if the package key is used in the current path pattern it becomes part of the cache identifier. + +* Resolves: `#3288 `_ +* Packages: ``Fusion`` ``Neos`` + +`Detailed log `_ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/Neos.Neos/Documentation/References/EelHelpersReference.rst b/Neos.Neos/Documentation/References/EelHelpersReference.rst index b68eb660415..2e796cae9e8 100644 --- a/Neos.Neos/Documentation/References/EelHelpersReference.rst +++ b/Neos.Neos/Documentation/References/EelHelpersReference.rst @@ -3,7 +3,34 @@ Eel Helpers Reference ===================== -This reference was automatically generated from code on 2019-03-05 +This reference was automatically generated from code on 2021-05-30 + + +.. _`Eel Helpers Reference: Api`: + +Api +--- + + + +Implemented in: ``Neos\Neos\Ui\Fusion\Helper\ApiHelper`` + +Api.emptyArrayToObject(array) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Converts an empty array to an empty object. Does nothing if array is not empty. + +Use this helper to prevent associative arrays from being converted to non-associative arrays by json_encode. +This is an internal helper and might change without further notice +FIXME: Probably better to produce objects in the first place "upstream". + +* ``array`` (array) Associative array which may be empty + +**Return** (array|\stdClass) Non-empty associative array or empty object + + + + .. _`Eel Helpers Reference: Array`: @@ -25,9 +52,9 @@ Array.concat(array1, array2, array\_) Concatenate arrays or values to a new array -* ``array1`` (array|mixed) First array or value -* ``array2`` (array|mixed) Second array or value -* ``array_`` (array|mixed, *optional*) Optional variable list of additional arrays / values +* ``array1`` (iterable|mixed) First array or value +* ``array2`` (iterable|mixed) Second array or value +* ``array_`` (iterable|mixed, *optional*) Optional variable list of additional arrays / values **Return** (array) The array with concatenated arrays or values @@ -42,7 +69,7 @@ Example:: Array.every([1, 2, 3, 4], x => x % 2 == 0) // == false Array.every([2, 4, 6, 8], x => x % 2) // == true -* ``array`` (array) Array of elements to test +* ``array`` (iterable) Array of elements to test * ``callback`` (callable) Callback for testing elements, current value and key will be passed as arguments **Return** (bool) True if all elements passed the test @@ -57,7 +84,7 @@ Examples: Array.filter([1, 2, 3, 4], x => x % 2 == 0) // == [2, 4] Array.filter(['foo', 'bar', 'baz'], (x, index) => index < 2) // == ['foo', 'bar'] -* ``array`` (array) Array of elements to filter +* ``array`` (iterable) Array of elements to filter * ``callback`` (callable, *optional*) Callback for testing if an element should be included in the result, current value and key will be passed as arguments **Return** (array) The array with elements where callback returned true @@ -67,7 +94,7 @@ Array.first(array) Get the first element of an array -* ``array`` (array) The array +* ``array`` (iterable) The array **Return** (mixed) @@ -79,7 +106,7 @@ Exchanges all keys with their associated values in an array Note that the values of array need to be valid keys, i.e. they need to be either int or string. If a value has several occurrences, the latest key will be used as its value, and all others will be lost. -* ``array`` (array) +* ``array`` (iterable) **Return** (array) The array with flipped keys and values @@ -89,7 +116,7 @@ Array.indexOf(array, searchElement, fromIndex) Returns the first index at which a given element can be found in the array, or -1 if it is not present -* ``array`` (array) The array +* ``array`` (iterable) The array * ``searchElement`` (mixed) The element value to find * ``fromIndex`` (int, *optional*) Position in the array to start the search. @@ -100,7 +127,7 @@ Array.isEmpty(array) Check if an array is empty -* ``array`` (array) The array +* ``array`` (iterable) The array **Return** (bool) true if the array is empty @@ -109,7 +136,7 @@ Array.join(array, separator) Join values of an array with a separator -* ``array`` (array) Array with values to join +* ``array`` (iterable) Array with values to join * ``separator`` (string, *optional*) A separator for the values **Return** (string) A string with the joined values separated by the separator @@ -119,16 +146,25 @@ Array.keys(array) Get the array keys -* ``array`` (array) The array +* ``array`` (iterable) The array **Return** (array) +Array.ksort(array) +^^^^^^^^^^^^^^^^^^ + +Sort an array by key + +* ``array`` (iterable) The array to sort + +**Return** (array) The sorted array + Array.last(array) ^^^^^^^^^^^^^^^^^ Get the last element of an array -* ``array`` (array) The array +* ``array`` (iterable) The array **Return** (mixed) @@ -137,7 +173,7 @@ Array.length(array) Get the length of an array -* ``array`` (array) The array +* ``array`` (iterable) The array **Return** (int) @@ -151,7 +187,7 @@ Examples:: Array.map([1, 2, 3, 4], x => x * x) Array.map([1, 2, 3, 4], (x, index) => x * index) -* ``array`` (array) Array of elements to map +* ``array`` (iterable) Array of elements to map * ``callback`` (callable) Callback to apply for each element, current value and key will be passed as arguments **Return** (array) The array with callback applied, keys will be preserved @@ -165,7 +201,7 @@ Note: This differs from the JavaScript behavior of Array.pop which will return t An empty array will result in an empty array again. -* ``array`` (array) +* ``array`` (iterable) **Return** (array) The array without the last element @@ -178,7 +214,7 @@ Allows to push multiple elements at once:: Array.push(array, e1, e2) -* ``array`` (array) +* ``array`` (iterable) * ``element`` (mixed) **Return** (array) The array with the inserted elements @@ -216,7 +252,7 @@ Examples:: Array.reduce([1, 2, 3, 4], (accumulator, currentValue) => accumulator + currentValue) // == 10 Array.reduce([1, 2, 3, 4], (accumulator, currentValue) => accumulator + currentValue, 1) // == 11 -* ``array`` (array) Array of elements to reduce to a value +* ``array`` (iterable) Array of elements to reduce to a value * ``callback`` (callable) Callback for accumulating values, accumulator, current value and key will be passed as arguments * ``initialValue`` (mixed, *optional*) Initial value, defaults to first item in array and callback starts with second entry @@ -227,7 +263,7 @@ Array.reverse(array) Returns an array in reverse order -* ``array`` (array) The array +* ``array`` (iterable) The array **Return** (array) @@ -236,7 +272,7 @@ Array.set(array, key, value) Set the specified key in the the array -* ``array`` (array) +* ``array`` (iterable) * ``key`` (string|integer) the key that should be set * ``value`` (mixed) the value to assign to the key @@ -251,7 +287,7 @@ Note: This differs from the JavaScript behavior of Array.shift which will return An empty array will result in an empty array again. -* ``array`` (array) +* ``array`` (iterable) **Return** (array) The array without the first element @@ -263,7 +299,7 @@ Shuffle an array Randomizes entries an array with the option to preserve the existing keys. When this option is set to false, all keys will be replaced -* ``array`` (array) +* ``array`` (iterable) * ``preserveKeys`` (bool, *optional*) Wether to preserve the keys when shuffling the array **Return** (array) The shuffled array @@ -273,7 +309,7 @@ Array.slice(array, begin, end) Extract a portion of an indexed array -* ``array`` (array) The array (with numeric indices) +* ``array`` (iterable) The array (with numeric indices) * ``begin`` (int) * ``end`` (int, *optional*) @@ -290,7 +326,7 @@ Example:: Array.some([1, 2, 3, 4], x => x % 2 == 0) // == true Array.some([1, 2, 3, 4], x => x > 4) // == false -* ``array`` (array) Array of elements to test +* ``array`` (iterable) Array of elements to test * ``callback`` (callable) Callback for testing elements, current value and key will be passed as arguments **Return** (bool) True if at least one element passed the test @@ -305,7 +341,7 @@ The sorting is done first by numbers, then by characters. Internally natsort() is used as it most closely resembles javascript's sort(). Because there are no real associative arrays in Javascript, keys of the array will be preserved. -* ``array`` (array) +* ``array`` (iterable) **Return** (array) The sorted array @@ -318,13 +354,22 @@ Allows to give multiple replacements at once:: Array.splice(array, 3, 2, 'a', 'b') -* ``array`` (array) +* ``array`` (iterable) * ``offset`` (int) Index of the first element to remove * ``length`` (int, *optional*) Number of elements to remove * ``replacements`` (mixed, *optional*) Elements to insert instead of the removed range **Return** (array) The array with removed and replaced elements +Array.unique(array) +^^^^^^^^^^^^^^^^^^^ + +Removes duplicate values from an array + +* ``array`` (iterable) The input array + +**Return** (array) The filtered array. + Array.unshift(array, element) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -334,7 +379,7 @@ Allows to insert multiple elements at once:: Array.unshift(array, e1, e2) -* ``array`` (array) +* ``array`` (iterable) * ``element`` (mixed) **Return** (array) The array with the inserted elements @@ -344,6 +389,29 @@ Allows to insert multiple elements at once:: +.. _`Eel Helpers Reference: BaseUri`: + +BaseUri +------- + +This is a purely internal helper to provide baseUris for Caching. +It will be moved to a more sensible package in the future so do +not rely on the classname for now. + +Implemented in: ``Neos\Fusion\Eel\BaseUriHelper`` + +BaseUri.getConfiguredBaseUriOrFallbackToCurrentRequest(fallbackRequest) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* ``fallbackRequest`` (ServerRequestInterface|null, *optional*) + +**Return** (UriInterface) + + + + + + .. _`Eel Helpers Reference: Configuration`: Configuration @@ -469,7 +537,7 @@ Date.formatCldr(date, cldrFormat, locale) Format a date to a string with a given cldr format * ``date`` (integer|string|\DateTime) -* ``cldrFormat`` (string) Format string in CLDR format (see http://cldr.unicode.org/translation/date-time-1/date-time) +* ``cldrFormat`` (string) Format string in CLDR format (see http://cldr.unicode.org/translation/date-time) * ``locale`` (null|string, *optional*) String locale - example (de|en|ru_RU) **Return** (string) @@ -571,6 +639,15 @@ Helper to read files. Implemented in: ``Neos\Eel\Helper\FileHelper`` +File.exists(filepath) +^^^^^^^^^^^^^^^^^^^^^ + +Check if the given file path exists + +* ``filepath`` (string) + +**Return** (bool) + File.fileInfo(filepath) ^^^^^^^^^^^^^^^^^^^^^^^ @@ -610,6 +687,91 @@ Get file information like creation and modification times as well as size. +.. _`Eel Helpers Reference: Form.Schema`: + +Form.Schema +----------- + + + +Implemented in: ``Neos\Fusion\Form\Runtime\Helper\SchemaHelper`` + +Form.Schema.array() +^^^^^^^^^^^^^^^^^^^ + +Create an array schema. + +**Return** (SchemaInterface) + +Form.Schema.arrayOf(schema) +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Create a date schema for an array by providing a schema for all items + +* ``schema`` (SchemaInterface) The schema for the items of the array + +**Return** (SchemaInterface) + +Form.Schema.boolean() +^^^^^^^^^^^^^^^^^^^^^ + +Create a boolean schema + +**Return** (SchemaInterface) + +Form.Schema.date(format) +^^^^^^^^^^^^^^^^^^^^^^^^ + +Create a date schema. The php value will be DateTime + +* ``format`` (string, *optional*) The format default is "Y-m-d + +**Return** (SchemaInterface) + +Form.Schema.float() +^^^^^^^^^^^^^^^^^^^ + +Create a float schema + +**Return** (SchemaInterface) + +Form.Schema.forType(type) +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Create a schema for the given type + +* ``type`` (string) The type or className that is expected + +**Return** (SchemaInterface) + +Form.Schema.integer() +^^^^^^^^^^^^^^^^^^^^^ + +Create a integer schema + +**Return** (SchemaInterface) + +Form.Schema.resource(collection) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Create a resource schema + +* ``collection`` (string, *optional*) The collection new resources are put into + +**Return** (SchemaInterface) + +Form.Schema.string() +^^^^^^^^^^^^^^^^^^^^ + +Create a string schema + +**Return** (SchemaInterface) + + + + + + .. _`Eel Helpers Reference: Json`: Json @@ -1128,7 +1290,7 @@ Implemented in: ``Neos\Neos\Fusion\Helper\LinkHelper`` Neos.Link.convertUriToObject(uri, contextNode) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* ``uri`` (string|Uri) +* ``uri`` (string|UriInterface) * ``contextNode`` (NodeInterface, *optional*) **Return** (NodeInterface|AssetInterface|NULL) @@ -1136,28 +1298,28 @@ Neos.Link.convertUriToObject(uri, contextNode) Neos.Link.getScheme(uri) ^^^^^^^^^^^^^^^^^^^^^^^^ -* ``uri`` (string|Uri) +* ``uri`` (string|UriInterface) **Return** (string) Neos.Link.hasSupportedScheme(uri) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* ``uri`` (string|Uri) +* ``uri`` (string|UriInterface) **Return** (boolean) Neos.Link.resolveAssetUri(uri) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* ``uri`` (string|Uri) +* ``uri`` (string|UriInterface) **Return** (string) Neos.Link.resolveNodeUri(uri, contextNode, controllerContext) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* ``uri`` (string|Uri) +* ``uri`` (string|UriInterface) * ``contextNode`` (NodeInterface) * ``controllerContext`` (ControllerContext) @@ -1245,6 +1407,37 @@ Render a human-readable description for the passed $dimensions +.. _`Eel Helpers Reference: Neos.Seo.Image`: + +Neos.Seo.Image +-------------- + + + +Implemented in: ``Neos\Seo\Fusion\Helper\ImageHelper`` + +Neos.Seo.Image.createThumbnail(asset, preset, width, maximumWidth, height, maximumHeight, allowCropping, allowUpScaling, async, quality, format) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +* ``asset`` (AssetInterface) +* ``preset`` (string, *optional*) Name of the preset that should be used as basis for the configuration +* ``width`` (integer, *optional*) Desired width of the image +* ``maximumWidth`` (integer, *optional*) Desired maximum width of the image +* ``height`` (integer, *optional*) Desired height of the image +* ``maximumHeight`` (integer, *optional*) Desired maximum height of the image +* ``allowCropping`` (boolean, *optional*) Whether the image should be cropped if the given sizes would hurt the aspect ratio +* ``allowUpScaling`` (boolean, *optional*) Whether the resulting image size might exceed the size of the original image +* ``async`` (boolean, *optional*) Whether the thumbnail can be generated asynchronously +* ``quality`` (integer, *optional*) Quality of the processed image +* ``format`` (string, *optional*) Format for the image, only jpg, jpeg, gif, png, wbmp, xbm, webp and bmp are supported. + +**Return** (null|ImageInterface) + + + + + + .. _`Eel Helpers Reference: Neos.Ui.Modules`: Neos.Ui.Modules @@ -1381,8 +1574,10 @@ Implemented in: ``Neos\Neos\Ui\Fusion\Helper\NodeInfoHelper`` NodeInfo.createRedirectToNode(controllerContext, node) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Creates a URL that will redirect to the given $node in live or base workspace, or returns an empty string if that doesn't exist or is inaccessible + * ``controllerContext`` (ControllerContext) -* ``node`` (NodeInterface, *optional*) +* ``node`` (NodeInterface|null, *optional*) **Return** (string) @@ -1785,19 +1980,21 @@ Example:: **Return** (array) The matches as array or NULL if not matched -String.pregReplace(string, pattern, replace) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +String.pregReplace(string, pattern, replace, limit) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Replace occurrences of a search string inside the string using regular expression matching (PREG style) Examples:: String.pregReplace("Some.String with sp:cial characters", "/[[:^alnum:]]/", "-") == "Some-String-with-sp-cial-characters" + String.pregReplace("Some.String with sp:cial characters", "/[[:^alnum:]]/", "-", 1) == "Some-String with sp:cial characters" String.pregReplace("2016-08-31", "/([0-9]+)-([0-9]+)-([0-9]+)/", "$3.$2.$1") == "31.08.2016" * ``string`` (string) The input string * ``pattern`` (string) A PREG pattern * ``replace`` (string) A replacement string, can contain references to capture groups with "\\n" or "$n +* ``limit`` (integer, *optional*) The maximum possible replacements for each pattern in each subject string. Defaults to -1 (no limit). **Return** (string) The string with all occurrences replaced @@ -2074,7 +2271,7 @@ translated label. * ``quantity`` (mixed, *optional*) A number to find plural form for (float or int), NULL to not use plural forms * ``locale`` (string, *optional*) An identifier of locale to use (NULL for use the default locale) -**Return** (string) Translated label or source label / ID key +**Return** (string|null) Translated label or source label / ID key Translation.value(value) ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/Neos.Neos/Documentation/References/FlowQueryOperationReference.rst b/Neos.Neos/Documentation/References/FlowQueryOperationReference.rst index b01849a4d76..762161e6ac3 100644 --- a/Neos.Neos/Documentation/References/FlowQueryOperationReference.rst +++ b/Neos.Neos/Documentation/References/FlowQueryOperationReference.rst @@ -3,7 +3,7 @@ FlowQuery Operation Reference ============================= -This reference was automatically generated from code on 2019-03-05 +This reference was automatically generated from code on 2021-05-30 .. _`FlowQuery Operation Reference: add`: @@ -209,7 +209,7 @@ nodes. It will not evaluate any elements that are not instances of the The implementation changes the behavior of the `instanceof` operator to work on node types instead of PHP object types, so that:: - [instanceof Neos.NodeTypes:Page] + [instanceof Acme.Com:Page] will in fact use `isOfType()` on the `NodeType` of context elements to filter. This filter allow also to filter the current context by a given @@ -250,15 +250,19 @@ Example (identifier): Example (node type): - q(node).find('[instanceof Neos.NodeTypes:Text]') + q(node).find('[instanceof Acme.Com:Text]') Example (multiple node types): - q(node).find('[instanceof Neos.NodeTypes:Text],[instanceof Neos.NodeTypes:Image]') + q(node).find('[instanceof Acme.Com:Text],[instanceof Acme.Com:Image]') Example (node type with filter): - q(node).find('[instanceof Neos.NodeTypes:Text][text*="Neos"]') + q(node).find('[instanceof Acme.Com:Text][text*="Neos"]') + +This operation operates rather on the given Context object than on the given node +and thus may work with the legacy node interface until subgraphs are available +{@inheritdoc} :Implementation: Neos\\ContentRepository\\Eel\\FlowQueryOperations\\FindOperation :Priority: 100 @@ -727,7 +731,7 @@ Second argument is the sort direction (ASC or DESC). :Implementation: Neos\\Neos\\Eel\\FlowQueryOperations\\SortOperation :Priority: 1 :Final: No -:Returns: mixed +:Returns: void diff --git a/Neos.Neos/Resources/Private/Translations/af/Main.xlf b/Neos.Neos/Resources/Private/Translations/af/Main.xlf index 40050199e60..8b36f61c544 100644 --- a/Neos.Neos/Resources/Private/Translations/af/Main.xlf +++ b/Neos.Neos/Resources/Private/Translations/af/Main.xlf @@ -5,97 +5,102 @@ Auto-Publish - Auto-Publish + Outo-publiseer Auto-Publish to {0} - Auto-Publish to {0} + Outo-publiseer aan {0} Review changes - Review changes + wysigings hersien Apply - Apply + toepas Apply changes - Apply changes + Pas veranderinge toe Cancel - Cancel + Kanselleer Back Back Choose - Choose + Kies Type to search - Type to search + Tik om te soek Content - Content + Inhoud Node - Node + +Knooppunt Content View - Content View + +inhoudskyk Create after - Create after + Skep na Create new - Create new + Skep 'n nuwe Close - Close + +Naby Copy - Copy + +Kopieer Cut - Cut + Sny Delete - Delete + verwyder Yes, delete the element - Yes, delete the element + Ja, verwyder die element Delete the element - Delete the element + verwyder die element Discard - Discard + weggooi Discard changes - Discard changes + Ignoreer veranderinge Edit title - Edit title + Wysig titel Edit / Preview - Edit / Preview + Wysig / Voorskou Edit - Edit + Wysig Hide / Unhide - Hide / Unhide + Versteek / onthul Hide Hide Unhide - Unhide + +onthul into - into + in before - before + voor after - after + Na Loading Loading @@ -444,7 +449,7 @@ Throw away Apply - Apply + toepas Select a Plugin Select a Plugin @@ -567,7 +572,7 @@ Create and copy Content - Content + Inhoud Toggle menu group Toggle menu group @@ -808,7 +813,7 @@ Indent Create new - Create new + Skep 'n nuwe No matches found No matches found diff --git a/Neos.Neos/Resources/Private/Translations/af/Modules.xlf b/Neos.Neos/Resources/Private/Translations/af/Modules.xlf index 337ef80ad7d..2008b17200c 100644 --- a/Neos.Neos/Resources/Private/Translations/af/Modules.xlf +++ b/Neos.Neos/Resources/Private/Translations/af/Modules.xlf @@ -7,7 +7,7 @@ Back Cancel - Cancel + Kanselleer Management @@ -228,28 +228,33 @@ There have not been recorded any events yet which could be displayed in this history. {0} created the {1} "{2}". - {0} created the {1} "{2}". + {0} het die {1} "{2}" geskep. {0} removed the {1} "{2}". - {0} removed the {1} "{2}". + +{0} het die {1} "{2}" verwyder. {0} created the variant {1} of the {2} "{3}". - {0} created the variant {1} of the {2} "{3}". + +{0} het die variant {1} van die {2} "{3}" geskep. {0} modified the {1} "{2}". - {0} modified the {1} "{2}". + {0} het die {1} "{2}" verander. {0} moved the {1} "{2}". - {0} moved the {1} "{2}". + {0} het die {1} "{2}" geskuif. {0} copied the {1} "{2}". - {0} copied the {1} "{2}". + +{0} het die {1} "{2}" gekopieër. {0} renamed the {1} "{2}" to "{3}". - {0} renamed the {1} "{2}" to "{3}". + +{0} het die {1} "{2}" herdoop tot "{3}". {0} modified content on the {1} "{2}". - {0} modified content on the {1} "{2}". + +{0} inhoud gewysig op die {1} "{2}". {0} created a new user "{1}" for {2}. {0} created a new user "{1}" for {2}. @@ -286,7 +291,7 @@ New Edit - Edit + Wysig Edit account Edit account @@ -690,10 +695,10 @@ Click on one of the nodes to only see its fallbacks and variants. Click again to This module allows you to customize your backend user profile. Here you can change your active system language, name and email address. You may also configure other general features in the system. Edit - Edit + Wysig Edit - Edit + Wysig New electronic address New electronic address diff --git a/Neos.Neos/Resources/Private/Translations/af/NodeTypes/Content.xlf b/Neos.Neos/Resources/Private/Translations/af/NodeTypes/Content.xlf index fac2ffc3116..cbf4be69df2 100644 --- a/Neos.Neos/Resources/Private/Translations/af/NodeTypes/Content.xlf +++ b/Neos.Neos/Resources/Private/Translations/af/NodeTypes/Content.xlf @@ -4,7 +4,7 @@ Content - Content + Inhoud Change type Change type diff --git a/Neos.Neos/Resources/Private/Translations/tl_PH/Main.xlf b/Neos.Neos/Resources/Private/Translations/tl_PH/Main.xlf index e91f60352c6..b12a9771ceb 100644 --- a/Neos.Neos/Resources/Private/Translations/tl_PH/Main.xlf +++ b/Neos.Neos/Resources/Private/Translations/tl_PH/Main.xlf @@ -653,7 +653,7 @@ Pagpapatunay Logout - Logout + Mag-logout The entered username or password was wrong Ang na-enter na username o password ay mali diff --git a/Neos.NodeTypes.ContentReferences/Resources/Private/Fusion/Root.fusion b/Neos.NodeTypes.ContentReferences/Resources/Private/Fusion/Root.fusion index 5623416c742..5bbb7a22fb4 100644 --- a/Neos.NodeTypes.ContentReferences/Resources/Private/Fusion/Root.fusion +++ b/Neos.NodeTypes.ContentReferences/Resources/Private/Fusion/Root.fusion @@ -7,6 +7,7 @@ prototype(Neos.NodeTypes.ContentReferences:ContentReferences) < prototype(Neos.N itemRenderer = Neos.Neos:ContentCase itemName = 'node' } + hasReferences = ${!!referenceNodesArray} @cache { mode = 'cached' entryIdentifier { diff --git a/Neos.NodeTypes.ContentReferences/Resources/Private/Templates/NodeTypes/ContentReferences.html b/Neos.NodeTypes.ContentReferences/Resources/Private/Templates/NodeTypes/ContentReferences.html index 10924413479..68f589081f7 100644 --- a/Neos.NodeTypes.ContentReferences/Resources/Private/Templates/NodeTypes/ContentReferences.html +++ b/Neos.NodeTypes.ContentReferences/Resources/Private/Templates/NodeTypes/ContentReferences.html @@ -1,5 +1,5 @@ {namespace neos=Neos\Neos\ViewHelpers} - + f:format.raw()}> {referenceNodes -> f:format.raw()}