最近のコメント最近のコメント

  • 正誤表を更新しました   2009/11/09 - 14:52

    お手数をおかけして申し訳ありませんでした。
    また、ご意見ありがとうございます。

    1.
    掲題の「8章のP210」を探すのに非常に手間取りました。
    「正誤表」の一覧(/errata)に、「8章 P210」として独立してリストアップされていないので、
    どこにあるか分かりませんでした。

    設定のミスでページャーが有効になっておらず、表示件数が10件となっていたために起こりました。
    現在は表示件数を30にしてページャーも有効にしてありますので今後は起こりません。

    2.
    「正誤表」の一覧(/errata)を、ソート可能にした方が良いのではないでしょうか。
    投稿順や、発覚順だと、読者にとっては、非常に参照しづらいです。

    現在のところ、ソートが必要なほど正誤情報が多くはありませんので、今後多くなった際に検討したいと思います。

    なお、当サイトに掲載したエラッタは翔泳社へも連絡しておりますので、SE Shop内の正誤表で参照することもできます。

  • 正誤表を更新しました   2009/11/09 - 14:01

    はじめまして。
    サイト管理、お疲れ様です。
    正誤表について、2点ばかり、書かせて下さい。

    1.
    掲題の「8章のP210」を探すのに非常に手間取りました。
    「正誤表」の一覧(/errata)に、「8章 P210」として独立してリストアップされていないので、
    どこにあるか分かりませんでした。
    最終的には、個別のノードから、「エラッタ」のリスト(taxonomy/term/17)を見て
    やっと見つけられましたが、「正誤表」一覧にも、記載された方が良いと思います。

    2.
    「正誤表」の一覧(/errata)を、ソート可能にした方が良いのではないでしょうか。
    投稿順や、発覚順だと、読者にとっては、非常に参照しづらいです。
    「掲載順」でのリストが欲しいはずなので、
    その順番で記載されている別ページでも良いかもしれませんし、
    テーブルにしてjQueryのソートでも良いですし、
    何かしら欲しいところです。

    ご多忙とは思いますが、ご検討頂けると幸いです。

  • 第15章「キャッシュ」のP.392の上から15行目に関する質問です   2009/10/07 - 23:39

    ご報告ありがとうございます。
    確認したところ、確かに「P」が抜けていましたので、エラッタに情報を追加しました。

    今後もお気づきの点があればお知らせください。
    よろしくお願いいたします。

  • P.276の「hook_form_FORM_ID_alter」について   2009/09/30 - 18:59

    もしかすると私の認識が間違っていて、著者は単に「このケースのように2つのフォームIDを処理する場合は hook_form_alter() の方を実装するのがよい」と言っているような気もしてきました……。どちらにしても全体には影響を与えない部分なのでご容赦ください。

  • P.276の「hook_form_FORM_ID_alter」について   2009/09/30 - 18:57

    Takafumiさんに提示して頂いたサンプルソースの動作確認をすれば理解出来る事なのですが
    「やらかし」を連発している私なので
    テーマの章で同じような解説がありましたが
    まだ、読み落としている箇所があるかと思い
    ご確認させて頂いた次第です。
    ご丁寧な回答ありがとうございました。

  • P.276の「hook_form_FORM_ID_alter」について   2009/09/30 - 18:18

    確かに、書籍の文章は少々わかりづらいかもしれませんね。

    特定のケース == hook_form_alter() と hook_form_FORM_ID_alter() の両方で'user_login'を処理した場合

    hook_form_alter()の最初の形式が優先 == hook_form_FORM_ID_alter() ではなく hook_form_alter() での処理が優先される

    という認識でよいと思います。
    つまり、先に挙げたサンプルを実行するとわかるように、はじめに hook_form_FORM_ID_alter() が、次に hook_form_alter() がコールされるため、どちらでも同じフォームIDに対して処理を行えば必然的に後者の処理が反映されるということです。

  • P.276の「hook_form_FORM_ID_alter」について   2009/09/30 - 17:11

    Drupal「user」パスの件も含めて、大変参考になりました。
    そこで、もう一つお尋ねしたいのですが
    P.276の上から6行目に記述される
    「この特定のケースでは、hook_form_alter()の最初の形式が優先されます。」とありますが
    「hook_form_alter()の最初の形式」とは何を指しているのですか?

  • P.276の「hook_form_FORM_ID_alter」について   2009/09/30 - 16:35

    現象的にはその理解もあながち間違ってはいないのですが、より正しく理解してもらうために補足します。

    「user_login」は、Drupalパス'user'(つまり、uriが http://example.com/?q=user や http://example.com/user)にアクセスした場合に表示されるフォームのIDであり、「user_login_block」はどのページにでも表示可能なユーザログイン用のブロックに使用されるフォームIDです。

  • P.276の「hook_form_FORM_ID_alter」について   2009/09/30 - 16:18

    hook_form_FORM_ID_alter() の実装に必要なのは、関数名を『モジュール名 + 'form' + フォームID + 'alter'』で命名するということ以外にはありません。
    コールされないのであれば、0829さんのコメントにもあるように、フォームID「user_login」と「user_login_block」を混同されているのではと思います。

    以下、非常に簡単なコードですが、formexample.module に実装すれば、「どのページ」で「どの関数」が「どの順序」でコールされるかがわかると思いますので参考にしてください。

    function formexample_form_alter(&$form, &$form_state, $form_id) {
      switch ($form_id) {
        case 'user_login':       // ?q=user
        case 'user_login_block': // 
        case 'user_pass':        // ?q=user/password
        case 'user_register':    // ?q=user/register
          drupal_set_message('formexample_form_alter()');
      }
    }
    
    function formexample_form_user_login_alter(&$form, &$form_state) {
      drupal_set_message('formexample_form_user_login_alter()');
    }
    
    function formexample_form_user_login_block_alter(&$form, &$form_state) {
      drupal_set_message('formexample_form_user_login_block_alter()');
    }
    
    function formexample_form_user_pass_alter(&$form, &$form_state) {
      drupal_set_message('formexample_form_user_pass_alter()');
    }
    
    function formexample_form_user_register_alter(&$form, &$form_state) {
      drupal_set_message('formexample_form_user_register_alter()');
    }
    
  • P.276の「hook_form_FORM_ID_alter」について   2009/09/30 - 16:14

    つまり、トップページに紐付くログインブロック(ログインフォーム)ではなく
    匿名ユーザーが閲覧できるトップページに掲載されるコンテンツに対して
    投稿する場合にログインする、フォームを変更対象にしているという事だったんですね。
    ホントに毎回、申し訳ないです。
    でも、物凄く勉強になります。
    有難うございます、お世話をかけました。

  • P.276の「hook_form_FORM_ID_alter」について   2009/09/30 - 13:29

    「ログインフォーム」に対する変更は「hook_form_FORM_ID_alter」で実装可能です。
    例えば、P.275 の「特定のフォームの変更」に記載されている「hook_form_FORM_ID_alter」の使用例(コード)は、正しく動作します。

    ※ P.276 でも少し触れられていますが、「http://example.com/?q=user ページのログインフォーム(user_login)」と「ユーザブロックに表示されるログインフォーム(user_login_block)」は別のものですので、ご注意ください。

  • P244の「ボーナスサンプル:Pending usersブロックの追加」について   2009/09/29 - 21:03

    いつも、ご丁重なご回答ありがとうございます。
    また、今後単純な思い込みが無いように気をつけます。
    ご迷惑おかけしました。

  • P244の「ボーナスサンプル:Pending usersブロックの追加」について   2009/09/29 - 16:30

    そのとおりです。

    なお、書籍内には確かに理解しづらい文章もあるかと思います。 そのような場合は遠慮なくご質問いただいて結構なのですが、今回のように単純な思い込みから誤読している場合もありますので、何度か読み直してから質問するようにしていただけると幸いです。

  • P244の「ボーナスサンプル:Pending usersブロックの追加」について   2009/09/29 - 02:36

    『管理者の承認待ちのユーザアカウントを一覧表示』するためのコードで
    『管理者の承認待ちのコメントを持つユーザアカウントを一覧表示』するのではないという理解で宜しいでしょうか?

    つまり
    『ユーザーの設定』→『ユーザ登録の設定』→『訪問者が新規アカウントを作成できる(管理者の承認が必要) 』をチェックしておき
    『新規アカウントの作成 』をした未承認のユーザーの一覧を表示する為の、サンプルソースという事なのですね。

    ん~~、Drupal以前に日本語の理解が足らんかったなー
    あかんなー。。。

  • P244の「ボーナスサンプル:Pending usersブロックの追加」について   2009/09/28 - 22:49

    根本的な認識に誤りがあるようです。
    このサンプルコードは、それまで説明している approval.module のものではなく、userapproval.module という別のモジュールを想定したものです。
    また、『管理者の承認待ちのユーザアカウントを一覧表示』するものですのでコメントは関係ありません。(コードの前の説明もよく読んでください^^;)

  • P164の「menuコールバックの変更」について   2009/09/28 - 12:29

    いえ、私も、titou36jp さんからご質問をいただくまでは全く気付いていませんでしたので...^^;
    titou36jp さんに感謝です。 ありがとうございました。

    なお、タイトルに関しても、文章およびコードの変更に合致させるため、変更ということで良いと思います。(念の為)

  • P175の「collapse.js」について   2009/09/27 - 23:56

    C → C++ → javaと経験してきましたが
    PHPが一番手ごわいと感じる今日この頃です。
    自分のサイトDrupalで立ち上げるぞぉ~~~~!!!
    意気込みだけですが...

  • P175の「collapse.js」について   2009/09/27 - 22:19

    原著のコードのままなのですが、コードの可読性の悪さにも問題があったように思います。
    これに懲りず頑張って勉強してください。

  • P164の「menuコールバックの変更」について   2009/09/27 - 22:11

    titou36jpさんの疑問から、結果的に書籍内の誤りを修正することができ、感謝しています。
    今後も何か疑問に感じた点があれば遠慮なくご投稿ください。

  • P164の「menuコールバックの変更」について   2009/09/27 - 22:09

    0829さんからのご指摘がなければコードの不具合に気づかないところでしたので感謝しています。
    なお、セクションのタイトルは「ダイレクトリンクの削除」の方が適当かと思いましたので、そのように変更し、言及しておきました。

  • P175の「collapse.js」について   2009/09/27 - 02:36

    大変失礼しました。
    javaと違った独特のコーディング規約なので
    違和感があるというか、やはり日々勉強ですね。
    頑張ります。

  • P175の「collapse.js」について   2009/09/26 - 18:36

    16行目に print がありますが、それを見落としているのではないでしょうか?

  • P164の「menuコールバックの変更」について   2009/09/26 - 02:12

    お手数おかけしました。
    有難うございます。

    CMS、PHP共に初体験なため
    意味不明な質問をするかと思いますが
    これからも宜しくお願い致します。

  • P164の「menuコールバックの変更」について   2009/09/26 - 00:17

    見当違いな指摘ではなかったようで、安心しました。^^;

    修正案に関しましては、密かに hook_menu_link_alter() を使った方が... と思っていましたので、コードに対する説明文も含め、良いと思います。

  • P164の「menuコールバックの変更」について   2009/09/25 - 17:51

    p.164 の当該箇所の説明を以下のように修正しようと思いますが、いかがでしょうか? > titou36jpさん、0829さん、あるいはすべての読者の皆さん

    ここでの説明は、『「コンテンツの作成」ページにリンクを追加するために hook_menu() は不要』ということと、『必要に応じてそれらも変更可能』ということを説明しているのだと思いますし、パーミッション云々はこの後で説明と実装がされていますので、この段階で説明するのは適当ではないように思います。
    ですので、単に『ダイレクトリンクを追加したくない場合は削除可能』という点に絞った説明とコードに変更してみました。
    ちなみに変更後のコードは、リンクは非表示となりますが、ダイレクトにアクセスすることは可能というものです。

    セクションのタイトル

    ■ menuコールバックの変更
    ↓↓↓
    ■ メニュー項目の変更
    

    文章

    ダイレクトリンクを追加したくない場合は、hook_menu_alter()を使用して削除することが
    できます。例えば次のコードは、「ノードの管理」 権限を持たないユーザからページを削除す
    るコードです。
    ↓↓↓
    ダイレクトリンクを追加したくない場合は、hook_menu_link_alter()を使用して削除することが
    できます。例えば次のコードは、「jokeの作成」ページへのダイレクトリンクを非表示にする
    コードです。
    

    コード

    /**
     * hook_menu_alter()の実装
     */
    function joke_menu_alter(&$callbacks) {
      // ユーザが「ノードの管理」権限を持たない場合、
      // access callbackをFALSEに設定してjokeメニュー項目を無効にする
      if (!user_access('administer nodes')) {
        $callbacks['node/add/joke']['access callback'] = FALSE;
        // デフォルトのアクセスコールバックとしてuser_access()を使用されないために、
        // access argumentsを破棄する必要がある
        unset($callbacks['node/add/joke']['access arguments']);
      }
    }
    
    ↓↓↓
    
    /**
     * hook_menu_link_alter()の実装
     */
    function joke_menu_link_alter(&$item, $menu) {
      // 「jokeの作成」ページへのダイレクトリンクを非表示にする
      if ($item['link_path'] == 'node/add/joke') {
        $item['hidden'] = 1;
      }
    }