フィールド要素を持つカスタムブロックを作成するカスタムモジュールがあります。
これはすべて正常に機能しますが、このブロックにテーマを設定する必要があります。私はここで他の投稿をチェックし、運が悪かったので試しました。
twigデバッグを有効にして、テーマの提案を受け取りました。それでも運がありません。
誰かが私を正しい方向に向けてくれませんか。
これは私がこれまでに持っているものです:
my_module/my_module.module
// nothing related in here
my_module/src/Plugin/Block/myModuleBlock.php
<?php
namespace Drupal\my_module\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;
/**
* Provides a 'ModuleBlock' block.
*
* @Block(
* id = "module_block",
* admin_label = @Translation("My Module"),
* )
*/
class ModuleBlock extends BlockBase {
public function blockForm($form, FormStateInterface $form_state) {
$form['test'] = array(
'#type' => 'select',
'#title' => $this->t('test'),
'#description' => $this->t('test list'),
'#options' => array(
'Test' => $this->t('Test'),
),
'#default_value' => isset($this->configuration['test']) ? $this->configuration['test'] : 'Test',
'#size' => 0,
'#weight' => '10',
'#required' => TRUE,
);
return $form;
}
/**
* {@inheritdoc}
*/
public function blockSubmit($form, FormStateInterface $form_state) {
$this->configuration['test'] = $form_state->getValue('test');
}
/**
* {@inheritdoc}
*/
public function build() {
$build = [];
$build['module_block_test']['#markup'] = '<p>' . $this->configuration['test'] . '</p>';
return $build;
}
}
my_module/templates/block--my-module.html.twig // twig debugが提案するように
<h1>This is a test</h1>
<div id="test-widget">{{ content }}</div>
また、my_theme.themeにはこれがありますが、関連性があるとは思わないことにも注意してください。
// Add content type suggestions.
function my_theme_theme_suggestions_page_alter(array &$suggestions, array $variables) {
if ($node = \Drupal::request()->attributes->get('node')) {
array_splice($suggestions, 1, 0, 'page__node__' . $node->getType());
}
}
私が試したことはこれです:
public function build() {
return array(
'#theme' => 'block--my-module'
);
}
しかし、それでも行きません。
ここでの助けは大歓迎です。
更新:それで私はそれを機能させましたが、それでも助けが必要です。テンプレートを移動しましたblock--my-module.html.twig
私のテーマディレクトリに移動すると、機能しました。
モジュールディレクトリで機能させるにはどうすればよいですか?
更新:それで私はそれを機能させましたが、それでも助けが必要です。テンプレートブロック--my-module.html.twigをテーマディレクトリに移動しましたが、機能しました。
モジュールディレクトリで機能させるにはどうすればよいですか?
モジュールルートにtemplates/
というディレクトリを作成できます。ここにテンプレートを配置します。
ここで、Drupalは、テンプレートをモジュールに保存していることを知らせます。your_module.module
に次の関数を追加します。
function YOUR_MODULE_theme($existing, $type, $theme, $path) {
return array(
'block__my_module' => array(
'render element' => 'elements',
'template' => 'block--my-module',
'base hook' => 'block'
)
);
}
これはテストされていません。それは私のカスタムブロックで機能した方法です。
キャッシュをクリアすることを忘れないでください。
モジュールにtwigファイルを追加できるようにするには、モジュールがテーマではなく参照を定義していることを確認する必要があります。
次のように、モジュールの.moduleファイルにhook_theme()を実装できます。
function mymodule_theme($existing, $type, $theme, $path) {
return [
'mymodule_block' => [
'variables' => [
// define defaults for any variables you want in the twig file
'attributes' => [
'class' => ['my-module-class'],
], //etc
],
],
];
}
次に、ブロックのbuild()実装で、新しいテーマ関数への参照を追加できます。
public function build() {
// Load the configuration from the form
$config = $this->getConfiguration();
$test_value = isset($config['test']) ? $config['test'] : '';
$build = [];
$build['#theme'] = 'mymodule_block';
// You would not do both of these things...
$build['#test_value'] = $test_value;
$build['module_block_test']['#markup'] = '<p>' . $test_value . '</p>';
return $build;
}
最後に、twigファイルの配置場所と名前に注意してください。モジュールディレクトリにtemplates
ディレクトリを作成し、テーマの_
を置き換えます。 -
の関数名:mymodule-block.html.twig