SlideShare ist ein Scribd-Unternehmen logo
1 von 71
Drupal Code: Day 1
where am i, and how did i get all these arrays
Hi. I’m eaton.
Drupal is...




http://www.ïŹ‚ickr.com/photos/druclimb/282597447/
Drupal is...




                                      Drupal Core



http://www.ïŹ‚ickr.com/photos/druclimb/282597447/
Drupal is...



                                                       Node
                                      Drupal Core
                                                       User

http://www.ïŹ‚ickr.com/photos/druclimb/282597447/
Drupal is...

                          Views                   Five Star   CCK


                                                              Node
                                      Drupal Core
                                                              User

http://www.ïŹ‚ickr.com/photos/druclimb/282597447/
Drupal is...
                                                  Theme


                          Views                   Five Star   CCK


                                                              Node
                                      Drupal Core
                                                              User

http://www.ïŹ‚ickr.com/photos/druclimb/282597447/
Drupal is...
                                                  Theme


                          Views                   Five Star   CCK


                                                              Node
                                      Drupal Core
                                                              User

http://www.ïŹ‚ickr.com/photos/druclimb/282597447/
name = Demo
description = Just a simple demo module.
core = 6.x

function demo_nodeapi(&$node, $op) {
  global $user;
  if ($op == ‘view’) {
    if ($node->uid == $user->uid) {
      $node->title . ‘ [YOUR ARTICLE]’;
    }
  }
}




       demo.info       demo.module
name = Tricky
description = A slightly trickier module.
core = 6.x

