contao-community-alliance / dc-general

Universal data container for Contao!
https://dc-general.readthedocs.io/de/latest/
GNU Lesser General Public License v3.0
16 stars 21 forks source link

Fatal Error when using Tree Picker for relations in MetaModels 2.1 #430

Closed bezin closed 1 year ago

bezin commented 6 years ago

Hi folks,

we have an issue with the tree picker in MetaModels:

MetaModels – We have a MM Events and a MM Tickets. – Tickets are selected in a single Event via the popup picker widget.

User rights We have two user groups: Editors and Supervisors. Supervisors can edit tickets and events, Editors can only edit events.

Issue When we use the default checkboxes for selecting tickets in the event edit screen, everything works fine (regarding this issue).

If we use the TreePicker, the editor gets the following error message:

Type error: Argument 3 passed to MetaModels\DcGeneral\Events\MetaModel\BuildMetaModelOperationsEvent::__construct() must be of the type array, null given, called in /usr/projects/[...]/htdocs/vendor/metamodels/core/src/CoreBundle/EventListener/DcGeneral/DefinitionBuilder/CommandBuilder.php on line 162

In debug mode, we get the following error message and stack trace:

Symfony\Component\Debug\Exception\ContextErrorException:
Warning: Invalid argument supplied for foreach()

  at vendor/metamodels/core/src/CoreBundle/EventListener/DcGeneral/DefinitionBuilder/Contao2BackendViewDefinitionBuilder.php:204
  at MetaModels\CoreBundle\EventListener\DcGeneral\DefinitionBuilder\Contao2BackendViewDefinitionBuilder->parseListSorting(object(DefaultListingConfig))
     (vendor/metamodels/core/src/CoreBundle/EventListener/DcGeneral/DefinitionBuilder/Contao2BackendViewDefinitionBuilder.php:188)
  at MetaModels\CoreBundle\EventListener\DcGeneral\DefinitionBuilder\Contao2BackendViewDefinitionBuilder->parseListing()
     (vendor/metamodels/core/src/CoreBundle/EventListener/DcGeneral/DefinitionBuilder/Contao2BackendViewDefinitionBuilder.php:137)
  at MetaModels\CoreBundle\EventListener\DcGeneral\DefinitionBuilder\Contao2BackendViewDefinitionBuilder->build(object(MetaModelDataDefinition))
     (vendor/metamodels/core/src/CoreBundle/EventListener/DcGeneral/DefinitionBuilder/MetaModelDefinitionBuilderTrait.php:43)
  at MetaModels\CoreBundle\EventListener\DcGeneral\DefinitionBuilder\Contao2BackendViewDefinitionBuilder->handle(object(BuildDataDefinitionEvent), 'dc-general.factory.build-data-definition', object(TraceableEventDispatcher))
     (vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/Debug/WrappedListener.php:104)
  at Symfony\Component\EventDispatcher\Debug\WrappedListener->__invoke(object(BuildDataDefinitionEvent), 'dc-general.factory.build-data-definition', object(ContainerAwareEventDispatcher))
     (vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/EventDispatcher.php:212)
  at Symfony\Component\EventDispatcher\EventDispatcher->doDispatch(array(object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener)), 'dc-general.factory.build-data-definition', object(BuildDataDefinitionEvent))
     (vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/EventDispatcher.php:44)
  at Symfony\Component\EventDispatcher\EventDispatcher->dispatch('dc-general.factory.build-data-definition', object(BuildDataDefinitionEvent))
     (vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php:139)
  at Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher->dispatch('dc-general.factory.build-data-definition', object(BuildDataDefinitionEvent))
     (vendor/contao-community-alliance/dc-general/src/Factory/DcGeneralFactory.php:392)
  at ContaoCommunityAlliance\DcGeneral\Factory\DcGeneralFactory->createContainer()
     (vendor/contao-community-alliance/dc-general/src/Factory/DcGeneralFactory.php:339)
  at ContaoCommunityAlliance\DcGeneral\Factory\DcGeneralFactory->createEnvironment()
     (vendor/contao-community-alliance/dc-general/src/Factory/DcGeneralFactory.php:301)
  at ContaoCommunityAlliance\DcGeneral\Factory\DcGeneralFactory->createDcGeneral()
     (vendor/contao-community-alliance/dc-general/src/Contao/View/Contao2BackendView/TreePicker.php:238)
  at ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\TreePicker->setUp(object(DcCompat))
     (vendor/contao-community-alliance/dc-general/src/Contao/View/Contao2BackendView/TreePicker.php:195)
  at ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\TreePicker->__construct(array('sourceName' => 'mm_ticket', 'fieldType' => 'checkbox', 'idProperty' => 'id', 'orderName' => 'tickets', 'orderField' => 'tickets', 'minLevel' => '0', 'maxLevel' => '0', 'pickerOrderProperty' => 'sorting', 'pickerSortDirection' => 'ASC', 'includeBlankOption' => true, 'multiple' => true, 'required' => false, 'id' => 'tickets', 'name' => 'tickets', 'strField' => 'tickets', 'strTable' => 'mm_event', 'label' => 'Ticketlabel', 'description' => 'Benötigte(s) Ticket(s) für diese Veranstaltung', 'type' => 'DcGeneralTreePicker', 'dataContainer' => object(DcCompat), 'allowHtml' => false, 'options' => array(array('value' => 7, 'label' => 'Ticketlabel'), array('value' => 5, 'label' => 'Ticketlabel'), array('value' => 6, 'label' => 'Ticketlabel'), array('value' => 9, 'label' => 'Ticketlabel'), array('value' => 10, 'label' => 'Ticketlabel'), array('value' => 11, 'label' => 'Ticketlabel'), array('value' => 12, 'label' => 'Ticketlabel')), 'value' => array()), object(DcCompat))
     (vendor/contao-community-alliance/dc-general/src/Contao/View/Contao2BackendView/Subscriber/WidgetBuilder.php:473)
  at ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\Subscriber\WidgetBuilder->buildWidget(object(DefaultProperty), object(Model))
     (vendor/contao-community-alliance/dc-general/src/Contao/View/Contao2BackendView/Subscriber/WidgetBuilder.php:110)
  at ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\Subscriber\WidgetBuilder->handleEvent(object(BuildWidgetEvent), 'dc-general.view.contao2backend.build-widget', object(TraceableEventDispatcher))
     (vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/Debug/WrappedListener.php:104)
  at Symfony\Component\EventDispatcher\Debug\WrappedListener->__invoke(object(BuildWidgetEvent), 'dc-general.view.contao2backend.build-widget', object(ContainerAwareEventDispatcher))
     (vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/EventDispatcher.php:212)
  at Symfony\Component\EventDispatcher\EventDispatcher->doDispatch(array(object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener)), 'dc-general.view.contao2backend.build-widget', object(BuildWidgetEvent))
     (vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/EventDispatcher.php:44)
  at Symfony\Component\EventDispatcher\EventDispatcher->dispatch('dc-general.view.contao2backend.build-widget', object(BuildWidgetEvent))
     (vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php:139)
  at Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher->dispatch('dc-general.view.contao2backend.build-widget', object(BuildWidgetEvent))
     (vendor/contao-community-alliance/dc-general/src/Contao/View/Contao2BackendView/ContaoWidgetManager.php:263)
  at ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\ContaoWidgetManager->getWidget('tickets', null)
     (vendor/contao-community-alliance/dc-general/src/Contao/View/Contao2BackendView/ContaoWidgetManager.php:354)
  at ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\ContaoWidgetManager->renderWidget('tickets', false, null)
     (vendor/contao-community-alliance/dc-general/src/Contao/View/Contao2BackendView/EditMask.php:486)
  at ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\EditMask->buildFieldSet(object(ContaoWidgetManager), object(Palette), null)
     (vendor/contao-community-alliance/dc-general/src/Contao/View/Contao2BackendView/EditMask.php:797)
  at ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\EditMask->execute()
     (vendor/contao-community-alliance/dc-general/src/Contao/View/Contao2BackendView/ActionHandler/CreateHandler.php:145)
  at ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\ActionHandler\CreateHandler->process(object(DefaultEnvironment))
     (vendor/contao-community-alliance/dc-general/src/Contao/View/Contao2BackendView/ActionHandler/CreateHandler.php:93)
  at ContaoCommunityAlliance\DcGeneral\Contao\View\Contao2BackendView\ActionHandler\CreateHandler->handleEvent(object(ActionEvent), 'dc-general.action', object(TraceableEventDispatcher))
     (vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/Debug/WrappedListener.php:104)
  at Symfony\Component\EventDispatcher\Debug\WrappedListener->__invoke(object(ActionEvent), 'dc-general.action', object(ContainerAwareEventDispatcher))
     (vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/EventDispatcher.php:212)
  at Symfony\Component\EventDispatcher\EventDispatcher->doDispatch(array(object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener), object(WrappedListener)), 'dc-general.action', object(ActionEvent))
     (vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/EventDispatcher.php:44)
  at Symfony\Component\EventDispatcher\EventDispatcher->dispatch('dc-general.action', object(ActionEvent))
     (vendor/symfony/symfony/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php:139)
  at Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher->dispatch('dc-general.action', object(ActionEvent))
     (vendor/contao-community-alliance/dc-general/src/Controller/DefaultController.php:153)
  at ContaoCommunityAlliance\DcGeneral\Controller\DefaultController->handle(object(Action))
     (vendor/metamodels/core/src/BackendIntegration/Module.php:75)
  at MetaModels\BackendIntegration\Module->generate()
     (vendor/contao/core-bundle/src/Resources/contao/classes/Backend.php:421)
  at Contao\Backend->getBackendModule('metamodel_mm_event', null)
     (vendor/contao/core-bundle/src/Resources/contao/controllers/BackendMain.php:132)
  at Contao\BackendMain->run()
     (vendor/contao/core-bundle/src/Controller/BackendController.php:55)
  at Contao\CoreBundle\Controller\BackendController->mainAction()
     (vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:151)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
     (vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:68)
  at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
     (vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php:200)
  at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
     (web/app_dev.php:66)

This only happens with those attributes that are selected via Popup Picker widget as there are three other relations that are selected via select menu or checkbox.

This issue can be fixed, if the editor gets access to the Tickets meta model as well. However, this was not necessary before. Might this be caused by cached values for the input screens and access rights?

If this is the desired behaviour, the user should see an "Access denied" message rather than a fatal error.

Environment

Contao 4.4.23 PHP 7.2.6 MetaModels dev/feature-contao4

Please ask for any missing information.

Cheerio

zonky2 commented 1 year ago

Check in MM 2.3:

=> Auswahl per Popup war möglich und wurde auch gespeichert - man konne aber nicht sehen, was zur Auswahl stand, da die Labels ausgebeldnet waren => Sprachen für Redakteure sichtbar gemacht aber alle Cechboxen für Anlegen, bearbeiten, Löschen aus => Labels sichtbar...

der usecase sollte damit möglich sein