UI에서 다음과 같은 방식으로 영역에 블록을 추가 할 수 있습니다.
- 관리-> 구조-> 블록 레이아웃 (/ admin / structure / block)으로 이동하십시오.
- 지역 이름 옆에있는 "장소 배치"버튼을 클릭하십시오.
프로그래밍 방식으로 똑같은 일을하고 싶습니다. 기존 블록을 영역에 추가하고 저장하려면 어떻게합니까? 이 블록은 해당 영역에 표시되고 블록 레이아웃 페이지 에서 사용할 수 있습니다 .
UI에서 다음과 같은 방식으로 영역에 블록을 추가 할 수 있습니다.
프로그래밍 방식으로 똑같은 일을하고 싶습니다. 기존 블록을 영역에 추가하고 저장하려면 어떻게합니까? 이 블록은 해당 영역에 표시되고 블록 레이아웃 페이지 에서 사용할 수 있습니다 .
답변:
플러그인 블록 을 제공하기 위해 설정 배열을 빌드하고이를 전달 \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();
id
고유 한 한 원하는 이름을 지정할 수 있다고 생각합니다 . 예를 들어, 모듈 이름으로 시작하려고 할 수 있습니다.
Twig tweak 모듈을 사용할 수 있습니다 .
Twig Tweak 모듈은 개발자의 경험을 향상시킬 수있는 유용한 기능과 필터가 포함 된 Twig 확장 기능을 제공합니다.
그런 다음 나뭇 가지 템플릿 영역에서 :
{{ drupal_block('block_id') }}
블록의 각 인스턴스 ( "블록 유형", 구성 및 배치)는 구성 엔티티 \Drupal\block\Entity\Block
입니다. 따라서 올바른 세부 정보를 사용하여이 엔티티의 새 인스턴스를 작성하기 만하면됩니다.
이 작업을 수행 할 수는 있지만 복잡합니다. 플러그인 시스템, 블록 플러그인 시스템 등을 이해해야합니다.
당신은 \Drupal\block\BlockForm::submitForm
이것에 대한 느낌을 얻을 수 있습니다 \Drupal\simpletest\BlockCreationTrait::placeBlock
. 이것이 실제로 필요한 것인지 생각하고 싶을 수도 있습니다. 블록의 가시성은 매우 복잡합니다.
방금 D8을 배우고 있지만 프로그래밍 방식으로 블록을 배치하는 훨씬 쉬운 방법을 찾은 것 같습니다 (googletorp의 답변을 읽은 후 꽤 위협적인 것 같습니다!)
블록을 정의한 사용자 지정 모듈을 활성화했을 때 블록이 자동으로 올바른 지역에 배치되기를 원했습니다. 이것을 달성하기 위해 사용한 단계는 다음과 같습니다.
/admin/structure/block
admin/config/development/configuration/single/export
/config/install/
/config/install
디렉토리 에이 파일을 작성 하고 거기에 코드를 복사하십시오.Drupal 8에서 프로그래밍 방식으로 Entity : Block을 조작하는 방법 덕분에 답을 찾았습니다 .
use Drupal\block\Entity\Block;
$block = Block::load('sitebranding');
$block->setRegion('content');
$block->save();
위의 예는 충분히 가깝지만 여전히 올바르지 않습니다. 아이디어는 블록 인스턴스의 고유 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를 작성합니다