function tricky_form_alter(&form, $form_state, $id) {
  if ($id == ‘node_form’) {
    $title[‘#required’] = FALSE;
  }
}

function tricky_install() {
  drupal_set_message(‘You just installed Tricky!’);
}




  tricky.info     tricky.module       tricky.install
views.info   views.module      views.inc         user.inc         node.inc       blog.inc




comment.inc      ui.info       ui.module        arguments.inc    handlers.inc     ïŹlters.inc




 query.inc     sprout.info   sprout.module        forum.inc     views.pages.inc   table.inc




views.install sprout.install sprout.admin.inc    sprout.inc     CHANGELOG         README
views.info   views.module      views.inc         user.inc         node.inc       blog.inc




comment.inc      ui.info       ui.module        arguments.inc    handlers.inc     ïŹlters.inc




 query.inc     sprout.info   sprout.module        forum.inc     views.pages.inc   table.inc




views.install sprout.install sprout.admin.inc    sprout.inc     CHANGELOG         README
views.info   views.module      views.inc         user.inc         node.inc       blog.inc




comment.inc      ui.info       ui.module        arguments.inc    handlers.inc     ïŹlters.inc




 query.inc     sprout.info   sprout.module        forum.inc     views.pages.inc   table.inc




views.install sprout.install sprout.admin.inc    sprout.inc     CHANGELOG         README
under
                                                  the hood
http://www.ïŹ‚ickr.com/photos/sprakope/143770402/
I’d like welcome.html!
I’d like welcome.html!
I’ll go get that html ïŹle!
I’ll go get that html ïŹle!
I’ll go get that html ïŹle!
      .htaccess says to check

         index.php?q=welcome.html
Index.php? I’ve got that.
Index.php? I’ve got that.


          bootstrap.inc menu.inc   random




             mysql       user
Here are all my URLs

function mymodule_menu() {
     $items['about'] = array(
      'title' => 'About us',
      'description' => 'A description of us.',
      'page callback' => 'mymodule_about',
      'access arguments' => array('access content'),
     );
     return $items;
   }



Here are all my URLs

function mymodule_menu() {
     $items['about'] = array(
      'title' => 'About us',
      'description' => 'A description of us.',
      'page callback' => 'mymodule_about',
      'access arguments' => array('access content'),
     );
     return $items;
   }



Here are all my URLs

What’s the best match?
What’s the best match?
      Is welcome.html an alias?
        Does anyone handle the path?
          Does the user have access?
I’ll build the contents.
function mymodule_about($subpage = ‘legal’) {
     if ($subpage == ‘legal’) {
       return “We don’t have lawyers yet.”;
     }
     if ($subpage == ‘welcome’) {
       return “Welcome to our web site!”;
     }
   }



I’ll build the contents.
function mymodule_about($subpage = ‘legal’) {
     if ($subpage == ‘legal’) {
       return “We don’t have lawyers yet.”;
     }
     if ($subpage == ‘welcome’) {
       return “Welcome to our web site!”;
     }
   }



I’ll build the contents.
I’ll take that HTML...
I’ll take that HTML...
I’ll take that HTML...
I’ll take that HTML...
Here’s index.php

     Eh, looks like welcome.html

don’t                            use a
                 hack.                            hook!


http://www.ïŹ‚ickr.com/photos/lanier67/185311136/
A list of content types
 A user is           is being built
registering
      A node is being   Content is being
         displayed         searched

The menu is                 Links are being
 being built                   displayed
          The database is
           being queried A comment is
                          being posted
   A form is being
      processed
module_invoke_all(‘foo’)
yourmodule_foo()
theirmodule_foo()
         mymodule_foo()
    yourmodule_foo()
hismodule_foo()
       hermodule_foo()
function demo_nodeapi(&$node, $op) {
  global $user;
  if ($op == ‘view’ && $node->uid == $user->uid) {
    $node->title . ‘ [YOUR ARTICLE]’;
  }
}


function demo_form_alter(&form, $form_state, $id) {
  if ($id == ‘node_form’) {
    $title[‘#required’] = FALSE;
  }
}
i
i

    ?
i

    ?
i

    ?
i
    All w i t h o u t
  h a ng ing Dr u p a l’s
c
      o w n c o de !
                     ?
Don’t. Hack. Core.
Don’t. Hack. Core.
let’s see
                                                    a module!
http://www.ïŹ‚ickr.com/photos/gonzales2010/8632116/
name = Birthday
description = Wishes users a happy birthday.
requirements[] = user
core = 6.x
name = Birthday
description = Wishes users a happy birthday.
requirements[] = user
core = 6.x
/**
 * Allows users to save their birthday,
 * and congratulates them on the big day.
 */

function birthday_menu() {
  $items['admin/settings/birthdays'] = array(
   'title' => 'Birthday settings',
   'description' => 'Settings for birthdays.',
   'page callback' => 'birthday_page',
   'access arguments' => array('administer users'),
  );
  return $items;
}

function birthday_page() {
  return drupal_get_form('birthday_form');
}
/**
 * Allows users to save their birthday,
 * and congratulates them on the big day.
 */

function birthday_menu() {
  $items['admin/settings/birthdays'] = array(
   'title' => 'Birthday settings',
   'description' => 'Settings for birthdays.',
   'page callback' => 'birthday_page',
   'access arguments' => array('administer users'),
  );
  return $items;
}

function birthday_page() {
  return drupal_get_form('birthday_form');
}
function birthday_form() {
  $form['birthday_age'] = array(
   '#type' => 'checkbox',
   '#title' => t(quot;Show users how old they are.quot;),
   '#default_value' => variable_get('age', TRUE),
  );
  $form['submit'] = array(
   '#type' => 'submit',
   '#value' => t('Save settings'),
  );
  return $form;
}

function birthday_form_submit($form, $form_state) {
  $values = $form_state['values'];
  variable_set('age', $values['birthday_age']);
  drupal_set_message(t('Birthday settings saved.'));
}
function birthday_form() {
  $form['birthday_age'] = array(
   '#type' => 'checkbox',
   '#title' => t(quot;Show users how old they are.quot;),
   '#default_value' => variable_get('age', TRUE),
  );
  $form['submit'] = array(
   '#type' => 'submit',
   '#value' => t('Save settings'),
  );
  return $form;
}

function birthday_form_submit($form, $form_state) {
  $values = $form_state['values'];
  variable_set('age', $values['birthday_age']);
  drupal_set_message(t('Birthday settings saved.'));
}
function birthday_user($op, &$edit, &$account) {
  if ($op == 'view' && $day = $account->birthday) {
    $timestamp = mktime(0, 0, 0,
          $day['month'], $day['day'], $day['year']);
    $account->content['birthday'] = array(
     '#type' => 'item',
     '#title' => t('Birthday'),
     '#value' => date('l, F jS, Y', $timestamp));
  }
  elseif ($op == 'form') {
    $form['birthday'] = array(
     '#type' => 'date',
     '#title' => t('Birthday'),
     '#default_value' => $account->birthday);
    return $form;
  }
}
function birthday_user($op, &$edit, &$account) {
  if ($op == 'view' && $day = $account->birthday) {
    $timestamp = mktime(0, 0, 0,
          $day['month'], $day['day'], $day['year']);
    $account->content['birthday'] = array(
     '#type' => 'item',
     '#title' => t('Birthday'),
     '#value' => date('l, F jS, Y', $timestamp));
  }
  elseif ($op == 'form') {
    $form['birthday'] = array(
     '#type' => 'date',
     '#title' => t('Birthday'),
     '#default_value' => $account->birthday);
    return $form;
  }
}
function birthday_user($op, &$edit, &$account) {
  if ($op == 'view' && $day = $account->birthday) {
    $timestamp = mktime(0, 0, 0,
          $day['month'], $day['day'], $day['year']);
    $account->content['birthday'] = array(
     '#type' => 'item',
     '#title' => t('Birthday'),
     '#value' => date('l, F jS, Y', $timestamp));
  }
  elseif ($op == 'form') {
    $form['birthday'] = array(
     '#type' => 'date',
     '#title' => t('Birthday'),
     '#default_value' => $account->birthday);
    return $form;
  }
}
function birthday_block($op = 'list') {
 global $user;
   if ($op == 'list') {
   $block['congrats']['info'] = t('Birthday');
   return $block;
 }
 elseif ($op == 'view' && $day = $user->birthday) {
   if ($day['month']==date('n') && $day['day']==date('j')) {
    $message = t(quot;It's your birthday! it's your birthday!quot;);
    if (variable_get('age', TRUE)) {
      $age = date('Y') - $day['year'];
      $message .= t(quot; You're %age.quot;, array('%age' => $age));
    }

         $block['subject'] = t('Happy birthday!');
         $block['content'] = $message . birthday_song();
         return $block;
     }
 }
}
function birthday_block($op = 'list') {
 global $user;
   if ($op == 'list') {
   $block['congrats']['info'] = t('Birthday');
   return $block;
 }
 elseif ($op == 'view' && $day = $user->birthday) {
   if ($day['month']==date('n') && $day['day']==date('j')) {
    $message = t(quot;It's your birthday! it's your birthday!quot;);
    if (variable_get('age', TRUE)) {
      $age = date('Y') - $day['year'];
      $message .= t(quot; You're %age.quot;, array('%age' => $age));
    }

         $block['subject'] = t('Happy birthday!');
         $block['content'] = $message . birthday_song();
         return $block;
     }
 }
}
function birthday_block($op = 'list') {
 global $user;
   if ($op == 'list') {
   $block['congrats']['info'] = t('Birthday');
   return $block;
 }
 elseif ($op == 'view' && $day = $user->birthday) {
   if ($day['month']==date('n') && $day['day']==date('j')) {
    $message = t(quot;It's your birthday! it's your birthday!quot;);
    if (variable_get('age', TRUE)) {
      $age = date('Y') - $day['year'];
      $message .= t(quot; You're %age.quot;, array('%age' => $age));
    }

         $block['subject'] = t('Happy birthday!');
         $block['content'] = $message . birthday_song();
         return $block;
     }
 }
}
function birthday_song() {
 $path = drupal_get_path('module', 'birthday');
 $path .= '/birthday.mid ';
 $output = '<embed src=quot;' . $path . 'quot;;
 $output .= ' autostart=quot;truequot; loop=quot;truequot;';
 $output .= ' width=quot;2quot; height=quot;0quot;></embed>';

 return $output;
}
function birthday_song() {
 $path = drupal_get_path('module', 'birthday');
 $path .= '/birthday.mid ';
 $output = '<embed src=quot;' . $path . 'quot;;
 $output .= ' autostart=quot;truequot; loop=quot;truequot;';
 $output .= ' width=quot;2quot; height=quot;0quot;></embed>';

 return $output;
}
http://www.ïŹ‚ickr.com/photos/thomashawk/2681744739
drupal manages the page




                      http://www.ïŹ‚ickr.com/photos/thomashawk/2681744739
drupal manages the page
        modules build the content




                       http://www.ïŹ‚ickr.com/photos/thomashawk/2681744739
drupal manages the page
            modules build the content
modules also respond to events




                           http://www.ïŹ‚ickr.com/photos/thomashawk/2681744739
drupal manages the page
            modules build the content
modules also respond to events
              hack with hooks




                           http://www.ïŹ‚ickr.com/photos/thomashawk/2681744739
api.drupal.org
   tinyurl.com/drupal-code
tinyurl.com/drupal-kickstart
 tinyurl.com/drupal-rocking

Weitere Àhnliche Inhalte

Was ist angesagt?

Patron de Desarrollo Modelo Vista Controlador
Patron de Desarrollo Modelo Vista ControladorPatron de Desarrollo Modelo Vista Controlador
Patron de Desarrollo Modelo Vista ControladorHenry Vargas
 
Catching fileless attacks
Catching fileless attacksCatching fileless attacks
Catching fileless attacksBalaji Rajasekaran
 
Servlet.ppt
Servlet.pptServlet.ppt
Servlet.pptVMahesh5
 
Introduction vulnérabilité web
Introduction vulnérabilité webIntroduction vulnérabilité web
Introduction vulnérabilité webdavystoffel
 
History of L0phtCrack
History of L0phtCrackHistory of L0phtCrack
History of L0phtCrackcwysopal
 
Outlook and Exchange for the bad guys
Outlook and Exchange for the bad guysOutlook and Exchange for the bad guys
Outlook and Exchange for the bad guysNick Landers
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
Sql injections - with example
Sql injections - with exampleSql injections - with example
Sql injections - with examplePrateek Chauhan
 
eServices-Tp3: esb
eServices-Tp3: esbeServices-Tp3: esb
eServices-Tp3: esbLilia Sfaxi
 
Sql Injection - Vulnerability and Security
Sql Injection - Vulnerability and SecuritySql Injection - Vulnerability and Security
Sql Injection - Vulnerability and SecuritySandip Chaudhari
 
Nosa Shandy - Clickjacking That Worthy-Google Bug Hunting Story.pdf
Nosa Shandy - Clickjacking That Worthy-Google Bug Hunting Story.pdfNosa Shandy - Clickjacking That Worthy-Google Bug Hunting Story.pdf
Nosa Shandy - Clickjacking That Worthy-Google Bug Hunting Story.pdfidsecconf
 
Administration des services réseaux
Administration des services réseauxAdministration des services réseaux
Administration des services réseauxFethi Kiwa
 
How to identify and prevent SQL injection
How to identify and prevent SQL injection  How to identify and prevent SQL injection
How to identify and prevent SQL injection Eguardian Global Services
 
OWASP Top 10 Vulnerabilities - A5-Broken Access Control; A6-Security Misconfi...
OWASP Top 10 Vulnerabilities - A5-Broken Access Control; A6-Security Misconfi...OWASP Top 10 Vulnerabilities - A5-Broken Access Control; A6-Security Misconfi...
OWASP Top 10 Vulnerabilities - A5-Broken Access Control; A6-Security Misconfi...Lenur Dzhemiliev
 

Was ist angesagt? (20)

Patron de Desarrollo Modelo Vista Controlador
Patron de Desarrollo Modelo Vista ControladorPatron de Desarrollo Modelo Vista Controlador
Patron de Desarrollo Modelo Vista Controlador
 
Catching fileless attacks
Catching fileless attacksCatching fileless attacks
Catching fileless attacks
 
Servlet.ppt
Servlet.pptServlet.ppt
Servlet.ppt
 
Introduction vulnérabilité web
Introduction vulnérabilité webIntroduction vulnérabilité web
Introduction vulnérabilité web
 
Docker 101
Docker 101Docker 101
Docker 101
 
Cours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxyCours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxy
 
History of L0phtCrack
History of L0phtCrackHistory of L0phtCrack
History of L0phtCrack
 
Mod security
Mod securityMod security
Mod security
 
Outlook and Exchange for the bad guys
Outlook and Exchange for the bad guysOutlook and Exchange for the bad guys
Outlook and Exchange for the bad guys
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Sql injections - with example
Sql injections - with exampleSql injections - with example
Sql injections - with example
 
eServices-Tp3: esb
eServices-Tp3: esbeServices-Tp3: esb
eServices-Tp3: esb
 
Sql Injection - Vulnerability and Security
Sql Injection - Vulnerability and SecuritySql Injection - Vulnerability and Security
Sql Injection - Vulnerability and Security
 
Nosa Shandy - Clickjacking That Worthy-Google Bug Hunting Story.pdf
Nosa Shandy - Clickjacking That Worthy-Google Bug Hunting Story.pdfNosa Shandy - Clickjacking That Worthy-Google Bug Hunting Story.pdf
Nosa Shandy - Clickjacking That Worthy-Google Bug Hunting Story.pdf
 
Administration des services réseaux
Administration des services réseauxAdministration des services réseaux
Administration des services réseaux
 
iOS Application Pentesting
iOS Application PentestingiOS Application Pentesting
iOS Application Pentesting
 
Sql injection
Sql injectionSql injection
Sql injection
 
How to identify and prevent SQL injection
How to identify and prevent SQL injection  How to identify and prevent SQL injection
How to identify and prevent SQL injection
 
Hack ASP.NET website
Hack ASP.NET websiteHack ASP.NET website
Hack ASP.NET website
 
OWASP Top 10 Vulnerabilities - A5-Broken Access Control; A6-Security Misconfi...
OWASP Top 10 Vulnerabilities - A5-Broken Access Control; A6-Security Misconfi...OWASP Top 10 Vulnerabilities - A5-Broken Access Control; A6-Security Misconfi...
OWASP Top 10 Vulnerabilities - A5-Broken Access Control; A6-Security Misconfi...
 

Andere mochten auch

Architecture of Drupal - Drupal Camp
Architecture of Drupal - Drupal CampArchitecture of Drupal - Drupal Camp
Architecture of Drupal - Drupal CampDipen Chaudhary
 
Drupal Step-by-Step: How We Built Our Training Site, Part 1
Drupal Step-by-Step: How We Built Our Training Site, Part 1Drupal Step-by-Step: How We Built Our Training Site, Part 1
Drupal Step-by-Step: How We Built Our Training Site, Part 1Acquia
 
Staging Drupal: Change Management Strategies for Drupal
Staging Drupal: Change Management Strategies for DrupalStaging Drupal: Change Management Strategies for Drupal
Staging Drupal: Change Management Strategies for DrupalErich Beyrent
 
Using Git with Drupal
Using Git with DrupalUsing Git with Drupal
Using Git with DrupalRyan Cross
 
Drupal Deployment
Drupal DeploymentDrupal Deployment
Drupal Deploymentq0rban
 
Information Architecture for Drupal
Information Architecture for DrupalInformation Architecture for Drupal
Information Architecture for DrupalVanessa Turke
 
Getting agile with drupal
Getting agile with drupalGetting agile with drupal
Getting agile with drupalPromet Source
 
Baby Got Backend (CMS Expo 2011)
Baby Got Backend (CMS Expo 2011)Baby Got Backend (CMS Expo 2011)
Baby Got Backend (CMS Expo 2011)Jeff Eaton
 
Promiscuous Drupal
Promiscuous DrupalPromiscuous Drupal
Promiscuous DrupalJeff Eaton
 
Drupal Development (Part 2)
Drupal Development (Part 2)Drupal Development (Part 2)
Drupal Development (Part 2)Jeff Eaton
 
Social Networking Applied
Social Networking AppliedSocial Networking Applied
Social Networking AppliedJeff Eaton
 
Drupal in Action (CMS Expo 2011)
Drupal in Action (CMS Expo 2011)Drupal in Action (CMS Expo 2011)
Drupal in Action (CMS Expo 2011)Jeff Eaton
 
Drupal in Action
Drupal in ActionDrupal in Action
Drupal in ActionJeff Eaton
 
The Platypus Problem
The Platypus ProblemThe Platypus Problem
The Platypus ProblemJeff Eaton
 
Deblobbing In The Real World
Deblobbing In The Real WorldDeblobbing In The Real World
Deblobbing In The Real WorldJeff Eaton
 
Architecture Is For Everyone
Architecture Is For EveryoneArchitecture Is For Everyone
Architecture Is For EveryoneJeff Eaton
 
ROI in a GPL World
ROI in a GPL WorldROI in a GPL World
ROI in a GPL WorldJeff Eaton
 
Building enterprise high availability application with drupal
Building enterprise high availability application with drupalBuilding enterprise high availability application with drupal
Building enterprise high availability application with drupalRatnesh kumar, CSM
 
Drupal 7 and SolR
Drupal 7 and SolRDrupal 7 and SolR
Drupal 7 and SolRPatrick Morin
 

Andere mochten auch (20)

Architecture of Drupal - Drupal Camp
Architecture of Drupal - Drupal CampArchitecture of Drupal - Drupal Camp
Architecture of Drupal - Drupal Camp
 
An Introduction to Drupal
An Introduction to DrupalAn Introduction to Drupal
An Introduction to Drupal
 
Drupal Step-by-Step: How We Built Our Training Site, Part 1
Drupal Step-by-Step: How We Built Our Training Site, Part 1Drupal Step-by-Step: How We Built Our Training Site, Part 1
Drupal Step-by-Step: How We Built Our Training Site, Part 1
 
Staging Drupal: Change Management Strategies for Drupal
Staging Drupal: Change Management Strategies for DrupalStaging Drupal: Change Management Strategies for Drupal
Staging Drupal: Change Management Strategies for Drupal
 
Using Git with Drupal
Using Git with DrupalUsing Git with Drupal
Using Git with Drupal
 
Drupal Deployment
Drupal DeploymentDrupal Deployment
Drupal Deployment
 
Information Architecture for Drupal
Information Architecture for DrupalInformation Architecture for Drupal
Information Architecture for Drupal
 
Getting agile with drupal
Getting agile with drupalGetting agile with drupal
Getting agile with drupal
 
Baby Got Backend (CMS Expo 2011)
Baby Got Backend (CMS Expo 2011)Baby Got Backend (CMS Expo 2011)
Baby Got Backend (CMS Expo 2011)
 
Promiscuous Drupal
Promiscuous DrupalPromiscuous Drupal
Promiscuous Drupal
 
Drupal Development (Part 2)
Drupal Development (Part 2)Drupal Development (Part 2)
Drupal Development (Part 2)
 
Social Networking Applied
Social Networking AppliedSocial Networking Applied
Social Networking Applied
 
Drupal in Action (CMS Expo 2011)
Drupal in Action (CMS Expo 2011)Drupal in Action (CMS Expo 2011)
Drupal in Action (CMS Expo 2011)
 
Drupal in Action
Drupal in ActionDrupal in Action
Drupal in Action
 
The Platypus Problem
The Platypus ProblemThe Platypus Problem
The Platypus Problem
 
Deblobbing In The Real World
Deblobbing In The Real WorldDeblobbing In The Real World
Deblobbing In The Real World
 
Architecture Is For Everyone
Architecture Is For EveryoneArchitecture Is For Everyone
Architecture Is For Everyone
 
ROI in a GPL World
ROI in a GPL WorldROI in a GPL World
ROI in a GPL World
 
Building enterprise high availability application with drupal
Building enterprise high availability application with drupalBuilding enterprise high availability application with drupal
Building enterprise high availability application with drupal
 
Drupal 7 and SolR
Drupal 7 and SolRDrupal 7 and SolR
Drupal 7 and SolR
 

Ähnlich wie Drupal Development

Debugging in drupal 8
Debugging in drupal 8Debugging in drupal 8
Debugging in drupal 8Allie Jones
 
8 things to know about theming in drupal 8
8 things to know about theming in drupal 88 things to know about theming in drupal 8
8 things to know about theming in drupal 8Logan Farr
 
Drupal 8 simple page: Mi primer proyecto en Drupal 8.
Drupal 8 simple page: Mi primer proyecto en Drupal 8.Drupal 8 simple page: Mi primer proyecto en Drupal 8.
Drupal 8 simple page: Mi primer proyecto en Drupal 8.Samuel SolĂ­s Fuentes
 
Patterns Are Good For Managers
Patterns Are Good For ManagersPatterns Are Good For Managers
Patterns Are Good For ManagersAgileThought
 
Drupal Recipes: Building Image Galleries with jQuery and Flickr
Drupal Recipes: Building Image Galleries with jQuery and FlickrDrupal Recipes: Building Image Galleries with jQuery and Flickr
Drupal Recipes: Building Image Galleries with jQuery and FlickrBen Shell
 
Drupalcon 2023 - How Drupal builds your pages.pdf
Drupalcon 2023 - How Drupal builds your pages.pdfDrupalcon 2023 - How Drupal builds your pages.pdf
Drupalcon 2023 - How Drupal builds your pages.pdfLuca Lusso
 
2023 - Drupalcon - How Drupal builds your pages
2023 - Drupalcon - How Drupal builds your pages2023 - Drupalcon - How Drupal builds your pages
2023 - Drupalcon - How Drupal builds your pagessparkfabrik
 
Beyond DOMReady: Ultra High-Performance Javascript
Beyond DOMReady: Ultra High-Performance JavascriptBeyond DOMReady: Ultra High-Performance Javascript
Beyond DOMReady: Ultra High-Performance Javascriptaglemann
 
Using Backbone.js with Drupal 7 and 8
Using Backbone.js with Drupal 7 and 8Using Backbone.js with Drupal 7 and 8
Using Backbone.js with Drupal 7 and 8Ovadiah Myrgorod
 
jQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 JavascriptjQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 JavascriptDarren Mothersele
 
Migrate yourself. code -> module -> mind
Migrate yourself. code -> module -> mindMigrate yourself. code -> module -> mind
Migrate yourself. code -> module -> mindValentine Matsveiko
 
Đ’Đ°Đ»Đ”ĐœŃ‚ĐžĐœ МацĐČĐ”ĐčĐșĐŸ та ВлаЎОслаĐČ ĐœĐŸĐčŃĐ”Ń”ĐœĐșĐŸ — D8: Migrate Yourself: code->module...
Đ’Đ°Đ»Đ”ĐœŃ‚ĐžĐœ МацĐČĐ”ĐčĐșĐŸ та ВлаЎОслаĐČ ĐœĐŸĐčŃĐ”Ń”ĐœĐșĐŸ — D8: Migrate Yourself: code->module...Đ’Đ°Đ»Đ”ĐœŃ‚ĐžĐœ МацĐČĐ”ĐčĐșĐŸ та ВлаЎОслаĐČ ĐœĐŸĐčŃĐ”Ń”ĐœĐșĐŸ — D8: Migrate Yourself: code->module...
Đ’Đ°Đ»Đ”ĐœŃ‚ĐžĐœ МацĐČĐ”ĐčĐșĐŸ та ВлаЎОслаĐČ ĐœĐŸĐčŃĐ”Ń”ĐœĐșĐŸ — D8: Migrate Yourself: code->module...LEDC 2016
 
Intro To Mvc Development In Php
Intro To Mvc Development In PhpIntro To Mvc Development In Php
Intro To Mvc Development In Phpfunkatron
 
Drupal 8, Where Did the Code Go? From Info Hook to Plugin
Drupal 8, Where Did the Code Go? From Info Hook to PluginDrupal 8, Where Did the Code Go? From Info Hook to Plugin
Drupal 8, Where Did the Code Go? From Info Hook to PluginAcquia
 
Drupal Module Development - OSI Days 2010
Drupal Module Development - OSI Days 2010Drupal Module Development - OSI Days 2010
Drupal Module Development - OSI Days 2010Siva Epari
 
Drupal Module Development
Drupal Module DevelopmentDrupal Module Development
Drupal Module Developmentipsitamishra
 
Learning the basics of the Drupal API
Learning the basics of the Drupal APILearning the basics of the Drupal API
Learning the basics of the Drupal APIAlexandru Badiu
 
Choosing a Javascript Framework
Choosing a Javascript FrameworkChoosing a Javascript Framework
Choosing a Javascript FrameworkAll Things Open
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVCAlive Kuo
 

Ähnlich wie Drupal Development (20)

Debugging in drupal 8
Debugging in drupal 8Debugging in drupal 8
Debugging in drupal 8
 
8 things to know about theming in drupal 8
8 things to know about theming in drupal 88 things to know about theming in drupal 8
8 things to know about theming in drupal 8
 
Drupal 8 simple page: Mi primer proyecto en Drupal 8.
Drupal 8 simple page: Mi primer proyecto en Drupal 8.Drupal 8 simple page: Mi primer proyecto en Drupal 8.
Drupal 8 simple page: Mi primer proyecto en Drupal 8.
 
Patterns Are Good For Managers
Patterns Are Good For ManagersPatterns Are Good For Managers
Patterns Are Good For Managers
 
Drupal Recipes: Building Image Galleries with jQuery and Flickr
Drupal Recipes: Building Image Galleries with jQuery and FlickrDrupal Recipes: Building Image Galleries with jQuery and Flickr
Drupal Recipes: Building Image Galleries with jQuery and Flickr
 
Drupalcon 2023 - How Drupal builds your pages.pdf
Drupalcon 2023 - How Drupal builds your pages.pdfDrupalcon 2023 - How Drupal builds your pages.pdf
Drupalcon 2023 - How Drupal builds your pages.pdf
 
2023 - Drupalcon - How Drupal builds your pages
2023 - Drupalcon - How Drupal builds your pages2023 - Drupalcon - How Drupal builds your pages
2023 - Drupalcon - How Drupal builds your pages
 
Beyond DOMReady: Ultra High-Performance Javascript
Beyond DOMReady: Ultra High-Performance JavascriptBeyond DOMReady: Ultra High-Performance Javascript
Beyond DOMReady: Ultra High-Performance Javascript
 
Using Backbone.js with Drupal 7 and 8
Using Backbone.js with Drupal 7 and 8Using Backbone.js with Drupal 7 and 8
Using Backbone.js with Drupal 7 and 8
 
Django Vs Rails
Django Vs RailsDjango Vs Rails
Django Vs Rails
 
jQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 JavascriptjQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
 
Migrate yourself. code -> module -> mind
Migrate yourself. code -> module -> mindMigrate yourself. code -> module -> mind
Migrate yourself. code -> module -> mind
 
Đ’Đ°Đ»Đ”ĐœŃ‚ĐžĐœ МацĐČĐ”ĐčĐșĐŸ та ВлаЎОслаĐČ ĐœĐŸĐčŃĐ”Ń”ĐœĐșĐŸ — D8: Migrate Yourself: code->module...
Đ’Đ°Đ»Đ”ĐœŃ‚ĐžĐœ МацĐČĐ”ĐčĐșĐŸ та ВлаЎОслаĐČ ĐœĐŸĐčŃĐ”Ń”ĐœĐșĐŸ — D8: Migrate Yourself: code->module...Đ’Đ°Đ»Đ”ĐœŃ‚ĐžĐœ МацĐČĐ”ĐčĐșĐŸ та ВлаЎОслаĐČ ĐœĐŸĐčŃĐ”Ń”ĐœĐșĐŸ — D8: Migrate Yourself: code->module...
Đ’Đ°Đ»Đ”ĐœŃ‚ĐžĐœ МацĐČĐ”ĐčĐșĐŸ та ВлаЎОслаĐČ ĐœĐŸĐčŃĐ”Ń”ĐœĐșĐŸ — D8: Migrate Yourself: code->module...
 
Intro To Mvc Development In Php
Intro To Mvc Development In PhpIntro To Mvc Development In Php
Intro To Mvc Development In Php
 
Drupal 8, Where Did the Code Go? From Info Hook to Plugin
Drupal 8, Where Did the Code Go? From Info Hook to PluginDrupal 8, Where Did the Code Go? From Info Hook to Plugin
Drupal 8, Where Did the Code Go? From Info Hook to Plugin
 
Drupal Module Development - OSI Days 2010
Drupal Module Development - OSI Days 2010Drupal Module Development - OSI Days 2010
Drupal Module Development - OSI Days 2010
 
Drupal Module Development
Drupal Module DevelopmentDrupal Module Development
Drupal Module Development
 
Learning the basics of the Drupal API
Learning the basics of the Drupal APILearning the basics of the Drupal API
Learning the basics of the Drupal API
 
Choosing a Javascript Framework
Choosing a Javascript FrameworkChoosing a Javascript Framework
Choosing a Javascript Framework
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
 

Mehr von Jeff Eaton

This Is not a Place of Honor
This Is not a Place of HonorThis Is not a Place of Honor
This Is not a Place of HonorJeff Eaton
 
An API Won't Fix Your Content Problem
An API Won't Fix Your Content ProblemAn API Won't Fix Your Content Problem
An API Won't Fix Your Content ProblemJeff Eaton
 
Hello, {{FIRSTNAME}}, My Old Friend
Hello, {{FIRSTNAME}}, My Old FriendHello, {{FIRSTNAME}}, My Old Friend
Hello, {{FIRSTNAME}}, My Old FriendJeff Eaton
 
Maps, Models, and Teams
Maps, Models, and TeamsMaps, Models, and Teams
Maps, Models, and TeamsJeff Eaton
 
Collaborative Content Modeling
Collaborative Content ModelingCollaborative Content Modeling
Collaborative Content ModelingJeff Eaton
 
Adventures in Drupal 8
Adventures in Drupal 8Adventures in Drupal 8
Adventures in Drupal 8Jeff Eaton
 
Recoupling
RecouplingRecoupling
RecouplingJeff Eaton
 
Modeling Rich Narrative Content
Modeling Rich Narrative ContentModeling Rich Narrative Content
Modeling Rich Narrative ContentJeff Eaton
 
Battle for the Body Field (DrupalCon)
Battle for the Body Field (DrupalCon)Battle for the Body Field (DrupalCon)
Battle for the Body Field (DrupalCon)Jeff Eaton
 
The Battle For The Body Field
The Battle For The Body FieldThe Battle For The Body Field
The Battle For The Body FieldJeff Eaton
 
Workflow That Works Under Pressure
Workflow That Works Under PressureWorkflow That Works Under Pressure
Workflow That Works Under PressureJeff Eaton
 
Planning Beyond the Page
Planning Beyond the PagePlanning Beyond the Page
Planning Beyond the PageJeff Eaton
 
Building Your Agency's Content Strategy Practice
Building Your Agency's Content Strategy PracticeBuilding Your Agency's Content Strategy Practice
Building Your Agency's Content Strategy PracticeJeff Eaton
 
Prepare for the Mobilacalypse
Prepare for the MobilacalypsePrepare for the Mobilacalypse
Prepare for the MobilacalypseJeff Eaton
 
Building Apis That Rock
Building Apis That RockBuilding Apis That Rock
Building Apis That RockJeff Eaton
 
Drupal Deployment
Drupal DeploymentDrupal Deployment
Drupal DeploymentJeff Eaton
 
Building Twitter in Drupal
Building Twitter in DrupalBuilding Twitter in Drupal
Building Twitter in DrupalJeff Eaton
 
O'Reilly Drupal Webcast
O'Reilly Drupal WebcastO'Reilly Drupal Webcast
O'Reilly Drupal WebcastJeff Eaton
 
The Future of Nodes
The Future of NodesThe Future of Nodes
The Future of NodesJeff Eaton
 
Form API 3
Form API 3Form API 3
Form API 3Jeff Eaton
 

Mehr von Jeff Eaton (20)

This Is not a Place of Honor
This Is not a Place of HonorThis Is not a Place of Honor
This Is not a Place of Honor
 
An API Won't Fix Your Content Problem
An API Won't Fix Your Content ProblemAn API Won't Fix Your Content Problem
An API Won't Fix Your Content Problem
 
Hello, {{FIRSTNAME}}, My Old Friend
Hello, {{FIRSTNAME}}, My Old FriendHello, {{FIRSTNAME}}, My Old Friend
Hello, {{FIRSTNAME}}, My Old Friend
 
Maps, Models, and Teams
Maps, Models, and TeamsMaps, Models, and Teams
Maps, Models, and Teams
 
Collaborative Content Modeling
Collaborative Content ModelingCollaborative Content Modeling
Collaborative Content Modeling
 
Adventures in Drupal 8
Adventures in Drupal 8Adventures in Drupal 8
Adventures in Drupal 8
 
Recoupling
RecouplingRecoupling
Recoupling
 
Modeling Rich Narrative Content
Modeling Rich Narrative ContentModeling Rich Narrative Content
Modeling Rich Narrative Content
 
Battle for the Body Field (DrupalCon)
Battle for the Body Field (DrupalCon)Battle for the Body Field (DrupalCon)
Battle for the Body Field (DrupalCon)
 
The Battle For The Body Field
The Battle For The Body FieldThe Battle For The Body Field
The Battle For The Body Field
 
Workflow That Works Under Pressure
Workflow That Works Under PressureWorkflow That Works Under Pressure
Workflow That Works Under Pressure
 
Planning Beyond the Page
Planning Beyond the PagePlanning Beyond the Page
Planning Beyond the Page
 
Building Your Agency's Content Strategy Practice
Building Your Agency's Content Strategy PracticeBuilding Your Agency's Content Strategy Practice
Building Your Agency's Content Strategy Practice
 
Prepare for the Mobilacalypse
Prepare for the MobilacalypsePrepare for the Mobilacalypse
Prepare for the Mobilacalypse
 
Building Apis That Rock
Building Apis That RockBuilding Apis That Rock
Building Apis That Rock
 
Drupal Deployment
Drupal DeploymentDrupal Deployment
Drupal Deployment
 
Building Twitter in Drupal
Building Twitter in DrupalBuilding Twitter in Drupal
Building Twitter in Drupal
 
O'Reilly Drupal Webcast
O'Reilly Drupal WebcastO'Reilly Drupal Webcast
O'Reilly Drupal Webcast
 
The Future of Nodes
The Future of NodesThe Future of Nodes
The Future of Nodes
 
Form API 3
Form API 3Form API 3
Form API 3
 

KĂŒrzlich hochgeladen

08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel AraĂșjo
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 

KĂŒrzlich hochgeladen (20)

08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 

Drupal Development

  • 1. Drupal Code: Day 1 where am i, and how did i get all these arrays
  • 3.
  • 5. Drupal is... Drupal Core http://www.ïŹ‚ickr.com/photos/druclimb/282597447/
  • 6. Drupal is... Node Drupal Core User http://www.ïŹ‚ickr.com/photos/druclimb/282597447/
  • 7. Drupal is... Views Five Star CCK Node Drupal Core User http://www.ïŹ‚ickr.com/photos/druclimb/282597447/
  • 8. Drupal is... Theme Views Five Star CCK Node Drupal Core User http://www.ïŹ‚ickr.com/photos/druclimb/282597447/
  • 9. Drupal is... Theme Views Five Star CCK Node Drupal Core User http://www.ïŹ‚ickr.com/photos/druclimb/282597447/
  • 10. name = Demo description = Just a simple demo module. core = 6.x function demo_nodeapi(&$node, $op) { global $user; if ($op == ‘view’) { if ($node->uid == $user->uid) { $node->title . ‘ [YOUR ARTICLE]’; } } } demo.info demo.module
  • 11. name = Tricky description = A slightly trickier module. core = 6.x function tricky_form_alter(&form, $form_state, $id) { if ($id == ‘node_form’) { $title[‘#required’] = FALSE; } } function tricky_install() { drupal_set_message(‘You just installed Tricky!’); } tricky.info tricky.module tricky.install
  • 12. views.info views.module views.inc user.inc node.inc blog.inc comment.inc ui.info ui.module arguments.inc handlers.inc ïŹlters.inc query.inc sprout.info sprout.module forum.inc views.pages.inc table.inc views.install sprout.install sprout.admin.inc sprout.inc CHANGELOG README
  • 13. views.info views.module views.inc user.inc node.inc blog.inc comment.inc ui.info ui.module arguments.inc handlers.inc ïŹlters.inc query.inc sprout.info sprout.module forum.inc views.pages.inc table.inc views.install sprout.install sprout.admin.inc sprout.inc CHANGELOG README
  • 14. views.info views.module views.inc user.inc node.inc blog.inc comment.inc ui.info ui.module arguments.inc handlers.inc ïŹlters.inc query.inc sprout.info sprout.module forum.inc views.pages.inc table.inc views.install sprout.install sprout.admin.inc sprout.inc CHANGELOG README
  • 15. under the hood http://www.ïŹ‚ickr.com/photos/sprakope/143770402/
  • 18. I’ll go get that html ïŹle!
  • 19. I’ll go get that html ïŹle!
  • 20. I’ll go get that html ïŹle! .htaccess says to check
 index.php?q=welcome.html
  • 22. Index.php? I’ve got that. bootstrap.inc menu.inc random mysql user
  • 23. Here are all my URLs

  • 24. function mymodule_menu() { $items['about'] = array( 'title' => 'About us', 'description' => 'A description of us.', 'page callback' => 'mymodule_about', 'access arguments' => array('access content'), ); return $items; } Here are all my URLs

  • 25. function mymodule_menu() { $items['about'] = array( 'title' => 'About us', 'description' => 'A description of us.', 'page callback' => 'mymodule_about', 'access arguments' => array('access content'), ); return $items; } Here are all my URLs

  • 27. What’s the best match? Is welcome.html an alias? Does anyone handle the path? Does the user have access?
  • 28. I’ll build the contents.
  • 29. function mymodule_about($subpage = ‘legal’) { if ($subpage == ‘legal’) { return “We don’t have lawyers yet.”; } if ($subpage == ‘welcome’) { return “Welcome to our web site!”; } } I’ll build the contents.
  • 30. function mymodule_about($subpage = ‘legal’) { if ($subpage == ‘legal’) { return “We don’t have lawyers yet.”; } if ($subpage == ‘welcome’) { return “Welcome to our web site!”; } } I’ll build the contents.
  • 35. Here’s index.php
 Eh, looks like welcome.html

  • 36. don’t use a hack. hook! http://www.ïŹ‚ickr.com/photos/lanier67/185311136/
  • 37.
  • 38. A list of content types A user is is being built registering A node is being Content is being displayed searched The menu is Links are being being built displayed The database is being queried A comment is being posted A form is being processed
  • 41. theirmodule_foo() mymodule_foo() yourmodule_foo() hismodule_foo() hermodule_foo()
  • 42. function demo_nodeapi(&$node, $op) { global $user; if ($op == ‘view’ && $node->uid == $user->uid) { $node->title . ‘ [YOUR ARTICLE]’; } } function demo_form_alter(&form, $form_state, $id) { if ($id == ‘node_form’) { $title[‘#required’] = FALSE; } }
  • 43.
  • 44. i
  • 45. i ?
  • 46. i ?
  • 47. i ?
  • 48. i All w i t h o u t h a ng ing Dr u p a l’s c o w n c o de ! ?
  • 51. let’s see a module! http://www.ïŹ‚ickr.com/photos/gonzales2010/8632116/
  • 52. name = Birthday description = Wishes users a happy birthday. requirements[] = user core = 6.x
  • 53. name = Birthday description = Wishes users a happy birthday. requirements[] = user core = 6.x
  • 54. /** * Allows users to save their birthday, * and congratulates them on the big day. */ function birthday_menu() { $items['admin/settings/birthdays'] = array( 'title' => 'Birthday settings', 'description' => 'Settings for birthdays.', 'page callback' => 'birthday_page', 'access arguments' => array('administer users'), ); return $items; } function birthday_page() { return drupal_get_form('birthday_form'); }
  • 55. /** * Allows users to save their birthday, * and congratulates them on the big day. */ function birthday_menu() { $items['admin/settings/birthdays'] = array( 'title' => 'Birthday settings', 'description' => 'Settings for birthdays.', 'page callback' => 'birthday_page', 'access arguments' => array('administer users'), ); return $items; } function birthday_page() { return drupal_get_form('birthday_form'); }
  • 56. function birthday_form() { $form['birthday_age'] = array( '#type' => 'checkbox', '#title' => t(quot;Show users how old they are.quot;), '#default_value' => variable_get('age', TRUE), ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Save settings'), ); return $form; } function birthday_form_submit($form, $form_state) { $values = $form_state['values']; variable_set('age', $values['birthday_age']); drupal_set_message(t('Birthday settings saved.')); }
  • 57. function birthday_form() { $form['birthday_age'] = array( '#type' => 'checkbox', '#title' => t(quot;Show users how old they are.quot;), '#default_value' => variable_get('age', TRUE), ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Save settings'), ); return $form; } function birthday_form_submit($form, $form_state) { $values = $form_state['values']; variable_set('age', $values['birthday_age']); drupal_set_message(t('Birthday settings saved.')); }
  • 58. function birthday_user($op, &$edit, &$account) { if ($op == 'view' && $day = $account->birthday) { $timestamp = mktime(0, 0, 0, $day['month'], $day['day'], $day['year']); $account->content['birthday'] = array( '#type' => 'item', '#title' => t('Birthday'), '#value' => date('l, F jS, Y', $timestamp)); } elseif ($op == 'form') { $form['birthday'] = array( '#type' => 'date', '#title' => t('Birthday'), '#default_value' => $account->birthday); return $form; } }
  • 59. function birthday_user($op, &$edit, &$account) { if ($op == 'view' && $day = $account->birthday) { $timestamp = mktime(0, 0, 0, $day['month'], $day['day'], $day['year']); $account->content['birthday'] = array( '#type' => 'item', '#title' => t('Birthday'), '#value' => date('l, F jS, Y', $timestamp)); } elseif ($op == 'form') { $form['birthday'] = array( '#type' => 'date', '#title' => t('Birthday'), '#default_value' => $account->birthday); return $form; } }
  • 60. function birthday_user($op, &$edit, &$account) { if ($op == 'view' && $day = $account->birthday) { $timestamp = mktime(0, 0, 0, $day['month'], $day['day'], $day['year']); $account->content['birthday'] = array( '#type' => 'item', '#title' => t('Birthday'), '#value' => date('l, F jS, Y', $timestamp)); } elseif ($op == 'form') { $form['birthday'] = array( '#type' => 'date', '#title' => t('Birthday'), '#default_value' => $account->birthday); return $form; } }
  • 61. function birthday_block($op = 'list') { global $user; if ($op == 'list') { $block['congrats']['info'] = t('Birthday'); return $block; } elseif ($op == 'view' && $day = $user->birthday) { if ($day['month']==date('n') && $day['day']==date('j')) { $message = t(quot;It's your birthday! it's your birthday!quot;); if (variable_get('age', TRUE)) { $age = date('Y') - $day['year']; $message .= t(quot; You're %age.quot;, array('%age' => $age)); } $block['subject'] = t('Happy birthday!'); $block['content'] = $message . birthday_song(); return $block; } } }
  • 62. function birthday_block($op = 'list') { global $user; if ($op == 'list') { $block['congrats']['info'] = t('Birthday'); return $block; } elseif ($op == 'view' && $day = $user->birthday) { if ($day['month']==date('n') && $day['day']==date('j')) { $message = t(quot;It's your birthday! it's your birthday!quot;); if (variable_get('age', TRUE)) { $age = date('Y') - $day['year']; $message .= t(quot; You're %age.quot;, array('%age' => $age)); } $block['subject'] = t('Happy birthday!'); $block['content'] = $message . birthday_song(); return $block; } } }
  • 63. function birthday_block($op = 'list') { global $user; if ($op == 'list') { $block['congrats']['info'] = t('Birthday'); return $block; } elseif ($op == 'view' && $day = $user->birthday) { if ($day['month']==date('n') && $day['day']==date('j')) { $message = t(quot;It's your birthday! it's your birthday!quot;); if (variable_get('age', TRUE)) { $age = date('Y') - $day['year']; $message .= t(quot; You're %age.quot;, array('%age' => $age)); } $block['subject'] = t('Happy birthday!'); $block['content'] = $message . birthday_song(); return $block; } } }
  • 64. function birthday_song() { $path = drupal_get_path('module', 'birthday'); $path .= '/birthday.mid '; $output = '<embed src=quot;' . $path . 'quot;; $output .= ' autostart=quot;truequot; loop=quot;truequot;'; $output .= ' width=quot;2quot; height=quot;0quot;></embed>'; return $output; }
  • 65. function birthday_song() { $path = drupal_get_path('module', 'birthday'); $path .= '/birthday.mid '; $output = '<embed src=quot;' . $path . 'quot;; $output .= ' autostart=quot;truequot; loop=quot;truequot;'; $output .= ' width=quot;2quot; height=quot;0quot;></embed>'; return $output; }
  • 67. drupal manages the page http://www.ïŹ‚ickr.com/photos/thomashawk/2681744739
  • 68. drupal manages the page modules build the content http://www.ïŹ‚ickr.com/photos/thomashawk/2681744739
  • 69. drupal manages the page modules build the content modules also respond to events http://www.ïŹ‚ickr.com/photos/thomashawk/2681744739
  • 70. drupal manages the page modules build the content modules also respond to events hack with hooks http://www.ïŹ‚ickr.com/photos/thomashawk/2681744739
  • 71. api.drupal.org tinyurl.com/drupal-code tinyurl.com/drupal-kickstart tinyurl.com/drupal-rocking

Hinweis der Redaktion

  1. Core - bootstrap, route incoming page requests to modules Modules - Build page content and respond to events Many third-party modules, some build on top of other modules Theme - Turn data from modules into HTML. We&#x2019;ll be concentrating on the module side of things today.
  2. Core - bootstrap, route incoming page requests to modules Modules - Build page content and respond to events Many third-party modules, some build on top of other modules Theme - Turn data from modules into HTML. We&#x2019;ll be concentrating on the module side of things today.
  3. Core - bootstrap, route incoming page requests to modules Modules - Build page content and respond to events Many third-party modules, some build on top of other modules Theme - Turn data from modules into HTML. We&#x2019;ll be concentrating on the module side of things today.
  4. Core - bootstrap, route incoming page requests to modules Modules - Build page content and respond to events Many third-party modules, some build on top of other modules Theme - Turn data from modules into HTML. We&#x2019;ll be concentrating on the module side of things today.
  5. Core - bootstrap, route incoming page requests to modules Modules - Build page content and respond to events Many third-party modules, some build on top of other modules Theme - Turn data from modules into HTML. We&#x2019;ll be concentrating on the module side of things today.
  6. Core - bootstrap, route incoming page requests to modules Modules - Build page content and respond to events Many third-party modules, some build on top of other modules Theme - Turn data from modules into HTML. We&#x2019;ll be concentrating on the module side of things today.
  7. Core - bootstrap, route incoming page requests to modules Modules - Build page content and respond to events Many third-party modules, some build on top of other modules Theme - Turn data from modules into HTML. We&#x2019;ll be concentrating on the module side of things today.
  8. Core - bootstrap, route incoming page requests to modules Modules - Build page content and respond to events Many third-party modules, some build on top of other modules Theme - Turn data from modules into HTML. We&#x2019;ll be concentrating on the module side of things today.
  9. Core - bootstrap, route incoming page requests to modules Modules - Build page content and respond to events Many third-party modules, some build on top of other modules Theme - Turn data from modules into HTML. We&#x2019;ll be concentrating on the module side of things today.
  10. This is a module. Two files, A few lines of code. In Drupal, that&#x2019;s all you need to customize the behavior of the system and add new functionality.
  11. A little more complicated. Shorter function, has an .install file.
  12. This is a module, too. Views, one of Drupal&#x2019;s most popular, contains over 400 files, over a meg of code and inline docs. Don&#x2019;t worry, there&#x2019;s a middle ground. We&#x2019;re going to cover what they have in common.
  13. This is a module, too. Views, one of Drupal&#x2019;s most popular, contains over 400 files, over a meg of code and inline docs. Don&#x2019;t worry, there&#x2019;s a middle ground. We&#x2019;re going to cover what they have in common.
  14. Part 1: user with a web browser makes a request. sends a URL, optionally a cookie. http://www.mysite.com/articles/welcome.html
  15. Apache intercepts the request. Possibly routes it to other servers What folder should I look in for foo.com? Normally, it would then check /articles for a welcome.html file and send it back. .htaccess turns foo.com/blah into foo.com/index.php?q=blah ...And PHP takes over.
  16. Apache intercepts the request. Possibly routes it to other servers What folder should I look in for foo.com? Normally, it would then check /articles for a welcome.html file and send it back. .htaccess turns foo.com/blah into foo.com/index.php?q=blah ...And PHP takes over.
  17. Apache intercepts the request. Possibly routes it to other servers What folder should I look in for foo.com? Normally, it would then check /articles for a welcome.html file and send it back. .htaccess turns foo.com/blah into foo.com/index.php?q=blah ...And PHP takes over.
  18. Apache intercepts the request. Possibly routes it to other servers What folder should I look in for foo.com? Normally, it would then check /articles for a welcome.html file and send it back. .htaccess turns foo.com/blah into foo.com/index.php?q=blah ...And PHP takes over.
  19. Bootstrap All page requests go through index.php (front-side controller) Bootstrap Drupal core, load essential includes What site am I running? connect to database Is there a cookie? Load the user. Now, ask for menu items...
  20. Bootstrap All page requests go through index.php (front-side controller) Bootstrap Drupal core, load essential includes What site am I running? connect to database Is there a cookie? Load the user. Now, ask for menu items...
  21. Bootstrap All page requests go through index.php (front-side controller) Bootstrap Drupal core, load essential includes What site am I running? connect to database Is there a cookie? Load the user. Now, ask for menu items...
  22. Bootstrap All page requests go through index.php (front-side controller) Bootstrap Drupal core, load essential includes What site am I running? connect to database Is there a cookie? Load the user. Now, ask for menu items...
  23. Bootstrap All page requests go through index.php (front-side controller) Bootstrap Drupal core, load essential includes What site am I running? connect to database Is there a cookie? Load the user. Now, ask for menu items...
  24. The module Why, yes! Here&#x2019;s a list of all the URLs I can handle. Explain each line. See api.drupal.org This is called a hook. We&#x2019;ll get to this later.
  25. The module Why, yes! Here&#x2019;s a list of all the URLs I can handle. Explain each line. See api.drupal.org This is called a hook. We&#x2019;ll get to this later.
  26. Traffic Cop Is welcome.html an SEO-friendly alias? (about/welcome vs. welcome.html) Find the best match. (about) Run access checks. Call the function, passing along unused pieces of the path
  27. Grunt work Module&#x2019;s function gets called. Extra params passed along. That&#x2019;s how node module works -- &#x2018;node&#x2019; plus a wildcard Can do anything now: print out JSON and exit(), etc. To build a normal page, build HTML and return it.
  28. Grunt work Module&#x2019;s function gets called. Extra params passed along. That&#x2019;s how node module works -- &#x2018;node&#x2019; plus a wildcard Can do anything now: print out JSON and exit(), etc. To build a normal page, build HTML and return it.
  29. Presentation Checks for 404, 403, and empty page. index.php now has the contents of the page. theme(&#x2018;page&#x2019;, $content) Sidebar blocks get loaded, the theme system is given a chance to add CSS and JS, etc.
  30. Presentation Checks for 404, 403, and empty page. index.php now has the contents of the page. theme(&#x2018;page&#x2019;, $content) Sidebar blocks get loaded, the theme system is given a chance to add CSS and JS, etc.
  31. Presentation Checks for 404, 403, and empty page. index.php now has the contents of the page. theme(&#x2018;page&#x2019;, $content) Sidebar blocks get loaded, the theme system is given a chance to add CSS and JS, etc.
  32. Oh, look. Welcome.html! Apache gets back the fully rendered HTML. Sweet. Document gets fired back to the user. The user&#x2019;s browser renders it -- and they click on the next link and the process starts all over again.
  33. Important detail: when drupal asked about menus and modules responded, we saw a hook. hooks are everywhere: when pieces of content load, when a db query is run, when a user logs in&#x2026; that&#x2019;s a drupal event. module_invoke_all(&#x2018;hook&#x2019;) => for modules()&#x2026; <name>_menu() Modules can create their own hooks just by calling module_invoke_all()
  34. As a Drupal page is built, events are firing nonstop.
  35. As a Drupal page is built, events are firing nonstop.
  36. As a Drupal page is built, events are firing nonstop.
  37. As a Drupal page is built, events are firing nonstop.
  38. As a Drupal page is built, events are firing nonstop.
  39. As a Drupal page is built, events are firing nonstop.
  40. As a Drupal page is built, events are firing nonstop.
  41. As a Drupal page is built, events are firing nonstop.
  42. As a Drupal page is built, events are firing nonstop.
  43. Hooks can announce what&#x2019;s going on Allow modules to answer questions Allow modules to extend functionality Allow modules to change existing workflows
  44. Hooks can announce what&#x2019;s going on Allow modules to answer questions Allow modules to extend functionality Allow modules to change existing workflows
  45. Hooks can announce what&#x2019;s going on Allow modules to answer questions Allow modules to extend functionality Allow modules to change existing workflows
  46. Hooks can announce what&#x2019;s going on Allow modules to answer questions Allow modules to extend functionality Allow modules to change existing workflows
  47. Hooks can announce what&#x2019;s going on Allow modules to answer questions Allow modules to extend functionality Allow modules to change existing workflows
  48. What does &#x201C;hacking core&#x201D; mean? Why is it bad?
  49. What does &#x201C;hacking core&#x201D; mean? Why is it bad?