프로그래밍 방식으로 블록을 배치하려면 어떻게합니까?


10

UI에서 다음과 같은 방식으로 영역에 블록을 추가 할 수 있습니다.

  1. 관리-> 구조-> 블록 레이아웃 (/ admin / structure / block)으로 이동하십시오.
  2. 지역 이름 옆에있는 "장소 배치"버튼을 클릭하십시오.

프로그래밍 방식으로 똑같은 일을하고 싶습니다. 기존 블록을 영역에 추가하고 저장하려면 어떻게합니까? 이 블록은 해당 영역에 표시되고 블록 레이아웃 페이지 에서 사용할 수 있습니다 .


블록을 생성 한 후 다음 위치에서 블록의 위치를 ​​재정렬 할 수 있습니다. site_name / admin / structure / block
Crazyrubixfan

"지역에 블록을 할당"했다고 잘못 입력했다고 가정합니다.
cilefen

@IcecreamJelly 내가하려는 것은 프로그래밍 방식으로 수행하는 것입니다. cilefen, 그렇습니다 그것이 내가 의미하는
바이다

@ ShawnConn 감사합니다. 비슷하지만 정확히 동일하지는 않습니다. 다른 곳에서 답을 찾았습니다.
jmzea

답변:


9

플러그인 블록 을 제공하기 위해 설정 배열을 빌드하고이를 전달 \Drupal\block\Entity\Block::create()하여 Block 오브젝트를 작성하고 인스턴스를 저장할 수 있습니다.

예를 들어 Devel Execute PHP 블록을 Seven 테마 에 추가하려는 경우 :

$values = array(
  // A unique ID for the block instance.
  'id' => 'devel_execute_php_1',
  // The plugin block id as defined in the class.
  'plugin' => 'devel_execute_php',
  // The machine name of the theme region.
  'region' => 'content',
  'settings' => array(
    'label' => 'Execute PHP',
  ),
  // The machine name of the theme.  
  'theme' => 'seven',
  'visibility' => array(),
  'weight' => 100,
);
$block = \Drupal\block\Entity\Block::create($values);
$block->save();

안녕하세요, 도움이 필요합니다. UI를 사용하여 사용자 정의 블록을 만들고 테스트 목적으로 바닥 글 영역에 프로그래밍 방식으로 배치하고 싶습니다. UI로 만든 사용자 지정 블록에서 플러그인을 얻는 방법을 모르겠습니다. 감사
Mudassar Ali

이것을 다른 질문으로 물어보십시오. 의견은 질문을하지 않습니다.
Shawn Conn


뭐죠 ID 여기에? 블록 이름과 동일합니까?
Crazyrubixfan

@RubberDuckIsKing id고유 한 한 원하는 이름을 지정할 수 있다고 생각합니다 . 예를 들어, 모듈 이름으로 시작하려고 할 수 있습니다.
Parag

7

Twig tweak 모듈을 사용할 수 있습니다 .

Twig Tweak 모듈은 개발자의 경험을 향상시킬 수있는 유용한 기능과 필터가 포함 된 Twig 확장 기능을 제공합니다.

그런 다음 나뭇 가지 템플릿 영역에서 :

{{ drupal_block('block_id') }}

이 솔루션의 문제점은 나뭇 가지를 조정하려면 여전히 블록을 배치 한 다음 '비활성화'해야한다는 것입니다.
lexicant

6

블록의 각 인스턴스 ( "블록 유형", 구성 및 배치)는 구성 엔티티 \Drupal\block\Entity\Block입니다. 따라서 올바른 세부 정보를 사용하여이 엔티티의 새 인스턴스를 작성하기 만하면됩니다.

이 작업을 수행 할 수는 있지만 복잡합니다. 플러그인 시스템, 블록 플러그인 시스템 등을 이해해야합니다.

당신은 \Drupal\block\BlockForm::submitForm이것에 대한 느낌을 얻을 수 있습니다 \Drupal\simpletest\BlockCreationTrait::placeBlock. 이것이 실제로 필요한 것인지 생각하고 싶을 수도 있습니다. 블록의 가시성은 매우 복잡합니다.


