如何以编程方式放置积木?


10

在UI中,您可以通过以下方式在区域中添加一个块:

  1. 转到管理->结构->块布局(/ admin / structure / block)。
  2. 单击区域名称旁边的“放置块”按钮。

我想通过编程来做同样的事情。如何将现有块添加到区域并保存?然后,该块应显示在该区域中,并在“ 块布局”页面中可用。


创建完块后,您可以从以下位置重新排列块的位置:site_name / admin / structure / block
Crazyrubixfan'Aug

我假设您输入了“将区块分配给区域”的错误输入。
cilefen '16

@IcecreamJelly我正在尝试执行的操作是以编程方式进行的。cilefen,是的,这就是我的意思%-)
jmzea

@ShawnConn谢谢,这是相似的,但不完全相同。我在其他地方找到了答案。
jmzea

Answers:


9

要提供插件块,您可以构建一系列设置并将其传递\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();

嗨,我需要帮助。我已经使用UI创建了一个自定义块,并希望以编程方式放置在页脚区域中以进行测试。我不知道如何从UI创建的自定义块中获取插件。。谢谢
Mudassar Ali

提出另一个问题。评论不是问问题。
肖恩·康


这是什么身份证?与块名相同吗?
Crazyrubixfan

@RubberDuckIsKing我相信您可以为id自己想要的任何东西命名,只要它是唯一的即可。例如,您可能希望其在模块的名称启动它。
Parag

7

您可以使用Twig调整模块:

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感谢您添加到测试特征的链接。由于Drupal 8还很年轻,所以很多人对插件系统不了解很多,并且文档可能会使用更多用例等,这会使很多开发人员很难使用它。
googletorp

Felix Eve的最佳答案。这不是疯狂的复杂。
克拉托斯

@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. 在生成的代码textarea下,它告诉您需要使用的文件名。在/config/install目录中创建此文件,然后在其中复制代码。
  6. 现在,当您卸载模块然后重新启用它时,该模块将自动放置。

您是否需要删除UUID才能在其他开发人员或环境中使用?
powpow12

是的-删除UUID是个好主意。
菲利克斯·夏娃

您还可以使用Drupal控制台,该控制台负责使其中一些任务自动化:hechoendrupal.gitbooks.io/drupal-console/content/zh-CN/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。为了兑现我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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.