• записи
    2
  • комментариев
    10
  • просмотр
    7431

Авторы блога:

Magento2 — прячем автоматически системные уведомления через заданное время

klierik

3063 просмотра

Привет, друзья.

Заметка может быть интересна front-end разработчикам, которые начинают изучение Magento 2 CMS (одной из самых популярных систем управления интернет-магазинами). Предполагается что разработка ведётся в рамках кастомной темы под M2.

Если говорить о самой задаче то, конечно же, спрятать уведомление после указанного времени особого труда не составит. Вопрос скорее в другом — как это реализовать в рамках Magento2, где властвует requirejs и несколько иная, по сравнению с Magento1, иерархия директорий?

Для выполнения поставленной задачи давай воспользуемся html-файлом, который размещается по пути:

magento/vendor/magento/module-theme/view/frontend/templates/messages.phtml

с содержимым:

Скрытый текст

<?php
/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
?>
<div data-bind="scope: 'messages'">
    <div data-bind="foreach: { data: cookieMessages, as: 'message' }" class="messages">
        <div data-bind="attr: {
            class: 'message-' + message.type + ' ' + message.type + ' message',
            'data-ui-id': 'message-' + message.type
        }">
            <div data-bind="html: message.text"></div>
        </div>
    </div>
    <div data-bind="foreach: { data: messages().messages, as: 'message' }" class="messages">
        <div data-bind="attr: {
            class: 'message-' + message.type + ' ' + message.type + ' message',
            'data-ui-id': 'message-' + message.type
        }">
            <div data-bind="html: message.text"></div>
        </div>
    </div>
</div>
<script type="text/x-magento-init">
    {
        "*": {
            "Magento_Ui/js/core/app": {
                "components": {
                        "messages": {
                            "component": "Magento_Theme/js/view/messages"
                        }
                    }
                }
            }
    }
</script>

 

Давай скопируем его в кастомную тему по адресу:

magento/app/design/frontend/HTMLForum/default/Magento_Theme/templates/messages.phtml

где "HTMLForum/default" — это "Vendor/theme"

В рамках задачи нам требуется спрятать системное уведомление через заданное кол-во времени. Для этого можно воспользоваться колбеком knockoutjs.com — afterRender().

Мне кажется правильнее было бы выполнить Messages.extend({}) в новом компоненте, но мои попытке не увенчались успехом на момент написания статьи. Я внесу обновления в текущую заметку когда буду знать более корректный путь для реализации поставленной задачи.

В M2 существуют 2 варианта вывода уведомлений:

  • В результате перезагрузки страницы (на пример, добавление продукта на странице продукта)
  • В результате ajax-запроса (на пример, добавление продукта на странице каталога)

В вышеуказанном шаблоне содержатся оба варианта. Пример ф-ии которая будет вызвана после рендеринга уведомления:

afterRender: function(e){
    setTimeout(function () {
        jQuery(e).fadeOut()
    }, 5000);
}

где "5000" — это время ожидания в мс.

Её мы используем для обоих вариантов следующим образом:

<?php
/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
?>
<div data-bind="scope: 'messages'">
    <div data-bind="foreach: { data: cookieMessages, as: 'message' }" class="messages">
        <div data-bind="attr: {
            class: 'message-' + message.type + ' ' + message.type + ' message',
            'data-ui-id': 'message-' + message.type
        },
        afterRender: function(e){
            setTimeout(function () {
                jQuery(e).fadeOut()
            }, 5000);
        }">
            <div data-bind="html: message.text"></div>
        </div>
    </div>
    <div data-bind="foreach: { data: messages().messages, as: 'message' }" class="messages">
        <div data-bind="attr: {
            class: 'message-' + message.type + ' ' + message.type + ' message',
            'data-ui-id': 'message-' + message.type
        },
        afterRender: function(e){
            setTimeout(function () {
                jQuery(e).fadeOut()
            }, 5000);
        }
        ">
            <div data-bind="html: message.text"></div>
        </div>
    </div>
</div>
<script type="text/x-magento-init">
    {
        "*": {
            "Magento_Ui/js/core/app": {
                "components": {
                        "messages": {
                            "component": "Magento_Theme/js/view/messages"
                        }
                    }
                }
            }
    }
</script>

Вот, собственно, и всё.

Почисти кеш, запусти деплой (или пересоздай симлинки + билд стилей темы через Grunt) и обнови страницу.



1 комментарий


Рекомендованные комментарии

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Пишут сейчас

    • Разметка выглядит как минимум странно!          В любом случае надо сделать вашу разметку лучше!              и после этого уже ожидать хороших примеров.  ... Далее по:  <!DOCTYPE html> - #html5 - ок  <html lang="en"> - почему? в документе объявлена латиница а записи в этом доке сделаны кирилицей ! - #html5 -  <script type="text/javascript"></script> - type="text/javascript" это лишнее, достаточно <script> </script> - #html5 -  <section class="wrapper"> - <section>? где заголовок <h2-6>? - #html5 -  <ul class="sidebar-menu"> <?php include_once 'menu.php'; ?> </ul> </li> </ul> - оочень странная конструкция, для шаблона!  <section class="my-page"> - ещё <section>? где заголовок <h2-6>? - #html5 - + не о чем не говорящее имя класса! "my-page"(  <img width="100%" ...> - почему стилевые правила в разметке? тем более <img width="100%" ...> не приветствуется в  - #html5 -  ... далее имеются повторяющиеся моменты указанные выше, также своевременность открытия/закрытия тэгов...  <div class="menu"><div class="footer">«Играй в SAMP» Powered by Mihail Rusich ©2016 </div></menu> - нижний колонтитул просто эпик! что это за конструкция?  <divclass="menu"> <divclass="footer"></div> </menu> . итог: приведите в порядок - валидируйте вашу разметку!  Удачи) ....
    • Если вы знаете каким образом увидеть афиши прошедших мероприятий, пожалуйста, смотрите и парсите, но мне кажется сайт не выдает мероприятия из прошлого. Вы можете парсить начиная с сегодняшнего числа и копить эту информацию, на вашем сайте доступ к прошедшим мероприятиям может быть реализован. т.е. вы хотите, чтобы я вам сделал парсер?
      В чем проблемы возникли?
      Для работы с xml документами можно использовать http://simplehtmldom.sourceforge.net/
      Так же весь парсер можно разбить на функции, одна будет например парсить список мероприятий, другая данные по конкретному мероприятию....
        require_once('simple_html_dom.php'); function parser_get_list($p = 1) {     $url = 'https://www.culture.ru/afisha/chelyabinsk?page='.$p.'&limit=24';     $html = file_get_html($url);     if(is_object($html))     {         $items = $html->find('.container_inner .entity-cards_item');         if(is_array($items) && count($items) > 0)         {             foreach($items as $key=>$val)             {                 $url = $val->find('a',0)->href;                 parser_get_page($url);             }             parser_get_list($p+1);         }         else         {             $items = $html->find('.empty-data-message');             if(is_array($items) && count($items) > 0)             {                 //список мероприятий кончился             }             else             {                 //нет ни афиши ни информации о том что их нет - какая-то ошибка возможно                 //можно сделать обработку для них             }         }     } } function parser_get_page($url) {     //проверяем есть ли данная запись у нас, если нет     //аналогично функции parser_get_list, ищем нужные нам данные и записывать их куда-то }  
    • Спасибо большое, но я еще многое чего не понимаю. Да, хочу адаптивно сверстать.
  • Лучшие авторы

    Никто не получал репутацию за неделю

  • Текущие цели пожертвований