たとえば、印刷に適したページを作成するために、テンプレート以外の追加のテーマなしでモジュールからページを出力する適切な方法は何ですか?
私はDrupal 7バージョンに基づいていくつかの異なる方法を試しました。動作する唯一の方法は、ビルド配列をレンダリングしてさらに殺すことですPHPロード、ただし、これは正しくありません。Drupal 7では、hook_menu()で「配信コールバック」を設定できますが、その動作を再現する方法がわかりません。今。
my_module.routing.yml:
my_module.user_timesheets:
path: '/my_module/timesheets/{weekOf}/{uid}'
defaults:
_controller: '\Drupal\my_module\Controller\MyModuleAdminController::timesheets'
_title: 'My Module Timesheets'
requirements:
_permission: 'admin'
my_module.module:
$theme['timesheets'] = [
'render element' => 'build',
'template' => 'timesheets',
];
MyModuleAdminController.timesheets:
public function timesheets($weekOf, $uid = null) {
$build['#theme'] = 'timesheets';
...code building values...
$build['#staff'] = $staff;
$build['#title'] = 'Timesheets - ' . $weekOf . ' to ' . $this->dateService->getWeekStartDate($weekOf);
$build['#attached']['library'][] = 'my_module/timesheets';
//print render($build);
//die();
return $build;
}
my_module.libraries.yml:
timesheets:
css:
theme:
lib/timesheets.css: {}
編集:モジュールでpage.html.twigのようなものをオーバーライドするには、page--my_module--html.twigというテンプレートを作成し、モジュールのmy_module_theme()関数で宣言します。
/**
* Implements hook_theme().
*/
function my_module_theme() {
$theme['page__my_module__timesheets'] = [
'template' => 'page--my_module--timesheets',
];
return $theme;
}
コントローラはレンダー配列を返す必要はありません。たとえば、シンフォニー応答を提供することもできます。
use Symfony\Component\HttpFoundation\Response;
$response = new Response();
$response->setContent('<h1>Hello world</h1>');
//$response->headers->set('Content-Type', 'text/xml');
return $response;
これはDrupalレンダリングとテーマ設定をバイパスします。
編集:
2つの方法でDrupal 7コードを置き換えることができます。
1)上書きpage.html.twig
およびhtml.html.twig
、このテンプレートからすべてを削除し、それだけを目的のものに配置します。
2)Drupal 7で今行っているようにHTMLをレンダリングし、Symfonyレスポンスを使用します。
Drupal 8でのレンダリング:
use Symfony\Component\HttpFoundation\Response;
$output = \Drupal::service('renderer')->renderRoot($build);
$response = new Response();
$response->setContent($output);
return $response;
Html_response.attachments_processorサービスとレンダラーサービスをBareHtmlPageRenderer
とともに使用すると、ライブラリを取得して、テンプレート化されていないページのヘッドタグに読み込むことができます。
use Drupal\Core\Render\BareHtmlPageRenderer;
$attachments = \Drupal::service('html_response.attachments_processor');
$renderer = \Drupal::service('renderer');
$bareHtmlPageRenderer = new BareHtmlPageRenderer($renderer, $attachments);
$response = $bareHtmlPageRenderer->renderBarePage($build, 'Page Title', 'markup');
return $response;
返信にコメントを追加するのに十分な評判はありませんが、@ Arosboroによるanwserはほぼ完了しています。
return $bareHtmlPageRenderer->renderBarePage([], 'Address', 'checkout_address', $build);
このように、私が$ buildに配置したtwig変数は正しくレンダリングされました。
私の完全なコード:
$build = [
'#theme' => 'checkout_address',
'#content' => [],
'#edit' => FALSE,
];
...
$attachments = \Drupal::service('html_response.attachments_processor');
$bareHtmlPageRenderer = new BareHtmlPageRenderer($this->renderer, $attachments);
return $bareHtmlPageRenderer->renderBarePage([], 'Address', 'checkout_address', $build);
そしてテンプレート:
{{ content }}
{% if edit == true %}
<button class="btn-edit-address">Edit Address</button>
{% endif %}
これは私がそれを機能させた方法です。