1

I am working with Magento 2.3.5 community edition. I am facing this issues

Element 'block', attribute 'display': The attribute 'display' is not allowed in ..

on magento frontend when I am in 'Developer' mode. If I change my mode from 'developer' to 'Production' the frontend is loading fine with out any issue. I just want to know Why this issue is showing only in developer mode. If the issue really exists then it should shown on production mode also right ? because all the files are same for developer mode and production mode. Can you Please suggest me the solution to fix this issue. Thanks in advance.

This is complete error:
1 exception(s): Exception #0 (Magento\Framework\Config\Dom\ValidationException): Element 'block', attribute 'display': The attribute 'display' is not allowed. Line: 105

Exception #0 (Magento\Framework\Config\Dom\ValidationException): Element 'block', attribute 'display': The attribute 'display' is not allowed. Line: 105

#1 Magento\Framework\Config\Dom->__construct('createObject('Magento\Framewor...', array('create('Magento\Framewor...', array('xml' => ' '/home/qaepreserv...', 'validationState' => &Magento\Framework\App\Arguments\ValidationState#000000003e1c7fac00000000115e8812#)) called at [vendor/magento/framework/ObjectManager/ObjectManager.php:56]
#4 Magento\Framework\ObjectManager\ObjectManager->create('Magento\Framewor...', array('xml' => ' '/home/qaepreserv...', 'validationState' => &Magento\Framework\App\Arguments\ValidationState#000000003e1c7fac00000000115e8812#)) called at [vendor/magento/framework/Config/DomFactory.php:43]
#5 Magento\Framework\Config\DomFactory->createDom(array('xml' => ' '/home/qaepreserv...', 'validationState' => &Magento\Framework\App\Arguments\ValidationState#000000003e1c7fac00000000115e8812#)) called at [vendor/magento/framework/View/Model/Layout/Update/Validator.php:141]
#6 Magento\Framework\View\Model\Layout\Update\Validator->isValid('_validateMergedLayout('LAYOUT_frontend_...', '\n   load(array()) called at [generated/code/Magento/Framework/View/Model/Layout/Merge/Interceptor.php:206]
#9 Magento\Framework\View\Model\Layout\Merge\Interceptor->load() called at [vendor/magento/framework/View/Layout/Builder.php:86]
#10 Magento\Framework\View\Layout\Builder->loadLayoutUpdates() called at [vendor/magento/framework/View/Layout/Builder.php:63]
#11 Magento\Framework\View\Layout\Builder->build() called at [vendor/magento/framework/View/Layout.php:259]
#12 Magento\Framework\View\Layout->build() called at [vendor/magento/framework/View/Layout.php:884]
#13 Magento\Framework\View\Layout->getBlock('page_content_hea...') called at [generated/code/Magento/Framework/View/Layout/Interceptor.php:414]
#14 Magento\Framework\View\Layout\Interceptor->getBlock('page_content_hea...') called at [vendor/magento/module-cms/Helper/Page.php:215]
#15 Magento\Cms\Helper\Page->prepareResultPage(&Magento\Cms\Controller\Index\Index\Interceptor#000000003e1c7ce200000000115e8812#, 'home-page-v15') called at [vendor/magento/module-cms/Controller/Index/Index.php:74]
#16 Magento\Cms\Controller\Index\Index->execute(NULL) called at [generated/code/Magento/Cms/Controller/Index/Index/Interceptor.php:24]
#17 Magento\Cms\Controller\Index\Index\Interceptor->execute() called at [vendor/magento/framework/App/Action/Action.php:108]
#18 Magento\Framework\App\Action\Action->dispatch(&Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#) called at [vendor/magento/framework/Interception/Interceptor.php:58]
#19 Magento\Cms\Controller\Index\Index\Interceptor->___callParent('dispatch', array(&Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#)) called at [vendor/magento/framework/Interception/Interceptor.php:138]
#20 Magento\Cms\Controller\Index\Index\Interceptor->Magento\Framework\Interception\{closure}(&Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#) called at [vendor/magento/framework/Interception/Interceptor.php:153]
#21 Magento\Cms\Controller\Index\Index\Interceptor->___callPlugins('dispatch', array(&Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#), array(array('designLoader', 'customerNotifica...', 'catalog_app_acti...', 'tax-app-action-d...', 'weee-app-action-...', 'storeCheck', 'contextPlugin', 'customer-app-act...'))) called at [generated/code/Magento/Cms/Controller/Index/Index/Interceptor.php:39]
#22 Magento\Cms\Controller\Index\Index\Interceptor->dispatch(&Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#) called at [vendor/magento/framework/App/FrontController.php:162]
#23 Magento\Framework\App\FrontController->processRequest(&Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#, &Magento\Cms\Controller\Index\Index\Interceptor#000000003e1c7ce200000000115e8812#) called at [vendor/magento/framework/App/FrontController.php:98]
#24 Magento\Framework\App\FrontController->dispatch(&Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#) called at [vendor/magento/framework/Interception/Interceptor.php:58]
#25 Magento\Framework\App\FrontController\Interceptor->___callParent('dispatch', array(&Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#)) called at [vendor/magento/framework/Interception/Interceptor.php:138]
#26 Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(&Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#) called at [vendor/magento/module-store/App/FrontController/Plugin/RequestPreprocessor.php:99]
#27 Magento\Store\App\FrontController\Plugin\RequestPreprocessor->aroundDispatch(&Magento\Framework\App\FrontController\Interceptor#000000003e1c7fce00000000115e8812#, &Closure#000000003e1c7fe600000000115e8812#, &Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#) called at [vendor/magento/framework/Interception/Interceptor.php:135]
#28 Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(&Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#) called at [vendor/magento/module-page-cache/Model/App/FrontController/BuiltinPlugin.php:69]
#29 Magento\PageCache\Model\App\FrontController\BuiltinPlugin->aroundDispatch(&Magento\Framework\App\FrontController\Interceptor#000000003e1c7fce00000000115e8812#, &Closure#000000003e1c7fe600000000115e8812#, &Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#) called at [vendor/magento/framework/Interception/Interceptor.php:135]
#30 Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(&Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#) called at [vendor/magento/framework/Interception/Interceptor.php:153]
#31 Magento\Framework\App\FrontController\Interceptor->___callPlugins('dispatch', array(&Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#), NULL) called at [generated/code/Magento/Framework/App/FrontController/Interceptor.php:26]
#32 Magento\Framework\App\FrontController\Interceptor->dispatch(&Magento\Framework\App\Request\Http#000000003e1c7e2200000000115e8812#) called at [vendor/magento/framework/App/Http.php:116]
#33 Magento\Framework\App\Http->launch() called at [generated/code/Magento/Framework/App/Http/Interceptor.php:24]
#34 Magento\Framework\App\Http\Interceptor->launch() called at [vendor/magento/framework/App/Bootstrap.php:261]
#35 Magento\Framework\App\Bootstrap->run(&Magento\Framework\App\Http\Interceptor#000000003e1c7e4c00000000115e8812#) called at [index.php:39]
2
  • add your layout code in question Apr 5, 2021 at 10:40
  • I have added the complete error. Apr 5, 2021 at 11:30