4
가시성 조건 외에는 그렇게 복잡하지 않다고 생각합니다. \ Drupal \ simpletest \ BlockCreationTrait :: placeBlock ()은 아마도 더 좋은 예일 것입니다. 내 보낸 구성 파일을 가져올 수도 있습니다.
Berdir

@Berdir 테스트 특성에 대한 링크에 감사드립니다. Drupal 8은 아직 너무 어리기 때문에 많은 사람들이 플러그인 시스템에 대해 많이 알지 못하고 문서는 더 많은 유스 케이스 등을 사용할 수 있으므로 많은 개발자가 작업에 어려움을 겪을 수 있습니다.
googletorp

펠릭스 이브가 가장 좋은 답변입니다. 복잡하지 않습니다.
kratos

@kratos Felix가 제공 한 답변은 실제로 "프로그래밍 방식으로"블록을 배치하는 방법에 대한 문제를 해결하는 것이 아니라 구성 파일을 사용하는 것입니다. 구성은 drush, 구성 동기화 인터페이스 또는 모듈 설치를 통해서만 가져올 수 있습니다. 실행 중, 섹션 프론트 페이지 노드 유형 등의 fx post 저장이 필요한 경우,이 전략을 사용하는 것은 쓸모가 없습니다 :)
googletorp

4

방금 D8을 배우고 있지만 프로그래밍 방식으로 블록을 배치하는 훨씬 쉬운 방법을 찾은 것 같습니다 (googletorp의 답변을 읽은 후 꽤 위협적인 것 같습니다!)

블록을 정의한 사용자 지정 모듈을 활성화했을 때 블록이 자동으로 올바른 지역에 배치되기를 원했습니다. 이것을 달성하기 위해 사용한 단계는 다음과 같습니다.

  1. 모듈을 활성화하고 UI를 사용하여 블록을 배치하십시오. /admin/structure/block
  2. 단일 항목 구성 내보내기 페이지로 이동하십시오. admin/config/development/configuration/single/export
  3. 구성 유형 블록을 선택 하고 구성 이름으로 UI를 사용하여 방금 배치 한 블록을 선택한 다음 생성 된 코드를 복사하십시오.
  4. 모듈에서 폴더를 만듭니다 /config/install/
  5. 생성 된 코드 텍스트 영역 아래에 사용해야하는 파일 이름이 표시됩니다. /config/install디렉토리 에이 파일을 작성 하고 거기에 코드를 복사하십시오.
  6. 이제 모듈을 제거한 다음 다시 활성화하면 블록이 자동으로 배치됩니다.

다른 개발자 나 환경에서 작동하기 위해 UUID를 제거하지 않아도 되겠습니까?
powpow12

그렇습니다. UUID를 제거하는 것이 좋습니다.
Felix Eve

다음 작업 중 일부를 자동화하는 Drupal 콘솔을 사용할 수도 있습니다. hechoendrupal.gitbooks.io/drupal-console/content/en/commands/…
Beau


2

위의 예는 충분히 가깝지만 여전히 올바르지 않습니다. 아이디어는 블록 인스턴스의 고유 ID (내 경우에는 devel_execute_php_1112 (내가 1112 번 작동하도록 시도했기 때문에 수수께끼로 남을 것입니다))와 실제 블록 ID ( 주석에서 테마 블록과 테마에 대해 선언됩니다. 그런 다음 지역을 설정하면 좋습니다. 원하는 지역 아래에 블록의 인스턴스를 작성했습니다.

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'devel_execute_php_1112',
      'plugin' => 'devel_execute_php',
      'theme' => 'seven'
  )
);
$block->setRegion('content');
$block->save();

edit1 : 실제로 위의 주석을 나중에 확인했습니다. ID가 당신이 생각해 내야 할 것이 분명하지 않습니다. 내 절름발이 의견을 대신하여 사용자 지정 블록 엔터티의 블록 인스턴스를 만드는 방법에 대한 솔루션을 게시합니다.

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'ggggggggsssssss',
      'plugin' => 'block_content:79d53b4e-9e60-4f97-befc-101da919bb7a',
      'theme' => 'visitb_he_theme'
  )
);
$block->setRegion('content');

기본적으로 동일하지만 플러그인의 경우 block_content : uuid_of_custom_block_entity_instance를 작성합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.