Magento 2: Как использовать дескриптор макета customer_logged_in?

9

Есть ли у Magento 2 такой дескриптор, как customer_logged_in ? Если да, как я могу использовать это?

Я пытался создать

../view/frontend/layout/customer_logged_in.xml

и добавил туда <referenceBlock name="content" remove="true" />

Но блок контента не был удален. Я переименовал дескриптор файла по умолчанию, и блок был успешно удален.

Что я делаю неправильно?

zhartaunik
источник

Ответы:

9

Ответ на ваш вопрос однозначно - нет, customer_logged_inдескриптора больше нет, я покопался в коде и не смог найти дескриптор макета, который бы помог.

Кроме того, \dev\tests\static\testsuite\Magento\Test\Legacy\LayoutTest.phpвы можете найти следующий код:

/**
 * List of obsolete nodes
 *
 * @var array
 */
protected $_obsoleteNodes = [
    'PRODUCT_TYPE_simple',
    'PRODUCT_TYPE_configurable',
    'PRODUCT_TYPE_grouped',
    'PRODUCT_TYPE_bundle',
    'PRODUCT_TYPE_virtual',
    'PRODUCT_TYPE_downloadable',
    'PRODUCT_TYPE_giftcard',
    'catalog_category_default',
    'catalog_category_layered',
    'catalog_category_layered_nochildren',
    'customer_logged_in',
    'customer_logged_out',
    'customer_logged_in_psc_handle',
    'customer_logged_out_psc_handle',
    'cms_page',
    'sku_failed_products_handle',
    'catalog_product_send',
    'reference',
];

Что для меня, ясно говорит нам, что customer_logged_inдескриптор макета устарел сейчас.

См. Ответ Фабиана для объяснения того, как это делается сейчас в Magento 2.

Рафаэль в цифровом пианизме
источник
1
эти события инициируются, когда клиент входит в систему и когда он выходит из системы , а не по каждому запросу.
Фабиан Шменглер
8

Как уже отмечали другие, эти ручки теперь исчезли. Если вы посмотрите на модуль Magento_Customer, вы увидите, что блоки, такие как ссылка на регистрацию, всегда добавляются, но не отображаются, если клиент вошел в систему . Похоже, что теперь это предпочтительный способ условного отображения элементов в зависимости от состояния входа в систему.

Но это не решение для удаления блоков, основанных на их именах, которые были определены где-то еще. Вы можете воссоздать функцию с наблюдателем для layout_load_beforeэтих вызовов, $layout->addHandle('customer_logged_in')если клиент вошел в систему.

Фабиан Шменглер
источник
Спасибо за ваш ответ. Конечно, я подумал о добавлении дескриптора в мой пользовательский модуль. Но это может выглядеть как шип, и я хотел использовать более естественный способ. Спасибо за объяснение и пример
жартауник
0

Это очень глупо. Мне нужно загрузить блок / шаблон / ресурс только у клиента есть разрешение, а не просто войти или выйти из системы. Но мне нужно написать 1000 строк кода, чтобы проверить, есть ли у пользователя разрешение на это. Просто прекрасно.

user2386643
источник