Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Drupal モジュール開発入門講座 第3回 フック

Drupal モジュール開発入門講座 第3回 フック

More Decks by アクイアジャパン Acquia Japan

Other Decks in Programming

Transcript

  1. ୈ3ճ ϑοΫ Drupal Ϟδϡʔϧ ։ൃೖ໳ߨ࠲

  2. Drupal Ϟδϡʔϧ։ൃೖ໳ߨ࠲γϦʔζ – DrupalͰ͸ʮϞδϡʔϧʯͱݺ͹ΕΔɺখ͞ͳιϑτ΢ΣΞΛ࣮૷͢Δ͜ͱͰػೳ֦ுΛ ߦ͍·͢ɻຊ΢ΣϏφʔγϦʔζͰ͸ɺDrupalͷϞδϡʔϧ։ൃʹؔ͢Δجૅ஌ࣝΛղઆ ͠·͢ɻ – DrupalͷόοΫΤϯυपΓʹ͍ͭͯମܥతʹֶͼ͍ͨํɺࣗ෼ͰΧελϜϞδϡʔϧΛ࡞ ΕΔΑ͏ʹͳΓ͍ͨํɺΞΫΠΞೝఆσϕϩούʔࢼݧΛ໨ࢦ͢ํʹ͓͢͢ΊͰ͢ɻ –

    DrupalΛҰ௨Γૢ࡞ͨ͜͠ͱ͕͋ΔํΛର৅ͱ͍ͯ͠·͢ɻ·ͩDrupalΛ৮ͬͨ͜ͱ͕ແ ͍ํ͸ɺॳ৺ऀ޲͚DrupalνϡʔτϦΞϧಈըʢ೔ຊޠʣΛઌʹݟ͓ͯ͘ͱΑΓཧղ͕ਂ ·Γ·͢ɻ
  3. ΞδΣϯμ 1. ϑοΫͱ͸ 2. ϑοΫΛ࣮૷͢Δ 3. ར༻ՄೳͳϑοΫΛݟ͚ͭΔ 4. ಠࣗͷϑοΫΛ࡞੒͢Δ 5.

    ࿅श໰୊
  4. ϑοΫͱ͸

  5. ϑοΫͷ֓ཁ – ϑοΫ(Hooks)ͱ͸ɺDrupalͷಈ࡞Λมߋ͢ΔPHPؔ਺Ͱ͢ɻ – ϑοΫΛ࢖༻͢Δ͜ͱͰɺطଘͷίʔυΛॻ͖׵͑Δ͜ͱͳ͘ɺDrupalίΞ΍ଞϞδϡʔϧͷ ಈ࡞Λมߋɾ֦ுͰ͖·͢ɻ – ֤ϑοΫ͸ hook_batch_alter() ͷΑ͏ʹ

    hook_ Ͱ࢝·ΔҰҙͷ໊લɺఆٛࡁΈͷҰ࿈ͷύϥ ϝʔλʔɺఆٛࡁΈͷ໭Γ஋͕༻ҙ͞Ε͍ͯ·͢ɻ https://www.drupal.org/docs/creating-custom- modules/understanding-hooks
  6. ϑοΫͷ࢓૊Έ hook_form_alter modulea_form_alter() moduleb_form_alter() modulec_form_alter() DrupalίʔυͷͲ͔͜ʹ ϑοΫΛݺͼग़͢هड़͕ଘ ࡏ͢Δ ίʔυ಺ͰϑοΫ͕ݺͼग़͞ΕͨΒɺର৅ ϑοΫΛ࣮૷ͨؔ͠਺͕࣮ߦ͞ΕΔ

    ※࣮ߦͷॱং͸ࢦఆͰ͖ͳ͍ …
  7. ϑοΫͰͰ͖Δ͜ͱ – ಛఆͷΞΫγϣϯʹ൓Ԡ͢Δ – طଘͷσʔλΛมߋ͢Δ – ఆٛͨ͠Γ৘ใΛఏڙ͢Δ

  8. ಛఆͷΞΫγϣϯʹ൓Ԡ͢Δ – Drupal಺ͰಛఆͷΞΫγϣϯΛτϦΨʔʹɺ೚ҙͷॲཧΛ࣮ߦͰ͖·͢ɻ – ྫɿhook_user_cancel() … ϢʔβʔΞΧ΢ϯτ͕Ωϟϯηϧ͞ΕͨࡍʹൃՐ͢ΔϑοΫ ʮϢʔβʔΩϟϯηϧʯΛτϦΨʔ ϑοΫ࣮ߦલ Ϣʔβʔ͕Ωϟ

    ϯηϧ͞ΕΔ ͱɺ࡞੒ऀ͕ಗ ໊ʹมߋ͞ΕΔ ϑοΫ࣮ߦޙ
  9. طଘͷσʔλΛมߋ͢Δ – ఆٛࡁΈͷσʔλΛαΠτ্ʹදࣔ͢Δલʹ্ॻ͖Ͱ͖·͢ɻ – ͜ͷΑ͏ͳϑοΫ͸ɺ໊લʹ _alter ͕͍͍ͭͯΔ͜ͱ͕ଟ͍Ͱ͢ɻ – ྫɿhook_form_alter() …

    ϑΥʔϜ͕ϨϯμϦϯά͞ΕΔલʹมߋΛ࣮ߦ͢Δ ίϝϯτϑΥʔϜͷ ૹ৴Ϙλϯͷ஋Λม ߋ͢Δ
  10. ఆٛͨ͠Γ৘ใΛఏڙ͢Δ – Ϧετʹ߲໨Λ௥Ճͨ͠Γɺ৘ใΛఆٛ͢Δࡍʹར༻Ͱ͖·͢ɻ – Drupal 7Ͱ͸ϑοΫͰ৘ใΛఆ͍ٛͯ͠·͕ͨ͠ɺDrupal 8Ҏ߱͸ϓϥάΠϯγε ςϜͰߦΘΕΔΑ͏ʹͳΓ·ͨ͠ɻ – ྫɿhook_toolbar()

    … πʔϧόʔʹ߲໨Λ௥Ճ͢ΔϑοΫ
  11. ϑοΫΛ࣮૷͢Δ

  12. ϑοΫͷ࣮૷ํ๏ 1. ར༻͍ͨ͠ϑοΫΛAPIυΩϡϝϯτ͔Β୳͠·͢ɻ 2. ؔ਺ͷαϯϓϧίʔυΛ*.moduleϑΝΠϧʹίϐʔ͠·͢ɻ 3. ؔ਺໊ͷ hook ෦෼ΛϞδϡʔϧͷϚγϯ໊ʹஔ͖׵͑·͢ɻ
 ྫɿhook_form_alter

    -> marucha_form_alte r 4. ؔ਺ͷத਎Λهड़͠·͢ɻ
  13. υΩϡϝϯτͷݟํ ֤ϑοΫͷυΩϡϝϯτϖʔδͰ͸ɺओ ʹ࣍ͷઆ໌͕͋Γ·͢ɻ ϑοΫͷઆ໌ ؔ਺ͷҾ਺ ϑοΫͷ࣮૷ྫ
 ʢ*.moduleϑΝΠϧʹίϐ ϖͰ͖·͢ʣ ໭Γ஋

  14. ϑοΫͷ࣮૷ྫ <?php use Drupal\Core\Form\FormStateInterface; /** * Implements hook_form_alter(). */ function

    marucha_form_alter(&$form, FormStateInterface $form_state, $form_id) { if ($form_id == 'comment_comment_form') { $form['actions']['submit']['#value'] = 'Comment!'; } } hook_form_alterؔ਺Λ࢖༻࣮ͨ͠૷ྫͰ͢ɻ marucha.module
  15. ϑοΫͷ࣮૷ྫ <?php use Drupal\Core\Form\FormStateInterface; /** * Implements hook_form_alter(). */ function

    marucha_form_alter(&$form, FormStateInterface $form_state, $form_id) { if ($form_id == 'comment_comment_form') { $form['actions']['submit']['#value'] = 'Comment!'; } } DocComment Ͱؔ਺ͷઆ໌ Λهड़͠· ͢ɻ ؔ਺໊Λ hook -> maruch a ʹॻ͖׵͑· ͢ɻ hook_form_alterؔ਺Λ࢖༻࣮ͨ͠૷ྫͰ͢ɻ marucha.module ϑοΫ͕ൃՐͨ͠ࡍʹ ࣮ߦ͍ͨ͠ॲཧΛهड़͠· ͢ɻ ϑοΫʹΑͬͯ͸Ҿ਺΍໭Γ஋ ͕༻ҙ͞Ε͍ͯΔ΋ͷ͕͋Γ· ͢ɻ
  16. ࢀߟ) VS CodeͰར༻Մೳͳ֦ுػೳ Visual Studio CodeͰ͸ɺDrupal Smart Snippets ͱ͍͏ϑοΫΛิ׬ͯ͘͠ΕΔศ རͳ֦ுػೳ͕༻ҙ͞Ε͍ͯ·͢ɻ

    https://marketplace.visualstudio.com/items? itemName=andrewdavidblum.drupal-smart-snippets
  17. ԋश ϑοΫΛ࣮૷ͯ͠ΈΑ͏ʂ 1. ΧελϜϞδϡʔϧͷσΟϨΫτϦ௚Լʹ
 marucha.moduleϑΝΠϧΛ࡞੒͢Δ 2. ར༻(࣮૷)͍ͨ͠ϑοΫΛυΩϡϝϯτ͔Β୳ͯ͠ɺϑοΫͷίʔυΛ ίϐʔͯ͠marucha.moduleϑΝΠϧʹϖʔετ͢Δ 3. ؔ਺໊ͷ

    hook_ ෦෼Λ marucha_ (ϞδϡʔϧͷϚγϯ໊)ʹॻ͖׵͑Δ 4. ؔ਺಺Ͱ࣮ߦ͢ΔॲཧΛهड़͢Δ
  18. ར༻ՄೳͳϑοΫΛݟ͚ͭΔ

  19. ϑοΫ͸Ͳ͔͜Βఏڙ͞ΕΔʁ – ίΞ – ίϯτϦϏϡʔτϞδϡʔϧ – ΧελϜϞδϡʔϧ

  20. ར༻ՄೳͳϑοΫΛݟ͚ͭΔํ๏ – api.drupal.org ͷϑοΫϖʔδΛࢀর͢Δ – ίʔυϕʔε͔Β *.api.php ϑΝΠϧΛ୳͢

  21. api.drupal.org ͷϑοΫϖʔδΛࢀর͢Δ – api.drupal.org͸ɺDrupalίΞͷιʔείʔυʹຒΊࠐ·Εͨίϝϯτ͔Βੜ੒͞Εͨ DrupalͷAPIϦϑΝϨϯεͰ͢ɻϑοΫϖʔδ͔ΒࢀরͰ͖·͢ɻ – Drupal 9.4.x࣌఺Ͱ͸ɺ286ݸͷϑοΫ͕ίΞ͔Βఏڙ͞Ε͍ͯΔ͜ͱ͕෼͔Γ·͢ɻ – ίΞͰఆٛ͞Ε͍ͯΔϑοΫͷΈͰɺίϯτϦϏϡʔτϞδϡʔϧ΍ΧελϜϞ

    δϡʔϧͰఆٛ͞ΕͨϑοΫ͸͔͜͜ΒࢀরͰ͖·ͤΜɻ
  22. ίʔυϕʔε͔Β *.api.php ϑΝΠϧΛ୳͢ – ͢΂ͯͷϑοΫ͸ɺ*.api.php ͰυΩϡϝϯτ͕ఏڙ͞Ε͍ͯ· ͢ɻ – Drupalιʔείʔυ͔Β *.api.php

    ϑΝΠϧΛ୳͢͜ͱͰɺDrupal αΠτͰར༻ՄೳͳϑοΫΛݟ͚ͭΔ͜ͱ͕Ͱ͖·͢ɻ
  23. ಠࣗͷϑοΫΛ࡞੒͢Δ

  24. ΧελϜϞδϡʔϧͰಠࣗͷϑοΫΛ࡞੒͢Δํ๏ 1. ϞδϡʔϧʹҰҙͷ໊લΛ෇͚·͢ɻ 2. *.api.php ϑΝΠϧʹυΩϡϝϯτΛهड़͠·͢ɻ 3. module_handlerαʔϏεΛ࢖༻ͯ͠ϑοΫΛݺͼग़͠· ͢ɻ

  25. ϑοΫͷ໊લΛܾΊΔ – hook_ Ͱ࢝·ΔϑοΫ໊ΛܾΊ·͢ɻ – ϑοΫ໊ͷҰҙੑΛ࣮֬ʹ͢ΔͨΊʹɺ hook_ ͷޙ Ζ͸ϞδϡʔϧͷϚγϯ໊Λ෇͚Δ͜ͱ͕ҰൠతͰ ͢ɻ

    – ྫɿhook_marucha_hello_world ϞδϡʔϧͷϚγϯ໊
  26. ϑοΫΛυΩϡϝϯτԽ͢Δ – ϞδϡʔϧσΟϨΫτϦʹ *.api.php ϑΝΠϧΛ࡞੒͠ɺϑοΫΛจॻԽ͠·͢ɻ – *.api.php Ͱهड़ͨ͠ίʔυ͸࣮ߦ͞Ε·ͤΜɻ /** *

    Hello world hook. * * This hook allows you to do something * when node loaded using hook_ENTITY_TYPE_view(). */ function hook_marucha_hello_world() { \Drupal::messenger() ->addStatus('Hello world!'); } marucha.api.php DocCommentͰ࣍ͷ৘ใΛఏڙ͠·͢ɻ • ϑοΫͷઆ໌ • ύϥϝʔλʢ͋Ε͹ʣ • ໭Γ஋ʢ͋Ε͹ʣ αϯϓϧίʔυΛఏڙ͠· ͢ɻαϯϓϧίʔυͳͷͰ࣮ ߦ͞Ε·ͤΜɻ
  27. ϑοΫΛݺͼग़͢ – module_handlerαʔϏεΛར༻ͯ͠ɺϑοΫΛݺͼग़͠·͢ɻ – ϑοΫ͸DrupalίʔυͷͲ͔͜ΒͰ΋ݺͼग़͢͜ͱ͕Ͱ͖·͢ɻ – module_handlerαʔϏεͷؔ਺ྫ – invokeAll()ɿશͯͷϞδϡʔϧͰϑοΫΛݺͼग़͢ –

    invoke()ɿಛఆͷϞδϡʔϧͰϑοΫΛݺͼग़͢ – alter()ɿมߋՄೳͳม਺Λɺಛఆͷhook_TYPE_alter()࣮૷ʹ౉͢
  28. ϑοΫͷݺͼग़͠ྫ marucha.module /** * Implements hook_ENTITY_TYPE_view(). */ function marucha_node_view(array &$build,

    EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) { \Drupal::moduleHandler()->invokeAll('marucha_hello_world'); } module_handlerαʔϏεͷinvokeAll() Λར༻ͯ͠ɺࣗ࡞ϑοΫͰ͋Δ hook_marucha_hello_worldΛݺͼग़ ͠·͢ɻ
  29. ఆٛͨ͠ϑοΫΛ࣮૷͢Δ – ఆٛͨ͠ϑοΫ͸ɺଞͷϑοΫͱಉ͡Α͏ʹར༻Ͱ͖·͢ɻ /** * Implements hook_marucha_hello_world(). */ function marucha_marucha_hello_world()

    { \Drupal::messenger()->addStatus('hook_marucha_hello_world͕ݺͼग़͞Ε·ͨ͠ɻ'); } marucha.module
  30. ԋश ಠࣗͷϑοΫΛఆٛͯ͠ɺར༻ͯ͠ΈΑ͏ʂ 1. ϞδϡʔϧͷσΟϨΫτϦ௚Լʹ
 marucha.api.php ϑΝΠϧΛ࡞੒͢Δ 2. ఆ͍ٛͨ͠ϑοΫΛυΩϡϝϯτԽ͢Δ 3. module_handlerαʔϏεΛ࢖༻ͯ͠ϑοΫΛݺͼग़͢

    4. ఆٛͨ͠ϑοΫΛ࣮૷͢Δ
  31. ࿅श໰୊

  32. ࿅श໰୊1 Marucha(Ϛγϯ໊ɿmarucha)ϞδϡʔϧͰɺmarucha.moduleϑΝΠϧʹ࣍ͷΑ͏ʹϑοΫΛ࣮ ૷ͨ͠ͱ͜ΖɺϑοΫ಺ͷॲཧ͸࣮ߦ͞Ε·ͤΜͰͨ͠ɻߟ͑ΒΕΔݪҼΛ͔࣍Β1ͭબ୒ͯ͠ ͍ͩ͘͞ɻ
 1. ؔ਺໊ͷ hook ΛϞδϡʔϧϚγϯ໊ʹஔ͖׵͍͑ͯͳ͍ɻ 2. ΩϟογϡΫϦΞΛ͍ͯ͠ͳ͍ɻ

    3. ؔ਺ʹDocComment͕༻ҙ͞Ε͍ͯͳ͍ɻ 4. ϑοΫΛ࣮૷͢ΔϑΝΠϧΛؒҧ͍͑ͯΔɻ 5. add_action()ؔ਺ͰϑοΫΛొ࿥͢Δඞཁ͕͋Δɻ <?php function hook_user_login(UserInterface $account) { // ॲཧ }
  33. ࿅श໰୊1 Marucha(Ϛγϯ໊ɿmarucha)ϞδϡʔϧͰɺmarucha.moduleϑΝΠϧʹ࣍ͷΑ͏ʹϑοΫΛ࣮ ૷ͨ͠ͱ͜ΖɺϑοΫ಺ͷॲཧ͸࣮ߦ͞Ε·ͤΜͰͨ͠ɻߟ͑ΒΕΔݪҼΛ͔࣍Β1ͭબ୒ͯ͠ ͍ͩ͘͞ɻ
 1. ؔ਺໊ͷ hook ΛϞδϡʔϧϚγϯ໊ʹஔ͖׵͍͑ͯͳ͍ɻ 2. ΩϟογϡΫϦΞΛ͍ͯ͠ͳ͍ɻ

    3. ؔ਺ʹDocComment͕༻ҙ͞Ε͍ͯͳ͍ɻ 4. ϑοΫΛ࣮૷͢ΔϑΝΠϧΛؒҧ͍͑ͯΔɻ 5. add_action()ؔ਺ͰϑοΫΛొ࿥͢Δඞཁ͕͋Δɻ <?php function hook_user_login(UserInterface $account) { // ॲཧ }
  34. ࿅श໰୊2 ϑοΫ͸ɺDrupalίʔυ্͔ΒͲͷؔ਺Λ࢖༻ͯ͠ݺͼग़͞Ε·͔͢ʁ ਖ਼͍͠΋ͷΛ1ͭબ୒͍ͯͩ͘͠͞ɻ 1. do_action( ) 2. module_invoke_all( ) 3.

    \Drupal::moduleHandler()->invokeAll( ) 4. dispatch()
  35. ࿅श໰୊2 ϑοΫ͸ɺDrupalίʔυ্͔ΒͲͷؔ਺Λ࢖༻ͯ͠ݺͼग़͞Ε·͔͢ʁ ਖ਼͍͠΋ͷΛ1ͭબ୒͍ͯͩ͘͠͞ɻ 1. do_action( ) 2. module_invoke_all( ) 3.

    \Drupal::moduleHandler()->invokeAll() 4. dispatch()
  36. ຊ೔ͷΞδΣϯμ͸ऴྃ

  37. ΞδΣϯμ 1. ϑοΫͱ͸ 2. ϑοΫΛ࣮૷͢Δ 3. ར༻ՄೳͳϑοΫΛݟ͚ͭΔ 4. ಠࣗͷϑοΫΛ࡞੒͢Δ 5.

    ࿅श໰୊
  38. None