web-dev-qa-db-ja.com

残りのテーマなしでカスタムモジュールから出力する方法

たとえば、印刷に適したページを作成するために、テンプレート以外の追加のテーマなしでモジュールからページを出力する適切な方法は何ですか?

私は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;
}
2
EmGee

コントローラはレンダー配列を返す必要はありません。たとえば、シンフォニー応答を提供することもできます。

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;
6
4k4

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;
4
Arosboro

返信にコメントを追加するのに十分な評判はありませんが、@ 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 %}

これは私がそれを機能させた方法です。

4
Maticb