2 Answers 2

1

It is likely one of your layout files (or 3rd party ones) has defined a block with the property display="...."

So to find this file that gives your error, you may execute the line below from a terminal:

grep -R --include="*.xml" "display=" app/.

If this does not return anything (or does not help)

grep -R --include="*.xml" "display=" .

if the above returns nothing, then you may enlarge a bit:

grep -R --include="*.xml" "display" .
8
  • sure @herve I will try this and see. thank you Apr 7, 2021 at 6:07
  • Hi @Herve I got this response: ./vendor/magento/module-theme/view/frontend/layout/default.xml: <block class="Magento\Framework\View\Element\Template" name="navigation.sections" display="false" before="-" template="Magento_Theme::html/sections.phtml"> ./vendor/amzn/login-with-amazon-module/view/frontend/layout/amazon_login_login_validate.xml: <referenceBlock name="page.main.title" display="false"/> ./vendor/amzn/login-with-amazon-module/view/frontend/layout/amazon_login_login_processauthhash.xml: <referenceBlock name="page.main.title" display="false"/> Apr 8, 2021 at 12:32
  • So what to do now ? these all are looks like core files..! Apr 8, 2021 at 12:34
  • yes I solved this issue by removing display="false" from the files. Note: If you check latest magento 2.3.5-p1 the display="false" attribute is not there in default.xml [above mentioned first file] Apr 9, 2021 at 10:45
  • Thanks for the update, I’ll take a look and will update you why the core files have this display attribute and why it gives you this issue. But at least, it looks like the error has now disappeared, amazing! Apr 11, 2021 at 17:51
