minimalist drupal development - cornell university...drupal_set_message(t('there are no tags...
TRANSCRIPT
![Page 1: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/1.jpg)
Minimalist Drupal Development
Jeff Amaral
https://drupal.org/user/397127
![Page 2: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/2.jpg)
Drupal is awesome! But…
Click!
![Page 3: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/3.jpg)
Drupal is awesome! But…...
![Page 4: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/4.jpg)
Drupal is awesome! But……...
![Page 5: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/5.jpg)
But…
![Page 6: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/6.jpg)
Free but at a Cost
Functionality comes for free, but the cost is performance, security, and integration time.
The open buffet:http://2bits.com/articles/server-indigestion-the-drupal-contributed-modules-open-buffet-binge-syndrome.html
![Page 7: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/7.jpg)
A Solution: Minimalism
● Be smart about your site build● Choose third party code wisely● Write some code yourself● Don’t be a click monkey! (or be less of one)
Is this for every Drupal site builder? Not really.
![Page 8: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/8.jpg)
Being a Developer HelpsBut it’s not a requirement!
Site builders and developers: Be selective about the code you add to your site
Developers: Write some of that code yourself (or borrow it!)
Sitebuilder
Developer
Minimalist sweet spot
![Page 9: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/9.jpg)
Module selection
● Number of sites (more is better!)
● Size (smaller is better!)
● Actively developed?● Developer (recognise the name?)
● Number of bugs (fewer is better!)
● Focused use case or kitchen sink?● Anything in it for your end users?
(Admin menu: great for site builders and admins, useless for visitors; over 800 LOC in the .module file alone, loaded for all users, but useful to only a few)
![Page 10: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/10.jpg)
Drupal is a framework
Third party developers aren’t the only ones who can add functionality to your site.
YOU can!
![Page 11: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/11.jpg)
Use what Drupal gives you
● Entities (and helpful querying methods)● View modes● Theme regions● Hooks everywhere● APIs galore
![Page 12: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/12.jpg)
Using APIs
Drupal core examples:● hook_entity_info_alter()● EntityFieldQuery
Contrib examples:● Bean API
![Page 13: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/13.jpg)
API: View ModesView mode image here for reference
● over 400 lines of code for Entity View Modes● over 1200 lines of code for DS core module
![Page 14: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/14.jpg)
API: View ModesView mode image here for reference
● over 400 lines of code for Entity View Modes● over 1200 lines of code for DS core module● 6 lines of code:
/** * Implements hook_entity_info_alter(). */function CUSTOM_entity_info_alter(&$entity_info) { $entity_info['node']['view modes']['listing'] = array( 'label' => t('Listing'), 'custom settings' => FALSE, );}
![Page 15: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/15.jpg)
API: EntityFieldQuery vs. Views
Views Requires:● Views module (1.5MB of code)● Use of this interface
by site editors
![Page 16: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/16.jpg)
API: EntityFieldQuery vs. Views
$query = new EntityFieldQuery();
$query ->entityCondition('entity_type', 'node') ->entityCondition('bundle', 'news') ->propertyCondition('status', 1) ->fieldCondition('field_tags', 'tid', $bean->tags) ->fieldOrderBy('field_published_date', 'value', 'DESC') ->range(0, $bean->records_shown);
$result = $query->execute();
![Page 17: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/17.jpg)
API: BEAN/** * Implements hook_bean_types_api_info(). */function CUSTOM_bean_types_api_info() { return array('api' => 4);}
/** * Implements hook_bean_types(). */function CUSTOM_bean_types() { $plugins = array(); $plugins['news_tags'] = array( 'label' => t('News Listing (tags)'), 'description' => t('Provides a listing of news items based on callout tags.'), 'handler' => array( 'class' => 'NewsTagsBean', 'parent' => 'bean', 'path' => drupal_get_path('module', CUSTOM) . '/plugins/bean', 'file' => 'news_tags.inc', ), ); return $plugins;}
![Page 18: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/18.jpg)
API: BEANclass NewsTagsBean extends BeanPlugin { /** * Declares default block settings. */ public function values() { $values = array( 'records_shown' => FALSE, 'tags' => FALSE, );
return array_merge(parent::values(), $values); }
/** * Builds extra settings for the block edit form. */ public function form($bean, $form, &$form_state) { $form = array();
// Set default number of records shown if (!$records_shown = $bean->records_shown) { $records_shown = 5; }
// Set default list of tags if (!$tags = $bean->tags) { $tags = false; }
// Create list of new tags for radio options $options = array(); $vocabulary = taxonomy_vocabulary_machine_name_load('news_tags');
$query = new EntityFieldQuery(); $result = $query ->entityCondition('entity_type', 'taxonomy_term') ->propertyCondition('vid', (int) $vocabulary->vid, '=') ->execute();
if ($result) { $tids = array_keys($result['taxonomy_term']); $terms = taxonomy_term_load_multiple($tids);
foreach ($terms as $term) { $options[$term->tid] = $term->name; } } else { drupal_set_message(t('There are no tags available. Please try again later when there are some tagged news items.'), 'warning'); }
$form['records_shown'] = array( '#type' => 'textfield', '#title' => t('Records shown'), '#size' => 5, '#default_value' => $records_shown, '#required' => TRUE, );
$form['tags'] = array( '#type' => 'select', '#default_value' => $tags, '#title' => 'Tag', '#options' => $options, );
return $form; }
public function validate($values, &$form_state) { if (empty($values['tags'])) { form_set_error('tags', 'A tag is required.'); }
if ($values['records_shown'] <= 0) { form_set_error('records_shown', 'Records shown should be greater than zero.'); } }
/** * Displays the bean. */ public function view($bean, $content, $view_mode = 'default', $langcode = NULL) { $query = new EntityFieldQuery();
$query ->entityCondition('entity_type', 'node') ->entityCondition('bundle', 'news') ->propertyCondition('status', 1) ->fieldCondition('field_tags', 'tid', $bean->tags) ->fieldOrderBy('field_published_date', 'value', 'DESC') ->range(0, $bean->records_shown);
$result = $query->execute();
if (empty($result)) { $content['nodes'] = array(); } else { $counter = 0;
foreach ($result['node'] as $node) { $node = node_load($node->nid, $node->vid); $node->news_tags_zebra = ($counter % 2) ? 'odd' : 'even'; $content['nodes'][$node->nid] = node_view($node, 'teaser'); $counter++; } }
$content['nodes']['#weight'] = '-1';
return $content; }}
![Page 19: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/19.jpg)
Code borrowing
Modules have admin interfaces and support multiple use cases. Sometimes you only need a portion of a module.
Downside: now it’s your code!
Examples from a recent project:● Image link formatter● Node Menu Required● Taxonomy Dupecheck
![Page 20: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/20.jpg)
Code borrowing: Image link formatter
/** * Implements hook_node_view_alter() * * Alters the render array of the image field on a news node (if displayed) to * make it a link to the URL from field_url. * * Inspired by the image_link_formatter module. See: * http://drupalcode.org/project/image_link_formatter.git/blob/refs/heads/7.x-1.x:/image_link_formatter.module#l120 */function CUSTOM_node_view_alter(&$build) { if ($build['#node']->type == 'news' && !empty($build['field_image'])) { $language = field_language('node', $build['#node'], 'field_url'); if (!empty($build['#node']->field_url[$language][0]['url'])) { $build['field_image'][0]['#path'] = array( 'path' => $build['#node']->field_url[$language][0]['url'], 'options' => array('attributes' => $build['#node']->field_url[$language][0]['attributes']), ); } }}
Contrib module to apply link field URL to an image field image. Module has an admin page, requires adjustments to the image formatter, and then addition to a Feature module. But here’s the meat of what it does:
![Page 21: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/21.jpg)
Code borrowing: Node Menu Required
/** * Implements hook_FORM_ID_form_alter(). * * Override form attributes for Hide Menu Item and Summary */function CUSTOM_form_page_node_form_alter(&$form, &$form_state, $form_id) { // Require the menu link title and parent fields. $form['menu']['enabled']['#value'] = TRUE; $form['menu']['enabled']['#disabled'] = TRUE; $form['menu']['link']['link_title']['#required'] = TRUE; $form['menu']['link']['parent']['#required'] = TRUE;}
Contrib module to force nodes into menus. It’s already small, but this is all it does:
![Page 22: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/22.jpg)
Use Drupal’s regions● Not Panels or Display Suite
○ Page editing experience is fractured and complex
● Blocks aren’t the only thing that can be placed in regions
● It’s nice to be able to version block placement
![Page 23: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/23.jpg)
How to use regions?
BEAN! Block types just like content types + Blockreference field
Region View Modes: put any field in a region
Field Group for better layout options (bonus: improved node add/edit forms)
![Page 24: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/24.jpg)
Region View ModesFor this example: there’s a blockreference field on the page content type.
![Page 25: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/25.jpg)
Region View Modes
![Page 26: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/26.jpg)
Region View Modes
![Page 27: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/27.jpg)
Region View Modes
![Page 28: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/28.jpg)
Region View Modes
![Page 29: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/29.jpg)
In Conclusion
● Do more with what you get
● Choose contributed code wisely
● Have fun!
![Page 30: Minimalist Drupal Development - Cornell University...drupal_set_message(t('There are no tags available. Please try again later when there are some tagged Please try again later when](https://reader033.vdocuments.us/reader033/viewer/2022060223/5f07e9027e708231d41f5eba/html5/thumbnails/30.jpg)
Thanks!
● Singlebrook Technology● Inspiration from energy.gov
Jeff Amaral
https://drupal.org/user/397127