Giter Site home page Giter Site logo

flowpack.neos.assetusage's People

Contributors

ahaeslich avatar andrehoffmann30 avatar crydotsnake avatar jonnitto avatar sebobo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

flowpack.neos.assetusage's Issues

Many usages are not tracked

Looking at the code, only assets used in actual asset properties are added to the usage index.
Properties of type array<Neos\Media\Domain\Model\ImageInterface> or CustomAssetType are ignored.

More importantly, assets referenced in string properties (via asset://<uuid>) are ignored as well.

The original \Neos\Neos\Domain\Strategy\AssetUsageInNodePropertiesStrategy does that more reliably.

I would suggest to use the original mechanism to determine usages (using \Neos\ContentRepository\Domain\Repository\NodeDataRepository::findNodesByPathPrefixAndRelatedEntities()) if that's not too slow

Usage is not updated correctly when deleting node with reference

Got this feedback from a customer:

When deleting an item, the usages are displayed incorrectly for documents in Media Management.

Procedure:

  1. Create new article
  2. Insert new image
  3. Insert new document in download area
  4. Publish article
  5. Check media management --> usage is displayed correctly - 1x in usage in new article
  6. Delete article
  7. Publish changes
  8. article is deleted and not findable --> correct behavior
  9. Control Media Management --> Usage is not displayed correctly - new says 2x in use and on control displays location with cryptic letter number sequence and "Private Workspace".

Can't publish because $targetPropertyValue was null

I can't publish a node because the $targetPropertyValue was null

Exception in line 146 of /tmp/Production/SubContextDocker/Cache/Code/Flow_Object_Classes/Neos_Flow_Persistence_Doctrine_PersistenceManager.php: property_exists(): Argument #1 ($object_or_class) must be of type object|string, null given

80 property_exists(NULL, "Persistence_Object_Identifier")
79 Neos\Flow\Persistence\Doctrine\PersistenceManager_Original::getIdentifierByObject(NULL)
78 Flowpack\Neos\AssetUsage\Service\AssetIntegrationService_Original::resolveOriginalAssetIdentifier(NULL)
77 Flowpack\Neos\AssetUsage\Service\AssetIntegrationService_Original::unregisterUsageInNode(Neos\ContentRepository\Domain\Model\Node, NULL, false)
76 Flowpack\Neos\AssetUsage\Service\AssetIntegrationService_Original::beforeNodePublishing(Neos\ContentRepository\Domain\Model\Node, Neos\Flow\Persistence\Doctrine\Proxies\__CG__\Neos\ContentRepository\Domain\Model\Workspace, "Neos\ContentRepository\Domain\Model\Workspace::beforeNodePublishing")
75 call_user_func_array(array|2|, array|3|)
74 Neos\Flow\SignalSlot\Dispatcher::dispatch("Neos\ContentRepository\Domain\Model\Workspace", "beforeNodePublishing", array|2|)
73 Neos\Flow\SignalSlot\SignalAspect_Original::forwardSignalToDispatcher(Neos\Flow\Aop\JoinPoint)
72 Neos\Flow\Aop\Advice\AbstractAdvice::invoke(Neos\Flow\Aop\JoinPoint)
71 Neos\ContentRepository\Domain\Model\Workspace::emitBeforeNodePublishing(Neos\ContentRepository\Domain\Model\Node, Neos\Flow\Persistence\Doctrine\Proxies\__CG__\Neos\ContentRepository\Domain\Model\Workspace)
70 Neos\ContentRepository\Domain\Model\Workspace_Original::publishNode(Neos\ContentRepository\Domain\Model\Node, Neos\Flow\Persistence\Doctrine\Proxies\__CG__\Neos\ContentRepository\Domain\Model\Workspace)
69 Neos\ContentRepository\Domain\Model\Workspace::publishNode(Neos\ContentRepository\Domain\Model\Node, Neos\Flow\Persistence\Doctrine\Proxies\__CG__\Neos\ContentRepository\Domain\Model\Workspace)
68 Neos\ContentRepository\Domain\Model\Workspace::Flow_Aop_Proxy_invokeJoinPoint(Neos\Flow\Aop\JoinPoint)
67 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
66 Neos\Flow\Security\Aspect\PolicyEnforcementAspect_Original::enforcePolicy(Neos\Flow\Aop\JoinPoint)
65 Neos\Flow\Aop\Advice\AroundAdvice::invoke(Neos\Flow\Aop\JoinPoint)
64 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
63 Neos\ContentRepository\Domain\Model\Workspace::publishNode(Neos\ContentRepository\Domain\Model\Node, Neos\Flow\Persistence\Doctrine\Proxies\__CG__\Neos\ContentRepository\Domain\Model\Workspace)
62 Neos\ContentRepository\Domain\Model\Workspace_Original::publishNodes(array|1|, Neos\Flow\Persistence\Doctrine\Proxies\__CG__\Neos\ContentRepository\Domain\Model\Workspace)
61 Neos\ContentRepository\Domain\Model\Workspace::publishNodes(array|1|, Neos\Flow\Persistence\Doctrine\Proxies\__CG__\Neos\ContentRepository\Domain\Model\Workspace)
60 Neos\ContentRepository\Domain\Model\Workspace::Flow_Aop_Proxy_invokeJoinPoint(Neos\Flow\Aop\JoinPoint)
59 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
58 Neos\Flow\Security\Aspect\PolicyEnforcementAspect_Original::enforcePolicy(Neos\Flow\Aop\JoinPoint)
57 Neos\Flow\Aop\Advice\AroundAdvice::invoke(Neos\Flow\Aop\JoinPoint)
56 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
55 Neos\ContentRepository\Domain\Model\Workspace::publishNodes(array|1|, Neos\Flow\Persistence\Doctrine\Proxies\__CG__\Neos\ContentRepository\Domain\Model\Workspace)
54 Neos\Neos\Service\PublishingService_Original::publishNode(Neos\ContentRepository\Domain\Model\Node)
53 Neos\Flow\ObjectManagement\DependencyInjection\DependencyProxy::__call("publishNode", array|1|)
52 Neos\Neos\Controller\Module\Management\WorkspacesController_Original::publishNodeAction(Neos\ContentRepository\Domain\Model\Node, Neos\ContentRepository\Domain\Model\Workspace)
51 Neos\Neos\Controller\Module\Management\WorkspacesController::publishNodeAction(Neos\ContentRepository\Domain\Model\Node, Neos\ContentRepository\Domain\Model\Workspace)
50 Neos\Neos\Controller\Module\Management\WorkspacesController::Flow_Aop_Proxy_invokeJoinPoint(Neos\Flow\Aop\JoinPoint)
49 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
48 Neos\Flow\Security\Aspect\PolicyEnforcementAspect_Original::enforcePolicy(Neos\Flow\Aop\JoinPoint)
47 Neos\Flow\Aop\Advice\AroundAdvice::invoke(Neos\Flow\Aop\JoinPoint)
46 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
45 Neos\Neos\Controller\Module\Management\WorkspacesController::publishNodeAction(Neos\ContentRepository\Domain\Model\Node, Neos\ContentRepository\Domain\Model\Workspace)
44 Neos\Flow\Mvc\Controller\ActionController_Original::callActionMethod()
43 Neos\Flow\Mvc\Controller\ActionController_Original::processRequest(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
42 Neos\Flow\Mvc\Dispatcher_Original::initiateDispatchLoop(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
41 Neos\Flow\Mvc\Dispatcher_Original::dispatch(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
40 Neos\Neos\Controller\Backend\ModuleController_Original::indexAction(array|3|)
39 Neos\Neos\Controller\Backend\ModuleController::indexAction(array|3|)
38 Neos\Neos\Controller\Backend\ModuleController::Flow_Aop_Proxy_invokeJoinPoint(Neos\Flow\Aop\JoinPoint)
37 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
36 Neos\Flow\Security\Aspect\PolicyEnforcementAspect_Original::enforcePolicy(Neos\Flow\Aop\JoinPoint)
35 Neos\Flow\Aop\Advice\AroundAdvice::invoke(Neos\Flow\Aop\JoinPoint)
34 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
33 Neos\Neos\Controller\Backend\ModuleController::indexAction(array|3|)
32 Neos\Flow\Mvc\Controller\ActionController_Original::callActionMethod()
31 Neos\Flow\Mvc\Controller\ActionController_Original::processRequest(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
30 Neos\Flow\Mvc\Dispatcher_Original::initiateDispatchLoop(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
29 Neos\Flow\Mvc\Dispatcher_Original::dispatch(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
28 Neos\Flow\Mvc\DispatchMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
27 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
26 Sitegeist\Slipstream\Middleware\SlipstreamMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
25 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
24 Neos\Flow\Http\Middleware\SecurityEntryPointMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
23 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
22 Neos\Flow\Http\Middleware\RequestBodyParsingMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
21 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
20 Neos\Flow\Mvc\FlashMessage\FlashMessageMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
19 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
18 Neos\Flow\Http\Middleware\PoweredByMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
17 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
16 Neos\RedirectHandler\RedirectMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
15 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
14 Neos\Flow\Mvc\Routing\RoutingMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
13 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
12 Neos\Neos\Routing\RequestUriHostMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
11 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
10 Neos\FluidAdaptor\Core\Widget\AjaxWidgetMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
9 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
8 Neos\Flow\Http\Middleware\SessionMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
7 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
6 Neos\Flow\Http\Middleware\TrustedProxiesMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
5 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
4 Neos\Flow\Http\Middleware\StandardsComplianceMiddleware_Original::process(GuzzleHttp\Psr7\ServerRequest, Neos\Flow\Http\Middleware\MiddlewaresChain)
3 Neos\Flow\Http\Middleware\MiddlewaresChain_Original::handle(GuzzleHttp\Psr7\ServerRequest)
2 Neos\Flow\Http\RequestHandler::handleRequest()
1 Neos\Flow\Core\Bootstrap::run()

FEATURE: Exclude node types from usage count

UseCase:

If you are using neos/metadata-contentrepositoryadapter to add custom metadata information, all assets will at least have one usage count. That's because the metadata node type has a property linked to the asset. See: NodeTypes.AbstractMetaData.yaml

Possible Solution:

  • Add configuration for exclusion of node types
  • Check configuration in getAssetPropertyNamesForNodeType and return empty property array if an excluded node type is processed

public function getAssetPropertyNamesForNodeType(NodeType $nodeType): array
{
if (array_key_exists($nodeType->getName(), $this->assetPropertiesByNodeType)) {
return $this->assetPropertiesByNodeType[$nodeType->getName()];
}
$propertyNames = array_reduce(array_keys($nodeType->getProperties()),
function ($carry, $propertyName) use ($nodeType) {
if ($this->propertyTypeCanBeRegistered($nodeType->getPropertyType($propertyName))) {
$carry[] = $propertyName;
}
return $carry;
}, []);
$this->assetPropertiesByNodeType[$nodeType->getName()] = $propertyNames;
return $propertyNames;
}

Allow Neos 8

The newest Version of Neos is currently not supported

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.