И делать это правильно
También disponible en español aquí.
Для этого в Drupal 7 мы используем модуль библиотек. Для Drupal 8 это по-прежнему правильный способ сделать это; однако этот модуль находится в процессе огромных изменений, и он не совсем хорошо документирован, поэтому сделать это в первый раз - настоящая проблема.
В этом посте мы собираемся использовать библиотеку Chart.js в настраиваемом блоке. Первое, что нам нужно сделать, это загрузить и установить модуль библиотек. После этого, согласно документации, нам нужно проверить, есть ли определение библиотеки, которую мы хотим использовать в реестре библиотек; если он существует и работает у нас, мы экономим один шаг. Если его не существует (это была моя ситуация), нам нужно создать его (и, конечно же, вернуть его сообществу). Для этого мы должны создать json-файл с определением нашей библиотеки в папке public: // library-definitions. В нашем случае этот файл будет называться chart.js и будет иметь следующее содержимое:
{ "name": "Chart.js", "type": "asset", "vendor url": "http:\/\/www.chartjs.org", "download url": "https:\/\/github.com\/chartjs\/Chart.js\/releases\/latest", "variants": { "minified": { "js": { "Chart.min.js": "Chart.min.js" } } }, "js": { "Chart.js": "Chart.js" }, "version_detector": { "id": "line_pattern", "configuration": { "file": "Chart.js", "pattern": "\/Version: ([0-9a-zA-Z\\.-]+)\/" } } }
В этом файле мы записываем человеческое имя библиотеки, тип библиотеки (актив) и некоторую другую информацию о библиотеке.
Не забудьте отправить файл через очередь задач после того, как вы его протестировали, чтобы другие люди могли извлечь из него пользу.
Следующим шагом будет загрузка библиотеки и размещение ее в нужной папке; в нашем случае это sites/all/assets/vendor/chart_js
. Там мы должны разместить Chart.js и Chart.min.js
Конечно, чтобы использовать эту библиотеку, нам понадобится специальный файл js; Итак, мы создаем его внутри папки js (только для заказа) с желаемым именем. В этом посте мы следуем базовому примеру Chart.js; Итак, наш файл будет называться demo_chartjs.js и будет иметь это:
(function ($, Drupal) { Drupal.behaviors.demoChartJsDemoChart = { attach: function (context, settings) { var ctx = document.getElementById("myChart"); var myChart = new Chart(ctx, { type: 'bar', data: { labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], datasets: [{ label: '# of Votes', data: [12, 19, 3, 5, 2, 3], backgroundColor: [ 'rgba(255, 99, 132, 0.2)', 'rgba(54, 162, 235, 0.2)', 'rgba(255, 206, 86, 0.2)', 'rgba(75, 192, 192, 0.2)', 'rgba(153, 102, 255, 0.2)', 'rgba(255, 159, 64, 0.2)' ], borderColor: [ 'rgba(255,99,132,1)', 'rgba(54, 162, 235, 1)', 'rgba(255, 206, 86, 1)', 'rgba(75, 192, 192, 1)', 'rgba(153, 102, 255, 1)', 'rgba(255, 159, 64, 1)' ], borderWidth: 1 }] }, options: { scales: { yAxes: [{ ticks: { beginAtZero:true } }] } } }); } }; })(jQuery, Drupal);
Нет никаких различий в том, как работает javascript в Drupal 8 по сравнению с Drupal 7. Если хотите, можете ознакомиться с документацией.
Для Drupal 8 единственное, что вы можете прикрепить к любому массиву рендеринга, - это библиотеки, поэтому нам нужно определить библиотеку. Для этого, согласно официальной документации, нам нужно создать файл .libraries.yml. Поскольку наш модуль называется demo_chartjs, этот файл будет называться demo_chartjs.libraries.yml и иметь следующее содержимое:
demo_chartjs: version: 1.x js: js/demo_chartjs.js: {}
Далее нам нужно создать шаблон для рендеринга необходимой разметки для нашей диаграммы. Итак, мы собираемся реализовать hook_theme
в файле .module:
/** * Implements hook_theme(). */ function demo_chartjs_theme() { return [ 'demo_chartjs_demo_chart' => [ 'variables' => [], ], ]; }
И добавляем наш файл шаблона в папку шаблонов внутри нашего модуля. Этот файл будет иметь имя demo-chartjs-demo-chart.html.twig
и иметь следующее содержание:
{# /** * @file * Template file for demo_chartjs_demo_chart. */ #} <canvas id="myChart" width="400" height="400"></canvas>
Теперь осталось только создать наш блок; Итак, давайте создадим файл DemoChartJs.php
в src/Plugin/Block
и поместим туда его содержимое:
<?php namespace Drupal\demo_chartjs\Plugin\Block; use Drupal\Core\Block\BlockBase; use Drupal\Component\Utility\Xss; /** * Provides a 'DemoChartJs' block. * * @Block( * id = "demo_chart_js", * admin_label = @Translation("Demo chart js"), * ) */ class DemoChartJs extends BlockBase { /** * {@inheritdoc} */ public function build() { $build = []; $build['chart'] = [ '#theme' => 'demo_chartjs_demo_chart', '#attached' => [ 'library' => [ 'libraries/chart_js', 'demo_chartjs/demo_chartjs', ], ], ]; return $build; } }
Самая важная часть этого файла - функция сборки; там мы инструктируем Drupal использовать тему demo_chartjs_demo_chart
, ранее определенную как рендеринг нашего шаблона. Мы также подключаем две библиотеки:
- библиотеки / chart_js: библиотека Chart.ks. Поскольку это внешняя библиотека; они всегда регистрируются как часть модуля библиотек.
- demo_chartjs / demo_chartjs: Наша библиотека, как определено в файле .libraries.yml. В него входит только наш js-файл.
Со всем предыдущим делом; пора протестировать наш блок. Разместите его на сайте, и у вас должна получиться красивая диаграмма, как показано на изображении заголовка этого сообщения.
Отказ от ответственности: модуль библиотек находится в постоянном развитии, поэтому некоторые вещи могут измениться; тем не менее, общие концепции, показанные здесь, я думаю, останутся прежними.
Надеюсь, это будет вам полезно.
Manatí - это консалтинговая компания из Коста-Рики, где мы создаем веб-сайты, стратегически разработанные для помощи организации в достижении целей.
Не пропустите проекты, новости и идеи от Manatí. Узнавайте о том, что мы делаем, подписывайтесь на нас в medium, twitter и facebook.