Drupal Views development

12,896 views

Published on

Slides from Frederic G. MARAND's "Developing to the Views 7.3 API" at the Drupal Dev Days in Brussels, 2011-02-05.

More details and code access on my blog.

Published in: Technology
0 Comments
18 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
12,896
On SlideShare
0
From Embeds
0
Number of Embeds
3,876
Actions
Shares
0
Downloads
0
Comments
0
Likes
18
Embeds 0
No embeds

No notes for slide
  • If you don't know Views UI, you will have a hard time understanding what all of this is about. If you don't know the basics of (PHP5) OOP, Views-style integration will look hairy. If you aren't used to module development, you will have a hard time understand why devs care about this.
  • Examples: - Flickr query plugin, - MongoDB Views integration Not EFQ query plugin including, but exists in contrib
  • Meaning it can be used in different places, or take input from the context, like the URL, or from the user Themability: the SemanticViews case So basically Views is a report builder. Just like Crystal Reports, but for Drupal. No (good) printing solutions.
  • Views introduced the concept early in Drupal, and it really caught the Drupal dev world with Drupal 6. This is really what Features is about But Features' Views integration, alas...
  • So you wanna talk to Views, eh ? Start by saying hello Other hook implementations will go elsewhere thanks to it.
  • Check: dr713.info dependencies[] = views dr713.module HVA
  • Skip if later than T0 + 15 minutes
  • Miscellany views_many_to_one_helper views_tab views_tabset views_join views_join_complex
  • Views invokes these hooks only when the cache has been deleted. This being configuration information, it needn't be recomputed constantly.
  • Domain Specific Language: not /that/ true, but the idea comes from seeing similar constructs usually be done with INI, XML or JSON files, whereas Views uses format to skip on the user-space parsing logic PHPTemplate vs Xtemplate, PHPTal, Smarty... Also CCK content types And, of course Features / Ctools exportables
  • Actually, area handlers are really much like field handlers, so they contribute to the query in some abstract sense (although not technically)
  • Why ? Arguments themselves translate to conditions in the query. Defaults and validation do not translate to the query itself, but can inject parameters or prevent the query from being ran. views_content_cache attempts to invalidate content depending on actual activity, like comment/node updates and VotingAPI
  • Sample problem-space ordering: partial IPv4 addresses - not number: must be left aligned - not string Sample problem-space filtering - filter on month of date
  • This is not what actually happens in code, but it simpler to figure out that way.
  • Drupal Views development

    1. 1. <ul>Developing for the Views 7.3 API Frédéric G. MARAND aka fgm aka OSInet </ul>
    2. 2. Session summary <ul><li>Concepts
    3. 3. Basic integration: default views & embedding
    4. 4. Drupal-style integration: lifecycle hooks
    5. 5. Views-style integration: handlers & plugins
    6. 6. Going further </li></ul>
    7. 7. 1. Concepts
    8. 8. Concepts: Is this for you ? <ul><li>Views UI
    9. 9. PHP5 OOP
    10. 10. Module development </li></ul>
    11. 11. Concepts: Views API, why care ? <ul><li>Code-based views
    12. 12. Views-based code
    13. 13. Views theming
    14. 14. Extra view types </li></ul>
    15. 15. Concepts: Why care ? More extras <ul><li>Handlers... </li><ul><li>Area contents
    16. 16. Argument types
    17. 17. Field types
    18. 18. Filters
    19. 19. Relationships
    20. 20. Sort rules </li></ul></ul><ul><li>Plugins... </li><ul><li>Access controls
    21. 21. Argument defaults
    22. 22. Argument validators
    23. 23. Caching mechanisms
    24. 24. Exposed forms
    25. 25. Localization
    26. 26. Pager types
    27. 27. Query engines
    28. 28. Layouts </li></ul></ul>
    29. 29. Concepts: I'm sold: what is a View ? <ul><li>A pre-built query </li><ul><li>SQL, NoSQL, WS...
    30. 30. From Views UI or from code
    31. 31. On known entities ....
    32. 32. .... not in the EFQ sense </li></ul></ul>
    33. 33. Concepts: What is a View, again ? <ul><li>A parametric query </li><ul><li>Arguments
    34. 34. Exposed filters </li></ul><li>A query with formatted results </li><ul><li>Layout plugins: Display, Style, Row
    35. 35. Themable
    36. 36. Yes, it means a REPORT </li></ul></ul>
    37. 37. Concepts: a report for coders <ul><li>The « exportable » concept </li><ul><li>Default views
    38. 38. Normal views
    39. 39. Overridden views </li></ul><li>Features, anyone ? </li></ul>
    40. 40. Concepts: enough talk <ul>Time for some <?php hooks(); ?> </ul>
    41. 41. 2. Basic default/embed
    42. 42. Basic: Hello, Views <ul><li>hook_views_api() </li><ul><li>Version matching
    43. 43. Component location
    44. 44. THE hook in your module </li></ul></ul>
    45. 45. Basic: HVA demo <ul>(Switch to code view) </ul>
    46. 46. Basic: intermezzo Intermezzo: hooks & OO in Views Skip to HVD
    47. 47. Basic: hooks & OO in Views <ul><li>Hooks
    48. 48. Passive observer pattern
    49. 49. Parent is in charge </li><ul><li>can override child
    50. 50. can extend child </li></ul><li>Implementations alter sibling results
    51. 51. « horizontal » </li></ul><ul><li>Views OO
    52. 52. Inheritance
    53. 53. Children are in charge </li><ul><li>can override parent
    54. 54. can extend parent </li></ul><li>No sibling results
    55. 55. « vertical » </li></ul>
    56. 56. Basic: Views objects <ul><li>views_db_object </li><ul><li>view
    57. 57. view_display </li></ul><li>views_object </li><ul><li>views_handler
    58. 58. views_plugin … And a small collection of miscellaneous classes </li></ul></ul>
    59. 59. Basic: Views hooks <ul><li>Pseudo-hooks </li><ul><li>Declare a list of data
    60. 60. Build a registry
    61. 61. Use exactly one specified piece of data
    62. 62. HV Data, HV DV, HV Plugins, HV QS… </li></ul><li>True hooks </li><ul><li>Accumulators: lifecycle hooks
    63. 63. Alter hooks: HV QA, HV ALA </li></ul></ul>
    64. 64. Basic: supporting custom tables <ul><li>hook_views_data </li><ul><li>Base tables </li><ul><li>[base] view type = base table
    65. 65. The [table] array </li></ul><li>Linked tables </li><ul><li>POV: From the table being defined
    66. 66. ...to another (left) table via a (left) field
    67. 67. ...iteratively
    68. 68. ...until a base table is found at the far left </li></ul><li>Do not forget relationship handlers. Just not here.
    69. 69. Yes, that's a pseudo-hook </li></ul></ul>Back to Intermezzo
    70. 70. Basic: altering the schema <ul><li>hook_views_data_alter </li><ul><li>Plain Old Drupal Alterator </li></ul><li>Use cases </li><ul><li>Expose new fields in a table supported by another module
    71. 71. Add new sorts, filters... to another module </li></ul><li>HVD/HVDA: Invocation time ? </li></ul>
    72. 72. Basic: HVD demo <ul>Add Views support to dblog.module (Switch to code view) </ul>
    73. 73. Basic: code-based Views <ul><li>hook_views_default_views </li><ul><li>Build a view object in code
    74. 74. PHP as a DSL ?
    75. 75. Didn't we see this somewhere else in Drupal ? </li></ul><li>Work process </li><ul><li>Views UI to/from code
    76. 76. Single or multiple view files
    77. 77. <?php ?> wrapper
    78. 78. File names </li></ul></ul>
    79. 79. Basic: HVDV demo <ul>Provide a default view to dblog.module (Switch to code view) </ul>
    80. 80. Basic: a page with a view <ul><li>views_embed_view($name, $display = 'default') </li><ul><li>The good: </li><ul><li>Dead simple to use
    81. 81. Argument passing </li></ul><li>The bad: </li><ul><li>Default display ? Really ?
    82. 82. $view unavailable </li></ul><li>The ugly: </li><ul><li>Display side effects </li></ul></ul></ul>
    83. 83. Basic: a page with a better view <ul><li>view::execute_display() </li><ul><li>Still side effects
    84. 84. But more control: $view is available </li></ul><li>view::preview() </li><ul><li>Core of views_embed_view()
    85. 85. Can refine the process as needed
    86. 86. $view available </li></ul></ul>
    87. 87. 3. Drupal-style: lifecycle hooks
    88. 88. Drupal style: early lifecycle hooks <ul><li>A bunch of traditional hooks
    89. 89. From view initialization to result rendering: </li><ul><li>HV_pre_view : </li><ul><li>start, no work done
    90. 90. Alter view with view::attachment_(before|after) </li></ul><li>HV_pre_build : </li><ul><li>Displays initialized
    91. 91. Alter view with view::attachment_(before|after)
    92. 92. Before query building </li></ul></ul></ul>
    93. 93. Drupal style: query lifecycle hooks <ul><li>HV_query_alter() </li><ul><li>Modify the query
    94. 94. Beware the aliases ! </li></ul><li>HV_query_substitutions </li><ul><li>Pseudo-hook: registry of ***CURRENT_USER*** -like
    95. 95. Uncommon in « userland » </li></ul><li>HV_pre_execute </li><ul><li>nodeAccess not yet applied </li></ul></ul>
    96. 96. Drupal style: render lifecycle hooks <ul><li>Query executed
    97. 97. HV_pre_render </li><ul><li>After the pre_render() methods in handlers </li></ul><li>HV_admin_links_alter </li><ul><li>Damage control on side effects
    98. 98. Example: hide inline edit controls in list </li></ul><li>Theming </li><ul><li>Another story in its own right </li></ul></ul>
    99. 99. 4. Views style: handlers & plugins
    100. 100. Views: handlers and plugins <ul><li>views_db_object : the helpful parent </li><ul><li>definition
    101. 101. options
    102. 102. forms </li></ul><li>views_handler </li><ul><li>define the query: fields, ordering, conditions, relations
    103. 103. define area content </li></ul><li>views_plugin </li><ul><li>everything else
    104. 104. including the query /engine/ </li></ul></ul>
    105. 105. Views: « layout » plugins <ul><li>Display </li><ul><li>Outer content
    106. 106. Define format: block, page, feed </li></ul><li>Style </li><ul><li>Row set
    107. 107. Grid, table, list... </li></ul><li>Row </li><ul><li>Optional: some style plugins (table) have to intervene between rows
    108. 108. Typical: views_plugin_row_fields </li></ul></ul>
    109. 109. Views: access plugins <ul><li>Avoid running unauthorized queries
    110. 110. Mandatory
    111. 111. Built -in: </li><ul><li>None
    112. 112. Permission (BCP)
    113. 113. Role </li></ul></ul>
    114. 114. Views: query plugin <ul><li>Build and run the actual query
    115. 115. Mandatory
    116. 116. Built-in: SQL via DBTNG (db_api in D6)
    117. 117. Opportunity to interface non-SQL services with Views. Samples/experiments: </li><ul><li>EntityFieldQuery http://drupal.org/project/efq_views
    118. 118. MongoDB http://bit.ly/mongodbviews
    119. 119. Web Services http://bit.ly/extendrviews
    120. 120. SPARQL, YQL, Wolfram Alpha, ApacheSolr... </li></ul></ul>
    121. 121. Views: other plugins <ul><li>Argument plugins </li><ul><li>Not arguments themselves
    122. 122. Default plugins
    123. 123. Validation plugins </li></ul><li>Cache plugins </li><ul><li>Built-in: none, basic time-based
    124. 124. Optional: views_content_cache </li></ul><li>Others </li><ul><li>Pagers, exposed_form, localization (none / core) </li></ul></ul>
    125. 125. Views: implementing plugins <ul><li>Declare to Views </li><ul><li>hook_views_plugins
    126. 126. views_discover_plugins </li></ul><li>File layout </li><ul><li>D7 autoloading: <module>.info
    127. 127. One per plugin
    128. 128. Naming conventions </li></ul><li>Alterability </li><ul><li>hook_views_plugins_alter() </li></ul></ul>
    129. 129. Views: access plugin demo <ul>Write a variable-based access control plugin (Switch to code view) </ul>
    130. 130. Views: access plugin questions <ul><li>Views caching ?
    131. 131. Non-Views caching ? </li></ul>
    132. 132. Views: simple handlers <ul><li>Filter handlers </li><ul><li>Add conditions rules
    133. 133. Translate to WHERE or HAVING for SQL
    134. 134. Express a problem space condition as a (set of) query engine conditions </li></ul><li>Sort handlers </li><ul><li>Add sorting rules
    135. 135. Translate to ORDER BY for SQL
    136. 136. Express a problem space sorting as a query ordering </li></ul></ul>
    137. 137. Views: field handlers <ul><li>Basic </li><ul><li>Expose a DB column under its own name </li></ul><li>Evolved </li><ul><li>Expose several aliases from a single column
    138. 138. Synthesize several columns into one field </li></ul></ul>
    139. 139. Views: complex handlers <ul><li>Relationships </li><ul><li>Remember implicit joins ? Make them explicit
    140. 140. Allow multiple named join paths from table to base </li></ul><li>Arguments </li><ul><li>Basically filters
    141. 141. But context-injected
    142. 142. Can modify page: title, breadcrumbs...
    143. 143. Can modify display: eg summary mode </li></ul><li>Aggregate GROUP BY support ? </li><ul><li>argument & field & filter & sort </li></ul></ul>
    144. 144. Views: area handlers <ul><li>Areas ? </li><ul><li>Header
    145. 145. Footer
    146. 146. Empty </li></ul><li>Why ? </li><ul><li>No more in-DB PHP to have dynamic area content
    147. 147. No more embedded views just for dynamic area content </li></ul><li>Why handlers ? </li><ul><li>Field handlers for the #global virtual table </li></ul></ul>
    148. 148. Views: implementing handlers <ul><li>Declare to Views </li><ul><li>No more hook_views_handlers
    149. 149. Properties: hook_views_data[_alter]
    150. 150. D7 autoloading: <module>.info </li></ul><li>File layout: like plugins </li></ul>
    151. 151. Views: area handler demo <ul>(Switch to code view) </ul>
    152. 152. 5. Going further
    153. 153. Going further: more info <ul><li>This is just an intro! </li><ul><li>Merlinofchaos' et alii book about Views 2 still relevant
    154. 154. http://bit.ly/cckviewspanels </li></ul><li>Online </li><ul><li>http://views.doc.logrus.com/
    155. 155. Advanced Help in your own site </li></ul><li>Freenode IRC : </li><ul><li>Work on Views itself: #drupal-views
    156. 156. Support for your Views code: #drupal and #drupal-contribute (for contrib) </li></ul></ul>
    157. 157. The mandatory plug <ul><li>This session is only an excerpt from the hands -on OSInet DR-713 course </li><ul><li>7-hour hands-on workshop
    158. 158. Available in English and French
    159. 159. On-demand in other languages </li></ul><li>OSInet is a state registered french training provider with a full Drupal training syllabus </li><ul><li>From content creator... to site builder ...
    160. 160. ...to advanced module developer [email_address] </li></ul></ul>
    161. 161. The « other » mandatory plug We're hiring ! [email_address]
    162. 162. <ul></Developing for the Views 7.3 API Frédéric G. MARAND aka fgm aka OSInet> </ul>

    ×