特定のページのサイドバーを変更したい

特定のページのサイドバーを変更したい

- Yumu Noma の投稿
返信数: 6

[やりたいこと]

ブックの章のページのみサイドバーの内容を変更したいです。
対象ディレクトリ:moodle/mod/book/view.php

バージョン:Moodle3.9.2+
テーマ:「クラシック」

[これまでにした作業]

「クラシック」内でサイドバーのコンテンツを編集すれば良いと思い、該当するコードを探したところ、
moodle\theme\classic\templates\columns.mustacheの
{{{ sidepreblocks }}}が見つかりました。

なので、「sidepreblocks」をmoodleディレクトリ内で検索してみましたが、どこにサイドバーの中身のコードがあるのか分かりませんでした。

どこにサイドバーのコードがあるかご存知の方はいらっしゃいますでしょうか?

または、他の解決方法をご存知でしたら、ご教示いただけますと幸いです。

Yumu Noma への返信

Re: 特定のページのサイドバーを変更したい

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

ブックモジュールの「目次」が表示されるブロックでしたら、mod/book/locallib.phpの193行目あたり ($bc->content = $toc;) だと思います。

/**
 * Add the book TOC sticky block to the default region.
 *
 * @param   array       $chapters   The Chapters in the book
 * @param   stdClass    $chapter    The current chapter
 * @param   stdClass    $book       The book
 * @param   stdClass    $cm         The course module
 * @param   bool|null   $edit       Whether the user is editing
 */
function book_add_fake_block($chapters, $chapter, $book, $cm, $edit = null) {
    global $PAGE, $USER;

    if ($edit === null) {
        if (has_capability('mod/book:edit', context_module::instance($cm->id))) {
            if (isset($USER->editing)) {
                $edit = $USER->editing;
            } else {
                $edit = 0;
            }
        } else {
            $edit = 0;
        }
    }

    $toc = book_get_toc($chapters, $chapter, $book, $cm, $edit);

    $bc = new block_contents();
    $bc->title = get_string('toc', 'mod_book');
    $bc->attributes['class'] = 'block block_book_toc';
    $bc->content = $toc;

    $defaultregion = $PAGE->blocks->get_default_region();
    $PAGE->blocks->add_fake_block($bc, $defaultregion);

}

添付 mod_book.png
Mitsuhiro Yoshida への返信

Re: 特定のページのサイドバーを変更したい

- Yumu Noma の投稿

お返事いただきありがとうございます。

ご提案いただいたのにも関わらず、恐縮なのですが、
目次だけではなく、サイドバー全体(目次、ナビゲーション、管理)の表示を変更したいと考えております。

イメージとしては、サイドバーを表示するコードを、以下のように条件分岐をして、book/view.phpが表示されているときは、新たなサイドバーが表示されるようにしたいです。

if (book/view.phpのURL) {
  (新たなサイドバーを表示するためのコード)
} else {
  (元々のサイドバーのコード)
}

ですので、目次よりももう一段階層が上になるのかと思います。

現在、私も探しておりますが、まだ見つかっていません。見つかり次第、こちらに投稿させていただきます。

もし、解決策をご存知でしたら、ご教示いただけますと幸いです。

Yumu Noma への返信

Re: 特定のページのサイドバーを変更したい

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

本投稿の添付画像のように「目次」サイドブロックの下に独自の「コンテンツ」サイドブロックを追加するのでしたら、以下のプログラム修正で可能だと思います。

修正対象プログラム:
mod/book/locallib.php

修正箇所:
197行目

[ 修正前 ]
    $toc = book_get_toc($chapters, $chapter, $book, $cm, $edit);

    $bc = new block_contents();
    $bc->title = get_string('toc', 'mod_book');
    $bc->attributes['class'] = 'block block_book_toc';
    $bc->content = $toc;

    $defaultregion = $PAGE->blocks->get_default_region();
    $PAGE->blocks->add_fake_block($bc, $defaultregion);
}

