SlideShare ist ein Scribd-Unternehmen logo
1 von 79
Drupal Code: Day 2
  the good, the bad, and the nerdy
we join our cms,
already in progress
drupal core
coordinates




 http://www.flickr.com/photos/35104960@N00/509525572/
drupal
announces
events
hooks let
 modules
   listen
modules
  react
...and change
     behavior




     http://www.flickr.com/photos/spiicytuna/188111824
happy baby
   is happy
FormAPI
$form[‘foo’] = array(
   ‘#type’ => ‘textarea’,
   ‘#required’ => TRUE,
   ‘#title’ => t(‘Your foo’),
   ‘#default_value’ => “Some text…”,
   ‘#resizable’ => TRUE,
);
$form[‘bar’] = array(
   ‘#type’ => ‘fieldset’,
   ‘#title’ => t(‘Several bars’),
   ‘#collapsible’ => TRUE,
   ‘#collapsed’ => FALSE,
);
$form[‘bar’][‘baz’] = array(
   ‘#type’ => ‘select’,
   ‘#title’ => t(‘Baz in a bar’),
   ‘#options’ => array(
      1 => t(‘Option one’),
      2 => t(‘Option two’),
      3 => t(‘Option three’),
   ),
   ‘#multiple’ => TRUE,
   ‘#default_value’ => 2,
   ‘#weight’ => -10
);
function mymodule_settings_page() {
  return drupal_get_form(‘mymodule_form’);
}

function mymodule_form() {
  $form[‘foo’] = array(
    ‘#type’ => ‘textarea’,
    ‘#title’ => t(‘Your foo’),
    ‘#default_value’ => t(‘Enter your text here…’),
  );
  $form[‘submit’] = array(
    ‘#type’ => ‘submit’,
    ‘#value’ => t(‘Pity the foo’),
  );
  return $form;
}
function mymodule_settings_page() {
  return drupal_get_form(‘mymodule_form’);
}

