「hook_menu_alter()がコールされるタイミングは、モジュールが有効で、かつ、メニューが構築される際」 と、ご指摘されているタイミングなのですが それは、例えば「joke」モジュールが有効であり、かつ「コンテンツの作成」リンクを押下するタイミングでしょうか? 私の知識不足なのでしょうが、「joke」モジュールを「無効」→「有効」に切り替えるタイミングでしか hook_menu_alter()がコールされません。
正しくは「menu_routerテーブルが再構築されるタイミング」となり、p.92 や p.32 にいくつかの例が掲載されていますので参考にしてください。(メニュー再構築の必要がある箇所が書籍内に何箇所かあると思います)
なお、先の私のコメントで「コードは正しく動作します」と書きましたが、0829さんから「このコードは誤りではないか?」とのご指摘を受け、再度検証してみました。 その結果、コード自体は動作するものの、書籍で説明している内容のとおりにはゆかず、権限を所有しているかどうかにかかわらず、すべてのユーザがアクセス不可となることがわかりました。 これは、先述のとおり、hook_menu_alter()がmenu_routerテーブルが再構築される際にしかコールされないため、権限をチェックして動的にアクセスコールバックを変更することができないためです。 これを回避するためには、アクセスコールバックに独自関数を定義し、その関数内で権限のチェックを行えばよいかと思いますが、このページで説明していることを実現する方法は他にもあるようにも思いますので、後ほど何らかのコードを考えてみたいと思います。 さしあたり、そのコードは原著の誤りであると認識してください。
ご指摘通り administer nodes」権限も無しでモジュールのインストール可能なロールを設定して確認したところ 動作致しました。 ご指摘ありがとうございました。
ただ、一点ご質問させてください。 「hook_menu_alter()がコールされるタイミングは、モジュールが有効で、かつ、メニューが構築される際」 と、ご指摘されているタイミングなのですが それは、例えば「joke」モジュールが有効であり、かつ「コンテンツの作成」リンクを押下するタイミングでしょうか? 私の知識不足なのでしょうが、「joke」モジュールを「無効」→「有効」に切り替えるタイミングでしか hook_menu_alter()がコールされません。 確認方法としては、ログ出力とPDTでブレークポイントを貼ってステップ実行して確認しているのですが ご教授して頂けると有りがたいです。
ご回答ありがとうございます。 まず、ご指摘の該当ページの件ですが おっしゃる通り、「P.164 」でした、申し訳ありません。
また、「ノードの管理(administer nodes)権限は持たず、モジュールのインストール権限を持つユーザ」に関しましても ご指摘の通り、新規ユーザーを作成してロール単位で権限を設定したところ 動作する事が確認できました。
経験の浅い自分にとっては、大変ありがたいご指摘を頂き 有難うございます。
P174の「menuコールバックの変更」について
正しくは p.164 ですのでタイトルを修正しました。
自分の理解ですと「administer nodes」権限を持つユーザーは「管理者」であると認識しています。 また、「hook_menu_alter()」がDrupalからコールされるタイミングは モジュールを有効にした場合のみ つまり、「管理者」以外はモジュールを有効に出来ないと理解しています。
根本的な認識に誤りがあるようです。 Drupalでは、自動的にすべての権限を持つスーパーユーザ(ユーザIDが1)以外は、ロールごとにあらゆる権限の許可・不許可を設定することができ、「administer nodes」権限も例外ではありません。 おそらく、他のCMSなどに見られる単純な権限区分(管理者・登録ユーザ・ゲストなど)が念頭にあるのだと思いますが、Drupalではその「管理者」の定義は当てはまりません。 また、hook_menu_alter()がコールされるタイミングは、モジュールが有効で、かつ、メニューが構築される際です。
従いまして if (!user_access('administer nodes')) { $callbacks['node/add/joke']['access callback'] = FALSE; unset($callbacks['node/add/joke']['access arguments']); } の条件が通り、上記のif文内のブロックが実行される場合は有るのでしょうか?
このコードは正しく動作します。
完全にすべての権限を持っているユーザを「管理者」とするのであれば、Drupal では、インストール時に作成する特別なユーザ(「ユーザ ID が "1" のユーザ」や「スーパーユーザ」などと呼ばれます)がそれに当たると思います。
ただ、Drupal では、ユーザ ID が "1" のユーザを除くすべてのユーザは、必ずいずれかのロールに属すことになり、それぞれのロール単位で詳細な権限の設定を行うことができるようになっていますので、どんなユーザでも、設定によっては "ノードの管理(administer nodes)権限は持たず、モジュールのインストール権限を持つユーザ" になり得ます。
ですので、「if (!user_access('administer nodes')) 」の条件を満たすことは可能かと...
なお、P.174 にて該当部分を見つけられませんでしたので、見当違いの回答になっていた場合にはご容赦ください。
[修正:該当箇所は P.164 ページだったようですので、タイトルのみ変更させて頂きました。]
ご報告ありがとうございます。
ご指摘のとおり、値の取得は variable_get() を使用しますのでタイポですね。 原著に誤りはありませんでしたので、編集時に誤ってしまったようです。
また何か気づきましたらご報告よろしくお願いいたします。
コードを確認したところ、この関数では $form_state['values'] を $form_values に受け取っていますので、ご指摘のとおり
user_authenticate_finalize($form_values);
が正解ですね。 原著にあったtypoですが、編集時に気づきませんでしたので、エラッタに追加させていただきます。
今後も何か気づいた点があれば、ご報告いただければ幸いです。
ご報告ありがとうございます。 確かにタイポですので正誤表に追加しました。 原著にあるタイポなのですが、編集時に気づきませんでした。
また何か気づいた点があれば、ご報告いただければ幸いです。
この投稿を読み、当該箇所の前後を読み直してみました。 結論はすでに0829さんが回答されているとおりで、このコードは仕様どおりの振る舞いを見せます。 しかしsparrow999さんが仰るとおり、他のページでもタイトルが変更されてしまうのはここでの説明としては正しくないような気がします。
編集時には気がつきませんでしたが、おそらく筆者の勘違いと判断して間違いはなさそうですので、次のように訂正したいと思います。
訂正箇所: 第4章 p.83 ページ下部のコードブロック
誤:
function menufun_title() { drupal_set_title(t('The page title')); $now = format_date(time()); return t('It is now @time', array('@time' => $now)); }
正:
function menufun_hello() { drupal_set_title(t('The page title')); return t('Hello!'); }
このような情報は大変有用ですので、また何かおかしな点を見つけた際にはご報告いただければ幸いです。
0829さんのコメントを読んで、title callback 関数の挙動がわかりました。 ご説明のとおり、 「drupal_set_title(t('The Page Title'));」を、 page callback 関数内に移動したら、想定通りになりました。
私は、Drupalを学習し始めたばかりですので、 Drupalは私にとってはまだまだ謎だらけですが、 本書を読んで、その謎を少しでも理解できるようにしていきたいと考えております。
今回は、どうもありがとうございました。
書籍通りのコードを実行すると、sparrow999 さんのおっしゃる通り、ほぼ全てのページのページタイトル(とブラウザのタイトルバー)が全て「The Page title」となるはず...です。
title callback はメニュー項目を構築する時点で実行されるので、そのメニュー項目が表示される全てのページのタイトルが変更されてしまいます。 ですので、もしも、メニューページ(メニュー項目のリンク先ページ)のタイトルのみを変更したいのであれば、page callback で指定した関数内にページタイトルを設定してみてください。
midoribi さん、はじめまして。
この書籍に限ったことではありませんが、情報が一冊にまとまっているというのは便利ですよね。 Web も書籍も、それぞれに利点があると思いますので、書籍で基本情報を押さえておいて、さらに drupal.org で最新の技術情報を追跡するなどのように、相互に活用できればバッチリですね!
この書籍を活用して、現在対応中の Drupal プロジェクトも頑張ってください。
Drupal6のプロジェクトを何本か対応しております。 現状、Drupal.orgの内容は充実しており、技術資料については、問題ないと思っておりましたが、全て英語なので、 新しくプロジェクトに参加する技術者さんなどに、 こちらの本は、非常に参考になります。 CMSカスタマイズの本は多いですが、開発などで、CMSを扱う際には、やはり情報が少なく、このような書籍が出てくるのを待ってました。 これを機に開発などでDrupalを使用するプロジェクトが増えていくと良いですね(^^
0829さんのサイトもいつも参考にさせてもらっております。
ありがとうございます! 心強いです。 まずは自分なりに頑張ってます!
Drupal モジュールは、簡単に動作する PHP アプリケーションとも言えそうなので、そういう意味では、この書籍は PHP の学習にも十分に役に立つと思います。
私もまだまだ勉強中の身ですので、大きなことは言えませんが、書籍を読んでいて疑問に感じた部分などがあれば、何かしらコメントをつけさせていただきたいと思いますので、ぜひ、こちらのサイトへご投稿ください。
コメントありがとうございます。
いえいえ、英語のレベルも高くはないですが、なんとなしに読む程度です(汗) 一番の開発レベルが低いので、0829さんのサイトや英語サイト等で情報集めながら 自分なりにレベルアップしようとしている段階です。英語版で使えそうなモジュールがあれば人柱隊でいれて みて、使ってみたりとか(笑) phpが少しでも分かるようになりたいです。(ちょっとしたモジュールの改造もできるようになれれればと)
これからもどうぞよろしくお願いいたします。
shinshin さん、はじめまして。
英語版を購入されているのですね! 洋書なら、テーマ関連に特化した書籍や Views + CCK の活用方法などが解説された書籍などもあるようですので、必要に応じて活用できれば、あれこれ悩むよりもずっと効率が上がるのでしょうね... 英語 NG の私としては、うらやましい限りです。
日本語版は、翻訳と同時に、エラッタの適用や原著の誤りの修正なども行っていますので、その辺りもプラスの要素になるのではないかと思います。
初めまして!
英語版の本を買って読んでみてたのですが、分かり難かったところなど 日本語版で勉強しながら、読み比べていると英語サイトの勉強になるので一石二鳥以上の 効果があるので、到着が楽しみです。 ありがとうございます!
ありがとうございます これからも宜しくお願いいたします。
bkenro さん、はじめまして。
この書籍は、原著がすばらしいものでしたから、私自身、本当に勉強になりました。 Drupal をより思い通りにカスタマイズしたいのであれば、読んでおいて損はないと思います。
私は、監修協力ということで、翻訳作業自体は行っていないのですが、その分、コードのチェックなどはしっかり行わせていただいていますので、書籍を読んで、何か疑問などがあれば、こちらのサイトへご投稿下さい。 できるだけ迅速にコメントさせていただきたいと思います。
はじめまして。 さっそく、優待購入させていただきました。 今後この本にはボロボロになるまでお世話になることになると思います。 膨大な翻訳作業、本当にお疲れさまでした。 本が届くのを楽しみに待ちます。 ありがとうございました。
当サイトは独立したサイトとなっておりますので、Drupal Japan 等のアカウントでログインすることはできません。 お手数ですが当サイト用のアカウントを取得してログインしてください。
Free web analytics, website statistics
正しくは「menu_routerテーブルが再構築されるタイミング」となり、p.92 や p.32 にいくつかの例が掲載されていますので参考にしてください。(メニュー再構築の必要がある箇所が書籍内に何箇所かあると思います)
なお、先の私のコメントで「コードは正しく動作します」と書きましたが、0829さんから「このコードは誤りではないか?」とのご指摘を受け、再度検証してみました。
その結果、コード自体は動作するものの、書籍で説明している内容のとおりにはゆかず、権限を所有しているかどうかにかかわらず、すべてのユーザがアクセス不可となることがわかりました。
これは、先述のとおり、hook_menu_alter()がmenu_routerテーブルが再構築される際にしかコールされないため、権限をチェックして動的にアクセスコールバックを変更することができないためです。
これを回避するためには、アクセスコールバックに独自関数を定義し、その関数内で権限のチェックを行えばよいかと思いますが、このページで説明していることを実現する方法は他にもあるようにも思いますので、後ほど何らかのコードを考えてみたいと思います。
さしあたり、そのコードは原著の誤りであると認識してください。
ご指摘通り
administer nodes」権限も無しでモジュールのインストール可能なロールを設定して確認したところ
動作致しました。
ご指摘ありがとうございました。
ただ、一点ご質問させてください。
「hook_menu_alter()がコールされるタイミングは、モジュールが有効で、かつ、メニューが構築される際」
と、ご指摘されているタイミングなのですが
それは、例えば「joke」モジュールが有効であり、かつ「コンテンツの作成」リンクを押下するタイミングでしょうか?
私の知識不足なのでしょうが、「joke」モジュールを「無効」→「有効」に切り替えるタイミングでしか
hook_menu_alter()がコールされません。
確認方法としては、ログ出力とPDTでブレークポイントを貼ってステップ実行して確認しているのですが
ご教授して頂けると有りがたいです。
ご回答ありがとうございます。
まず、ご指摘の該当ページの件ですが
おっしゃる通り、「P.164 」でした、申し訳ありません。
また、「ノードの管理(administer nodes)権限は持たず、モジュールのインストール権限を持つユーザ」に関しましても
ご指摘の通り、新規ユーザーを作成してロール単位で権限を設定したところ
動作する事が確認できました。
経験の浅い自分にとっては、大変ありがたいご指摘を頂き
有難うございます。
正しくは p.164 ですのでタイトルを修正しました。
根本的な認識に誤りがあるようです。
Drupalでは、自動的にすべての権限を持つスーパーユーザ(ユーザIDが1)以外は、ロールごとにあらゆる権限の許可・不許可を設定することができ、「administer nodes」権限も例外ではありません。
おそらく、他のCMSなどに見られる単純な権限区分(管理者・登録ユーザ・ゲストなど)が念頭にあるのだと思いますが、Drupalではその「管理者」の定義は当てはまりません。
また、hook_menu_alter()がコールされるタイミングは、モジュールが有効で、かつ、メニューが構築される際です。
このコードは正しく動作します。
完全にすべての権限を持っているユーザを「管理者」とするのであれば、Drupal では、インストール時に作成する特別なユーザ(「ユーザ ID が "1" のユーザ」や「スーパーユーザ」などと呼ばれます)がそれに当たると思います。
ただ、Drupal では、ユーザ ID が "1" のユーザを除くすべてのユーザは、必ずいずれかのロールに属すことになり、それぞれのロール単位で詳細な権限の設定を行うことができるようになっていますので、どんなユーザでも、設定によっては "ノードの管理(administer nodes)権限は持たず、モジュールのインストール権限を持つユーザ" になり得ます。
ですので、「if (!user_access('administer nodes')) 」の条件を満たすことは可能かと...
なお、P.174 にて該当部分を見つけられませんでしたので、見当違いの回答になっていた場合にはご容赦ください。
[修正:該当箇所は P.164 ページだったようですので、タイトルのみ変更させて頂きました。]
ご報告ありがとうございます。
ご指摘のとおり、値の取得は variable_get() を使用しますのでタイポですね。
原著に誤りはありませんでしたので、編集時に誤ってしまったようです。
また何か気づきましたらご報告よろしくお願いいたします。
ご報告ありがとうございます。
コードを確認したところ、この関数では $form_state['values'] を $form_values に受け取っていますので、ご指摘のとおり
が正解ですね。
原著にあったtypoですが、編集時に気づきませんでしたので、エラッタに追加させていただきます。
今後も何か気づいた点があれば、ご報告いただければ幸いです。
ご報告ありがとうございます。
確かにタイポですので正誤表に追加しました。 原著にあるタイポなのですが、編集時に気づきませんでした。
また何か気づいた点があれば、ご報告いただければ幸いです。
この投稿を読み、当該箇所の前後を読み直してみました。
結論はすでに0829さんが回答されているとおりで、このコードは仕様どおりの振る舞いを見せます。 しかしsparrow999さんが仰るとおり、他のページでもタイトルが変更されてしまうのはここでの説明としては正しくないような気がします。
編集時には気がつきませんでしたが、おそらく筆者の勘違いと判断して間違いはなさそうですので、次のように訂正したいと思います。
訂正箇所:
第4章 p.83 ページ下部のコードブロック
誤:
正:
このような情報は大変有用ですので、また何かおかしな点を見つけた際にはご報告いただければ幸いです。
0829さんのコメントを読んで、title callback 関数の挙動がわかりました。
ご説明のとおり、
「drupal_set_title(t('The Page Title'));」を、
page callback 関数内に移動したら、想定通りになりました。
私は、Drupalを学習し始めたばかりですので、
Drupalは私にとってはまだまだ謎だらけですが、
本書を読んで、その謎を少しでも理解できるようにしていきたいと考えております。
今回は、どうもありがとうございました。
書籍通りのコードを実行すると、sparrow999 さんのおっしゃる通り、ほぼ全てのページのページタイトル(とブラウザのタイトルバー)が全て「The Page title」となるはず...です。
title callback はメニュー項目を構築する時点で実行されるので、そのメニュー項目が表示される全てのページのタイトルが変更されてしまいます。
ですので、もしも、メニューページ(メニュー項目のリンク先ページ)のタイトルのみを変更したいのであれば、page callback で指定した関数内にページタイトルを設定してみてください。
midoribi さん、はじめまして。
この書籍に限ったことではありませんが、情報が一冊にまとまっているというのは便利ですよね。
Web も書籍も、それぞれに利点があると思いますので、書籍で基本情報を押さえておいて、さらに drupal.org で最新の技術情報を追跡するなどのように、相互に活用できればバッチリですね!
この書籍を活用して、現在対応中の Drupal プロジェクトも頑張ってください。
Drupal6のプロジェクトを何本か対応しております。
現状、Drupal.orgの内容は充実しており、技術資料については、問題ないと思っておりましたが、全て英語なので、
新しくプロジェクトに参加する技術者さんなどに、
こちらの本は、非常に参考になります。
CMSカスタマイズの本は多いですが、開発などで、CMSを扱う際には、やはり情報が少なく、このような書籍が出てくるのを待ってました。
これを機に開発などでDrupalを使用するプロジェクトが増えていくと良いですね(^^
0829さんのサイトもいつも参考にさせてもらっております。
ありがとうございます!
心強いです。 まずは自分なりに頑張ってます!
Drupal モジュールは、簡単に動作する PHP アプリケーションとも言えそうなので、そういう意味では、この書籍は PHP の学習にも十分に役に立つと思います。
私もまだまだ勉強中の身ですので、大きなことは言えませんが、書籍を読んでいて疑問に感じた部分などがあれば、何かしらコメントをつけさせていただきたいと思いますので、ぜひ、こちらのサイトへご投稿ください。
コメントありがとうございます。
いえいえ、英語のレベルも高くはないですが、なんとなしに読む程度です(汗)
一番の開発レベルが低いので、0829さんのサイトや英語サイト等で情報集めながら
自分なりにレベルアップしようとしている段階です。英語版で使えそうなモジュールがあれば人柱隊でいれて
みて、使ってみたりとか(笑)
phpが少しでも分かるようになりたいです。(ちょっとしたモジュールの改造もできるようになれれればと)
これからもどうぞよろしくお願いいたします。
shinshin さん、はじめまして。
英語版を購入されているのですね!
洋書なら、テーマ関連に特化した書籍や Views + CCK の活用方法などが解説された書籍などもあるようですので、必要に応じて活用できれば、あれこれ悩むよりもずっと効率が上がるのでしょうね... 英語 NG の私としては、うらやましい限りです。
日本語版は、翻訳と同時に、エラッタの適用や原著の誤りの修正なども行っていますので、その辺りもプラスの要素になるのではないかと思います。
初めまして!
英語版の本を買って読んでみてたのですが、分かり難かったところなど
日本語版で勉強しながら、読み比べていると英語サイトの勉強になるので一石二鳥以上の
効果があるので、到着が楽しみです。
ありがとうございます!
ありがとうございます
これからも宜しくお願いいたします。
bkenro さん、はじめまして。
この書籍は、原著がすばらしいものでしたから、私自身、本当に勉強になりました。
Drupal をより思い通りにカスタマイズしたいのであれば、読んでおいて損はないと思います。
私は、監修協力ということで、翻訳作業自体は行っていないのですが、その分、コードのチェックなどはしっかり行わせていただいていますので、書籍を読んで、何か疑問などがあれば、こちらのサイトへご投稿下さい。
できるだけ迅速にコメントさせていただきたいと思います。
はじめまして。
さっそく、優待購入させていただきました。
今後この本にはボロボロになるまでお世話になることになると思います。
膨大な翻訳作業、本当にお疲れさまでした。
本が届くのを楽しみに待ちます。
ありがとうございました。