/**
 * Generate toc structure
 *
 * @param array $chapters
 
 [ 修正後 ]
     $toc = book_get_toc($chapters, $chapter, $book, $cm, $edit);

    $bc = new block_contents();
    $bc->title = get_string('toc', 'mod_book');
    $bc->attributes['class'] = 'block block_book_toc';
    $bc->content = $toc;

    $defaultregion = $PAGE->blocks->get_default_region();
    $PAGE->blocks->add_fake_block($bc, $defaultregion);

    $bc2 = new block_contents();
    $bc2->title = get_string('content', 'mod_book');
    $bc2->attributes['class'] = 'block block_book_toc';
    $bc2->content = '<ul><li>Test content1</li><li>Test content2</li><li>Test content3</li></ul>';

    $defaultregion2 = $PAGE->blocks->get_default_region();
    $PAGE->blocks->add_fake_block($bc2, $defaultregion2);
}

/**
 * Generate toc structure
 *
 * @param array $chapters
添付 fake_block.png
Mitsuhiro Yoshida への返信

Re: 特定のページのサイドバーを変更したい

- Yumu Noma の投稿

ご提案いただきありがとうございます。
そちらの方法を試したところ、問題なくHTMLが表示されました。
オリジナルのブロックを作ることができるのですね。勉強になります。

しかし、事前に言葉足らずで申し訳ございませんが、
オリジナルのブロックにはHMTLと同時にPHPも記述したいと考えております。
ご提案いただいた方法で以下のように記述してみましたが、PHPの箇所はコメントアウトされてしまいました。

    $bc2 = new block_contents();
    $bc2->title = get_string('content', 'mod_book');
    $bc2->attributes['class'] = 'block block_book_toc';
    $bc2->content = '<?php var_dump("test"); ?><ul><li>Test content1</li><li>Test content2</li><li>Test content3</li></ul>';

    $defaultregion2 = $PAGE->blocks->get_default_region();
    $PAGE->blocks->add_fake_block($bc2, $defaultregion2);

PHPを記述して反映させる方法はご存知でしょうか?

引続き、他の解決手段はないか模索してみます。

Yumu Noma への返信

Re: 特定のページのサイドバーを変更したい

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

mod/book/locallib.phpの188行目あたりにありますように独自の関数 (例 book_get_toc()) を作成されてはいかがでしょうか。

function book_add_fake_block($chapters, $chapter, $book, $cm, $edit = null) {
    global $PAGE, $USER;

    if ($edit === null) {
        if (has_capability('mod/book:edit', context_module::instance($cm->id))) {
            if (isset($USER->editing)) {
                $edit = $USER->editing;
            } else {
                $edit = 0;
            }
        } else {
            $edit = 0;
        }
    }

    $toc = book_get_toc($chapters, $chapter, $book, $cm, $edit);

    $bc = new block_contents();
    $bc->title = get_string('toc', 'mod_book');
    $bc->attributes['class'] = 'block block_book_toc';
    $bc->content = $toc;

    $defaultregion = $PAGE->blocks->get_default_region();
    $PAGE->blocks->add_fake_block($bc, $defaultregion);
}

/**
 * Generate toc structure
 *
 * @param array $chapters
 * @param stdClass $chapter
 * @param stdClass $book
 * @param stdClass $cm
 * @param bool $edit
 * @return string
 */
function book_get_toc($chapters, $chapter, $book, $cm, $edit) {
    global $USER, $OUTPUT;

    $toc = '';
    $nch = 0;   // Chapter number
    $ns = 0;    // Subchapter number
    $first = 1;

    $context = context_module::instance($cm->id);
    $viewhidden = has_capability('mod/book:viewhiddenchapters', $context);
Mitsuhiro Yoshida への返信

Re: 特定のページのサイドバーを変更したい

- Yumu Noma の投稿
ご提案いただきありがとうございます。

そちらの方法を現在試していますが、うまくいきそうです。
丁寧にご説明いただきありがとうございました。