function mymodule_form() {
  $form[‘foo’] = array(
    ‘#type’ => ‘textarea’,
    ‘#title’ => t(‘Your foo’),
    ‘#default_value’ => t(‘Enter your text here…’),
  );
  $form[‘submit’] = array(
    ‘#type’ => ‘submit’,
    ‘#value’ => t(‘Pity the foo’),
  );
  return $form;
}
function mymodule_form_alter($form, &$state, $id) {
  if ($id == ‘yourmodule_form’) {
    unset($form[‘your_field’]);

        $form[‘my_extra_field’] = array(
           ‘#type’ => ‘textarea’,
           ‘#title’ => t(‘THIS field is mine.’,
           ‘#weight’ => -10,
        );

        $form[‘#validate’][] = ‘my_validation_code’;
        $form[‘#submit’][] = ‘my_submit_code’;
    }
}
function mymodule_form_validate($form, &$state) {
  if ($state[‘values’][‘foo’] == ‘Yo Momma’) {
    form_set_error(‘foo’, t(‘Show some respect.’));
  }
}

function mymodule_form_submit($form, &$state) {
  variable_set(‘my_foo’, $state[‘values’][‘foo’]);
}
Key Pieces

• Form ID
• Form Builder function
• Validation functions
• Submission functions
• “Form State”
happy baby
   is happy
best practices
best practices
theme()
function build_my_page() {
  $output = ‘<h3>My stuff</h3>'
  $records = get_records();
  $output .= ‘<ul>’;
  foreach ($records as $record) {
    $output .= “<li>”. $record->name .”</li>”;
  }
  $output .= ‘</ul>’;
  return $output;
}
function build_my_page() {
  $output = ‘<h3>My stuff</h3>'
  $records = get_records();
  $output .= ‘<ul>’;
  foreach ($records as $record) {
    $output .= “<li>”. $record->name .”</li>”;
  }
  $output .= ‘</ul>’;
  return $output;
}
function build_my_page() {
  $records = get_records();
  foreach ($records as $record) {
    $items[] = $records->name;
  }
  return theme(‘item_list’,
               $items, t(‘My stuff’));
}
function mymodule_theme() {
  return array(
    'mymodule_data' => array(
      'arguments' => array(
        'data' => NULL,
        'option' => TRUE)));
}

function theme_mymodule_data($data, $option) {
   $output = ‘<em>’. $data->foo .’</em>’;
   if ($option) {
     $output .= ‘ <b>’. $data->bar .’</b>’;
   }
  return $output;
}
use theme() for
    all html
db_query()
function get_my_data($username) {
  $sql = “SELECT * FROM users “;
  $sql .= “WHERE name = ‘$username’”;
  $results = mysql_query($sql);
  return $results;
}
function get_my_data($username) {
  $sql = “SELECT * FROM users “;
  $sql .= “WHERE name = ‘$username’”;
  $results = mysql_query($sql);
  return $results;
}



function get_my_data($username) {
  $sql = “SELECT * FROM {users} u “;
  $sql .= “WHERE u.name = ‘%s’”;
  $results = db_query($sql, $username);
  return $results;
}
use db_query() for
    all queries
l()
$link = “<a href=‘/about-us’>About!</a>”;
$link = “<a href=‘/about-us’>About!</a>”;


http://www.mysite.com/node/1
http://www.mysite.com/seo-friendly-name
http://www.mysite.com/subdirectory/node/1
http://www.mysite.com/index.php?q=node/1
http://www.mysite.com/fr/node/1
$link = “<a href=‘/about-us’>About!</a>”;


http://www.mysite.com/node/1
http://www.mysite.com/seo-friendly-name
http://www.mysite.com/subdirectory/node/1
http://www.mysite.com/index.php?q=node/1
http://www.mysite.com/fr/node/1


$link = l($title, $url);
use l() for all links
t()
function my_message($name) {
  return “This is your message, $name!”;
}
function my_message($name) {
  return “This is your message, $name!”;
}




function my_message($name) {
  $values = array(‘%name’ => $name);
  $message = ‘This is your message, %name!’;
  return t($message, $values);
}
use t() for all
   UI text
PHPDoc
/**
  * Prepares a structured form array by adding required elements,
  * executing any hook_form_alter functions, and optionally
  * inserting a validation token to prevent tampering.
  *
  * @param $form_id
  *    A unique string identifying the form for validation,
  *    submission, theming, and hook_form_alter functions.
  * @param $form
  *    An associative array containing the structure of the form.
  * @param $form_state
  *    A keyed array containing the current state of the form.
  *    Passed in here so that hook_form_alter() calls can use it,
  *    as well.
  */
function drupal_prepare_form($form_id, &$form, &$form_state) {
    // Actual codes goes here…
}
drupal core

      1%


                 Code
37%
                 Comments
                 Jokes
           62%
use PHPDoc to
explain your code
Coder module
hook, don’t hack
happy baby
   is happy
security
(never trust anyone)
SQL Injection
function get_my_data($name, $date) {
  $sql = “SELECT * FROM {users} u “;
  $sql .= “WHERE u.name = ‘%s’ ”;
  $sql .= “AND u.created > %d ”;

    $results = db_query($sql, $name, $date);
    return $results;
}
function get_my_data($name, $date) {
  $sql = “SELECT * FROM {users} u “;
  $sql .= “WHERE u.name = ‘%s’ ”;
  $sql .= “AND u.created > %d ”;

    $results = db_query($sql, $name, $date);
    return $results;
}


    %s, %d, %f, and %b are your friends
XSS
(use output filtering)
XSS
(use output filtering)
XSS
(use output filtering)
   Use filter_xss($text)
CSRF
CSRF
Use FormAPI. ALWAYS.
input formats
(PHP, oh noes)
input formats
(PHP, oh noes)
http://drupal.org/
writing-secure-code
happy baby
   is happy
Performance
(It’s always the db)
cold hard cache
cold hard cache
devel module
devel module
devel module
make your
own cache
function my_module_stuff($reset = FALSE) {
  static $stuff;
  if (!isset($stuff) || $reset) {
    if (!$reset && ($cache = cache_get('my_stuff'))) {
      $stuff = $cache->data;

                 make your
    }
    else {

                 own cache
      // Do your expensive calculations here,
      // and populate $my_data with stuff..
      cache_set('my_stuff', $stuff);
    }
  }
  return $stuff;
}
happy baby
   is happy
the community
sign up. seriously.
participate
participate
• Always use FormAPI
• Follow best practices (Coder helps!)
• It’s always the DB’s fault (cache)
• Don’t trust anyone (sanitize output)
• Participate!
happy baby
   is happy

Weitere ähnliche Inhalte

Was ist angesagt?

Анатолий Поляков - Drupal.ajax framework from a to z
Анатолий Поляков - Drupal.ajax framework from a to zАнатолий Поляков - Drupal.ajax framework from a to z
Анатолий Поляков - Drupal.ajax framework from a to z
LEDC 2016
 
Propel sfugmd
Propel sfugmdPropel sfugmd
Propel sfugmd
iKlaus
 

Was ist angesagt? (20)

Drupal Module Development
Drupal Module DevelopmentDrupal Module Development
Drupal Module Development
 
JavaScript in Drupal 7: What developers need to know
JavaScript in Drupal 7: What developers need to knowJavaScript in Drupal 7: What developers need to know
JavaScript in Drupal 7: What developers need to know
 
WordPress Capabilities Magic
WordPress Capabilities MagicWordPress Capabilities Magic
WordPress Capabilities Magic
 
jQuery and_drupal
jQuery and_drupaljQuery and_drupal
jQuery and_drupal
 
Angular Directives from Scratch
Angular Directives from ScratchAngular Directives from Scratch
Angular Directives from Scratch
 
Writing Drupal 5 Module
Writing Drupal 5 ModuleWriting Drupal 5 Module
Writing Drupal 5 Module
 
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
 
AngulrJS Overview
AngulrJS OverviewAngulrJS Overview
AngulrJS Overview
 
Your Entity, Your Code
Your Entity, Your CodeYour Entity, Your Code
Your Entity, Your Code
 
Let's write secure Drupal code! - DrupalCamp Oslo, 2018
Let's write secure Drupal code! - DrupalCamp Oslo, 2018Let's write secure Drupal code! - DrupalCamp Oslo, 2018
Let's write secure Drupal code! - DrupalCamp Oslo, 2018
 
Анатолий Поляков - Drupal.ajax framework from a to z
Анатолий Поляков - Drupal.ajax framework from a to zАнатолий Поляков - Drupal.ajax framework from a to z
Анатолий Поляков - Drupal.ajax framework from a to z
 
Goodbye hook_menu() - Routing and Menus in Drupal 8
Goodbye hook_menu() - Routing and Menus in Drupal 8Goodbye hook_menu() - Routing and Menus in Drupal 8
Goodbye hook_menu() - Routing and Menus in Drupal 8
 
WordPress plugin #3
WordPress plugin #3WordPress plugin #3
WordPress plugin #3
 
15. CodeIgniter editarea inregistrarilor
15. CodeIgniter editarea inregistrarilor15. CodeIgniter editarea inregistrarilor
15. CodeIgniter editarea inregistrarilor
 
Propel sfugmd
Propel sfugmdPropel sfugmd
Propel sfugmd
 
First Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven DevelopmentFirst Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven Development
 
Geodaten & Drupal 7
Geodaten & Drupal 7Geodaten & Drupal 7
Geodaten & Drupal 7
 
Daily notes
Daily notesDaily notes
Daily notes
 
Let's write secure Drupal code! - Drupal Camp Poland 2019
Let's write secure Drupal code! - Drupal Camp Poland 2019Let's write secure Drupal code! - Drupal Camp Poland 2019
Let's write secure Drupal code! - Drupal Camp Poland 2019
 
Drupal is Stupid (But I Love It Anyway)
Drupal is Stupid (But I Love It Anyway)Drupal is Stupid (But I Love It Anyway)
Drupal is Stupid (But I Love It Anyway)
 

Andere mochten auch

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
 
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
 

Andere mochten auch (10)

Drupal in Action
Drupal in ActionDrupal in Action
Drupal in Action
 
Social Networking Applied
Social Networking AppliedSocial Networking Applied
Social Networking Applied
 
Architecture Is For Everyone
Architecture Is For EveryoneArchitecture Is For Everyone
Architecture Is For Everyone
 
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 in Action (CMS Expo 2011)
Drupal in Action (CMS Expo 2011)Drupal in Action (CMS Expo 2011)
Drupal in Action (CMS Expo 2011)
 
Deblobbing In The Real World
Deblobbing In The Real WorldDeblobbing In The Real World
Deblobbing In The Real World
 
The Platypus Problem
The Platypus ProblemThe Platypus Problem
The Platypus Problem
 
ROI in a GPL World
ROI in a GPL WorldROI in a GPL World
ROI in a GPL World
 
Recoupling
RecouplingRecoupling
Recoupling
 

Ähnlich wie Drupal Development (Part 2)

PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
elliando dias
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
elliando dias
 
R57shell
R57shellR57shell
R57shell
ady36
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
Stoyan Stefanov
 
C A S Sample Php
C A S Sample PhpC A S Sample Php
C A S Sample Php
JH Lee
 

Ähnlich wie Drupal Development (Part 2) (20)

PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 
Views notwithstanding
Views notwithstandingViews notwithstanding
Views notwithstanding
 
Tidy Up Your Code
Tidy Up Your CodeTidy Up Your Code
Tidy Up Your Code
 
Drupal Lightning FAPI Jumpstart
Drupal Lightning FAPI JumpstartDrupal Lightning FAPI Jumpstart
Drupal Lightning FAPI Jumpstart
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 
R57.Php
R57.PhpR57.Php
R57.Php
 
London XQuery Meetup: Querying the World (Web Scraping)
London XQuery Meetup: Querying the World (Web Scraping)London XQuery Meetup: Querying the World (Web Scraping)
London XQuery Meetup: Querying the World (Web Scraping)
 
R57shell
R57shellR57shell
R57shell
 
D8 Form api
D8 Form apiD8 Form api
D8 Form api
 
Php
PhpPhp
Php
 
Simple Ways To Be A Better Programmer (OSCON 2007)
Simple Ways To Be A Better Programmer (OSCON 2007)Simple Ways To Be A Better Programmer (OSCON 2007)
Simple Ways To Be A Better Programmer (OSCON 2007)
 
Introduction to CodeIgniter (RefreshAugusta, 20 May 2009)
Introduction to CodeIgniter (RefreshAugusta, 20 May 2009)Introduction to CodeIgniter (RefreshAugusta, 20 May 2009)
Introduction to CodeIgniter (RefreshAugusta, 20 May 2009)
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
 
wget.pl
wget.plwget.pl
wget.pl
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
 
Zero to SOLID
Zero to SOLIDZero to SOLID
Zero to SOLID
 
C A S Sample Php
C A S Sample PhpC A S Sample Php
C A S Sample Php
 
Php My Sql
Php My SqlPhp My Sql
Php My Sql
 
laravel tricks in 50minutes
laravel tricks in 50minuteslaravel tricks in 50minutes
laravel tricks in 50minutes
 
50 Laravel Tricks in 50 Minutes
50 Laravel Tricks in 50 Minutes50 Laravel Tricks in 50 Minutes
50 Laravel Tricks in 50 Minutes
 

Mehr von Jeff Eaton

Workflow That Works Under Pressure
Workflow That Works Under PressureWorkflow That Works Under Pressure
Workflow That Works Under Pressure
Jeff Eaton
 
Planning Beyond the Page
Planning Beyond the PagePlanning Beyond the Page
Planning Beyond the Page
Jeff 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 Practice
Jeff Eaton
 
Prepare for the Mobilacalypse
Prepare for the MobilacalypsePrepare for the Mobilacalypse
Prepare for the Mobilacalypse
Jeff Eaton
 
Building Apis That Rock
Building Apis That RockBuilding Apis That Rock
Building Apis That Rock
Jeff Eaton
 

Mehr von Jeff Eaton (19)

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
 
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

Kürzlich hochgeladen (20)

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
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...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
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
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
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
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
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)
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 

Drupal Development (Part 2)

Hinweis der Redaktion

  1. http://www.flickr.com/photos/mhzmaster/1004261881
  2. wrote forms in straight html duplicated workflow code duplicated security code (hopefully) hack, hack, hack to customize build arrays to describe the form use standard workflow (drupal_get_form()) security is automatic THEN render to HTML.