1

Magento handles exceptions differently depending on modes:

  • Production Mode: Does not show exceptions to the user (exceptions are written to logs only).
  • Developer Mode: Shows errors on the frontend

More details: https://devdocs.magento.com/guides/v2.3/config-guide/bootstrap/magento-modes.html

Update: Schema validation is performed in \Magento\Framework\Config\Dom:

   /**
     * Create DOM document based on $xml parameter
     *
     * @param string $xml
     * @return \DOMDocument
     * @throws \Magento\Framework\Config\Dom\ValidationException
     */
    protected function _initDom($xml)
    {
        $dom = new \DOMDocument();
        $useErrors = libxml_use_internal_errors(true);
        $res = $dom->loadXML($xml);
        if (!$res) {
            $errors = self::getXmlErrors($this->errorFormat);
            libxml_use_internal_errors($useErrors);
            throw new \Magento\Framework\Config\Dom\ValidationException(implode("\n", $errors));
        }
        libxml_use_internal_errors($useErrors);
        if ($this->validationState->isValidationRequired() && $this->schema) {
            $errors = $this->validateDomDocument($dom, $this->schema, $this->errorFormat);
            if (count($errors)) {
                throw new \Magento\Framework\Config\Dom\ValidationException(implode("\n", $errors));
            }
        }
        return $dom;
    }

but the validation happens only in developer mode \Magento\Framework\App\Arguments\ValidationState:

   /**
     * Retrieve current validation state
     *
     * @return boolean
     */
    public function isValidationRequired()
    {
        return $this->_appMode == \Magento\Framework\App\State::MODE_DEVELOPER;
    }

Once ValidationException is thrown there is another check in \Magento\Framework\View\Model\Layout\Merge that pass the exception if Magento is in developer mode:

   /**
     * Validate merged layout
     *
     * @param string $cacheId
     * @param string $layout
     * @return $this
     * @throws \Exception
     */
    protected function _validateMergedLayout($cacheId, $layout)
    {
        $layoutStr = '<handle id="handle">' . $layout . '</handle>';

        try {
            $this->layoutValidator->isValid($layoutStr, Validator::LAYOUT_SCHEMA_MERGED, false);
        } catch (\Exception $e) {
            $messages = $this->layoutValidator->getMessages();
            //Add first message to exception
            $message = reset($messages);
            $this->logger->info(
                'Cache file with merged layout: ' . $cacheId
                . ' and handles ' . implode(', ', (array)$this->getHandles()) . ': ' . $message
            );
            if ($this->appState->getMode() === \Magento\Framework\App\State::MODE_DEVELOPER) {
                throw $e;
            }
        }

        return $this;
    }
2
  • of course yes, even though the exception won't show on frontend and website will not load perfectly but here the website is loading correctly in production mode. Apr 5, 2021 at 10:56
  • yes, you are right. The issue is happening because of merging the configuration files and latest configuration file does not have display="false" attribute. And this validation is happening only in developer mode. thank you Apr 9, 2021 at 10:48

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.