在UI中,您可以通过以下方式在区域中添加一个块:
- 转到管理->结构->块布局(/ admin / structure / block)。
- 单击区域名称旁边的“放置块”按钮。
我想通过编程来做同样的事情。如何将现有块添加到区域并保存?然后,该块应显示在该区域中,并在“ 块布局”页面中可用。
在UI中,您可以通过以下方式在区域中添加一个块:
我想通过编程来做同样的事情。如何将现有块添加到区域并保存?然后,该块应显示在该区域中,并在“ 块布局”页面中可用。
Answers:
要提供插件块,您可以构建一系列设置并将其传递\Drupal\block\Entity\Block::create()
给创建Block对象并保存实例。
例如,如果要向“七个”主题添加Devel Execute PHP块:
$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
自己想要的任何东西命名,只要它是唯一的即可。例如,您可能希望其在模块的名称启动它。
块的每个实例(“块类型”,配置和放置)都是一个配置实体:\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。为了兑现我la脚的评论,我将发布有关如何创建自定义块实体的块实例的解决方案:
$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