Добавление js в блок через модуль Drupal 8 [Решено]

Главные вкладки

Аватар пользователя Anatolii1309 Anatolii1309 7 августа 2016 в 21:45

Привет друпал сообщество.
Нужна небольшая помощь по Drupal 8. Пишу модуль, который будет будет крутит подряд видео фоном. Делаю его через модуль, который создает блок. Данный блок будет выводится только на нескольких страницах и поэтому их я перечисляю, где выводить.
Проблема.
Я написал js. Подключаю его через .libraries.yml

<?php  dependencies:
    - 
core/jquery
  js
:
   
js/video.js: {}?>

затем в Plugin Block вывожу соответственно данную библиотеку

public function build() {
  $items = array();

  return array(
    '#items' => $items,
    '#theme' => 'videoblock_KEY',
    '#attached' => array(
      'library' => array('videoblock/videobl'),
      ),
    );

  }
}

Проблема в том, что этот js есть на тех страницах, где нет этого блока.
Как мне решить данную проблему?
Спасибо.

Комментарии

Аватар пользователя tlito tlito 8 августа 2016 в 11:54

создайте блок в библиотеке пользовательских блоков
/admin/structure/block/block-content
и вставьте js обычным html-кодом.
настройте видимость блока с js так же как и целевого блока (с видео)

Аватар пользователя Anatolii1309 Anatolii1309 8 августа 2016 в 13:12

Я конечно не дурак думаю, но так пробовал.
Понимаете тут мне нужно подключить
- core/jquery
Он не работает так если просто вставить,
будет работать если я перед кодом добавлю например
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

Аватар пользователя Anatolii1309 Anatolii1309 8 августа 2016 в 14:07

Этим я и руководствовался когда писал.
Пробовал сейчас не объединять js через
{preprocess: false}
все равно выводит этот js на всех страницах.

Аватар пользователя Anatolii1309 Anatolii1309 9 августа 2016 в 16:49

Как всегда все решает невнимательность.
Подключал 2 раза эту библиотеку, второй раз в .module. Всем спасибо за помощь решено.

Аватар пользователя Anatolii1309 Anatolii1309 10 августа 2016 в 10:37

Напишу тут как подключить html, js и css к блоку в drupal 8, простое и понятное пособие. Хоть вопрос и простой, но внятного примера нету.
1. Создаем модуль с именем mymoduleblock
2. Создаем mymoduleblock.info

name: My module block
type: module
description: 'My module block page.'
package: Custom
core: 8.x
dependencies:
  - block

Тут указываем зависимость от block (dependencies: - block)
3. Затем создаем каталог templates и в нем файл mymoduleblock-KEY.html.twig, где KEY это ключ
В этом файле вы можете вставлять html и js (но если использует jqure, js не будет работать, поэтому стоит подключать через библиотеку и js и css)
Также этот файл twig вы можете подключать переменные например var1
4. Создаем mymoduleblock.module
Тут мы можем подключить переменную, например var1

<?php
/**
 * @file
 * Currently (31/07/2016) , Drupal needs this blank file.
 */

 function mymoduleblock_theme() {
  return [
    'mymoduleblock_KEY' => [
      'variables' => ['var1' => NULL],
    ],
  ];
}

5. Создание библиотеки
Создаем файл mymoduleblock.libraries.yml

mymoduleblock:
  version: 1.x
  css:
    theme:
      css/mymoduleblock.css: {}
  js:
    js/mymoduleblock: {}
  dependencies:
    - core/jquery
    - core/drupal.ajax
    - core/drupal
    - core/drupalSettings
    - core/jquery.once

Прописываем все что нужно подключить.
6. Последний шаг. Добавление блока и библиотеки.
Создаем каталог в нашем модуле mymoduleblock/src/Plugin/Block и тут файл BlockMyModule.php

<?php
/**
 * @file
 * Contains \Drupal\mymoduleblock\Plugin\Block\BlockMyModule.
 */

namespace Drupal\mymoduleblock\Plugin\Block;
use Drupal\Core\Block\BlockBase;
/**
 * Provides a 'mymoduleblock' block.
 *
 * @block(
 *   id = "mymoduleblock",
 *   admin_label = @Translation("My module block"),
 * )
 */

class BlockMyModule extends BlockBase {

/**
 * {@inheritdoc}
 */

  public function build() {
  $items = array();

  return array(
    '#items' => $items,
    '#theme' => 'mymoduleblock_KEY',
    '#attached' => array(
      'library' => array('mymoduleblock/mymoduleblock'),
      ),
    );

  }
}

где 'library' => array('имя модуля/имя библиотеки'),
Затем включаем этот блок и все.