A brief overview of Drupal 7 By Robin Isard, Systems Librarian Algoma University What I'm going to look at Overview of Drupal 7 The module system How Drupal manages your data Case study – 2 years working with Drupal What is drupal? Content Management System Becoming more of a Content Management Framework Created by Dries Buytaert, a Belgian computer science student in 1998 3 major releases since then Current major release is Drupal 7 As of 2011 approximately 630,000 subscribed users “A drop” Architectural Overview Essentially a LAMP stack Modular Core Contributed Custom Themes Business logic intensive Core Core modules Blogs Comments Aggregator (RDF, RSS, Atom feeds) Hierarchical ordering of content Tracking system Statistics Forums OpenID login Polls Logging Taxonomy (tagging) Theming system Menu customization Update manager Trigger system Drupal community Contributed modules Functionality and themes 9947 modules total 3929 compatible with Drupal 7 “Content”: 551 “File Management”: 90 “Administration”: 343 “Themes”: 298 IMCE How modules work A collection of php files designed to implement some find of functionality /sites/default/modules mymod.info mymod.install mymod.module .info name = Administration menu description = "Provides a dropdown menu to most administrative tasks and other common destinations (to users with the proper permissions)." package = Administration ; Purposively added for feature development. version = 7.x-3.x-dev core = 7.x project = admin_menu /** .install * @file * Install, update, and uninstall functions for the admin menu module. */ /** * Implements hook_schema(). */ function admin_menu_schema() { $schema['cache_admin_menu'] = drupal_get_schema_unprocessed('system', 'cache'); $schema['cache_admin_menu']['description'] = 'Cache table for Administration menu to store client-side caching hashes.'; return $schema; } .module Hook system Php function Defined input and output Allows you to implement a certain behavior at a certain point in drupal core Hooks <moudle_name>_<hook_name>() hook_user_load() mymod_user_load() 342 available hooks hook_comment_load hook_cron hook_css_alter hook_field_validate Example /** * Implements hook_help(). */ function admin_menu_help($path, $arg) { switch ($path) { case 'admin/settings/admin_menu': return t('The administration menu module provides a dropdown menu arranged for one- or two-click access to most administrative Tasks … the menu.'); case 'admin/help#admin_menu': $output = ''; $output .= '<p>' . t('The administration menu module provides a dropdown menu arranged for one- or two-click ....'); APIs Module system (Drupal hooks) Database abstraction layer (Schema API) Menu system Form generation File upload system Field API Search system Node access system Theme system Data access and storage Data management By default a LAMP stack Drupal 7 has a rewritten database abstraction layer Other database options available with more or less support PostgreSQL now a first class member of the community MongoDB Essentially uses Object-relational mapping APIs Entity (core) Entity API Schema API Important data management concepts Entities Users Taxonomy terms Comments Nodes Fields Entity + Fields = Bundles Bundle - Example news_item (a node entity) + Date (field) Subject (field) = “news_item bundle” Key entity hooks hook_entity_info() hook_schema() Entity (core) Schema API Entity API entity_create() entity_save() entity_delete() entity_view() entity_access(). hook_entity_info() function user_entity_info() { $return = array( 'user' => array( 'label' => t('User'), 'controller class' => 'UserController', 'base table' => 'users', 'uri callback' => 'user_uri', 'label callback' => 'format_username', 'fieldable' => TRUE, 'entity keys' => array( 'id' => 'uid', ), ' hook_schema() function user_schema() { $schema['authmap'] = array( 'description' => 'Stores distributed authentication mapping.', 'fields' => array( 'aid' => array( 'description' => 'Primary Key: Unique authmap ID.', 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, ), 'uid' => array( 'type' => 'int', 'not null' => TRUE, 'default' => 0, 'description' => "User's {users}.uid.", hook_schema() Supports primary and foreign keys Supports indexes Field lengths Precision Signed / unsigned Data storage example Data storage example public | node | table | public | field_data_field_db_access_link | table | public | field_data_field_db_build_name | table | public | field_data_field_db_description | table | public | field_data_field_db_ezp_note | table | public | field_data_field_db_ezp_test | table | public | field_data_field_db_sfx_name | table | public | field_data_field_db_url | table | Data storage example TABLE: node nid vid type | 164 | 164 | db language | und title | Women Writers' Project uid |1 status |1 created | 1317243764 changed | 1332779771 comment |1 promote |0 sticky |0 tnid |0 translate |0 TABLE: field_data_field_db_url entity_type | node bundle | db deleted |0 entity_id | 164 revision_id | 164 language | und delta |0 field_db_url_value | http://.... field_db_url_format | Viewing your data Views module Still a contributed module Essentially a report writer Complicated Database API An example: Algoma University's Archive Algoma University Archive Over 25,000 images and documents 3 TB of data on scattered hard drives Most of the data important for legal purposes Index housed in InMagic-DBtextworks “Relational like” ASP driven No social media aspects No means to display the content in an engaging way Questions we asked about a new CMS Service integration Is there documentation? Is there an API? Does it support data exchange protocols? JSON XML RDP Questions we asked about a new CMS Data access and storage How does it store data? Does it have a CRUD layer? Can I get my data out of it in standard formats? CSV XML What options are there for non-sql data? Migration 2010 project started to update the archive We chose Drupal because It seemed to answer the questions listed above of it's very large user community recommendations from peers it's ability to integrate with enterprise technologies like Fedora Commons and Solr It's social media abilities Phase 1 Get the data out of InMagic and into Drupal Took nearly 4 months Process Dump the data out of InMagic as CSV files Import into PostgreSQL Use SQL to clean up and format the data Use “migration module” to import the cleaned up tables into Drupal Phase 2 Use Drupal's extensibility to ability to meet archivist needs for the archive Problems with contirb Postgres Bad code Malfunctioning modules Dates Unix time stamp no good for archives Phase 3 – in planning Migrate to drupal 7 Needs to be done No back-porting Drupal is now smarter about databases – which is a problem Lessons learned - modules Drupal runs the show Always interact with Drupal via a module Stay as close to core as possible Is this the best possible module for the job? Put time into choosing modules When was the last commit? Do you understand the code yourself? Is there a plan to upgrade it? Read the code for you modules You should be able to fix it yourself Lessons learned - database Drupal doesn't really like relational databases Do you know what a given module will do to the DB? Categories module Does it use MySQL specific statements? Use Fields and Views as much as possible Always interact with the DB via a module The possibilities Database layer can be rewritten All kinds of data stores theoretically possible Can be conceptualized as simply a user interface for different kinds of data stores Discovery Solr integration Islandora Web services