SlideShare una empresa de Scribd logo
1 de 36
I want to practice
   “better” web
 development with
      Drupal
  the first steps of a long road
towards continuous integration in
       the context of Droopy
Drupal sucks.
Web development sucks.
developers aim to
improve by identifying
      what sucks.
What is my problem?
Don’t want to develop on a live site

Don’t want to develop and test on the
same site

Don’t want to have multiple
developers working on a single
installation

Don’t want to spend hours/days
manually rolling out and configuring
new functionality
I have more
      problems...

Don’t click upgrade/install and pray
it works

Don’t want to bugfix a live site at
3am

I’m not a site administrator!
I need ...
Multiple developers working on a
project efficiently

Multiple installations of a project

Testable, reproducible rollouts of
new functionality
I need ...
Multiple developers working on a
project efficiently

Multiple installations of a project

Testable, reproducible rollouts of
new functionality



       I need automation!
automated Drupal
   deployment?!
this is quite difficult! why?
automated Drupal
   deployment?!
this is quite difficult! why?

nobody is offering a complete
solution
automated Drupal
   deployment?!
this is quite difficult! why?

nobody is offering a complete
solution

interactive site building paradigm
automated Drupal
   deployment?!
this is quite difficult! why?

nobody is offering a complete
solution

interactive site building paradigm

everything is in the database
automated Drupal
   deployment?!
this is quite difficult! why?

nobody is offering a complete
solution

interactive site building paradigm

everything is in the database

drush only goes so far?
Building a deployment
 automation vehicle
   for Drupal ...
Building a deployment
 automation vehicle
   for Drupal ...


       Voiture!
Voiture Requirements
Voiture Requirements
 single command installation
Voiture Requirements
 single command installation

 single command update (idempotent)
Voiture Requirements
 single command installation

 single command update (idempotent)

 project integrated developer tools
Voiture Requirements
 single command installation

 single command update (idempotent)

 project integrated developer tools

 everything in source control
Voiture Requirements
 single command installation

 single command update (idempotent)

 project integrated developer tools

 everything in source control

 zero interactive configuration
Voiture Requirements
 single command installation

 single command update (idempotent)

 project integrated developer tools

 everything in source control

 zero interactive configuration

 no hacks in core
Voiture Limitations
SVN support only

*nix only (Linux & MacOSX)

Seperate D6 & D7 versions

Developers require [cmdline] experience

Click & go not supported

Fixed project structure

project setup & configuration overhead
Voiture Capabilities
 initialize ‘structural’ data

 install/enable project defined
 modules (removes all others)

 project integrated drush

 all site configuration in code

 per environment settings

 logged `changeset` functionality

 extensible bootstrap wrapper
Voiture/Drupal
      Project Layout
cnf
    shared ... config shared by all ‘targets’
    targets ... per app-mode/install ‘target’ configs
data
    structural_fixtures
    sql
inc
    class .... custom classes
    funcs .... custom function ‘libs’
httpdocs ..... std drupal install + custom settings.php
+ sites/all/*/*
voiture
    bin/*/* .. dev and deployment tools
    cnf
    dfc ...... custom ‘drupal front-controllers’
    inc
        init . ‘bootstrapping’ include files
Drupal Variables

defined in code

easy to edit (unserialized)

overloads whatever is in the DB

variables data lives in
cnf/shared/vars/*.php
installation targets



 contains your app.ini

 contains your vhost configuration
shared `targets`


contains project / app-mode shared
app.ini + vhost configuration

contains project module list

contains other fun stuff too!
SFI (wtf?)
Data that defines the required structure
     & entities of your site, think:

★   Nodes (e.g. home page)
★   Menulinks
★   Taxonomy
★   Domains (domains module)
★   Users (admin accounts)
Leveraging Features

if it’s not a self-contained module
put it in a feature!

when it doesn’t fit in a feature go
to Voiture!

no inter-dependencies please!
Developer tools ...
   voiture/bin/*
install / update
translation tools
SQL dump & load
DB backup & copy
integrated drush
svn cleanup, switch & update
variable dumping & listing
integrated php
(+ debug & profile variants)
Hole in one ...
                 what happens when you “voiture/bin/app/update”

1.   check target                                   13. load modules **

2.   check env (system dependencies)                14. load features **

3.   put site offline                               15. load super user **

4.   fix file perms                                 16. load customer admin users **

5.   backup DB (production env’s)                   17. cleanup **

6.   svn clean                                      18. cache purge **

7.   svn up/switch (optional branch/tag)            19. load SFIs **

8.   include core **                                20. display `messages` **

9.   load language (deltas) **                      21. run changesets ***

10. cache purge **                                  22. update crontab

11. load themes **                                  23. restart apache

12. load variables **                               24. put site online (if no errors)

                    driven by PHP Code: ** AppMutator, *** ChangesetMutator
Settings.php
   <?php
// $Id: default.settings.php,v 1.51 2010/10/11 23:49:48 dries Exp $

include DrupalApp::getVoitureIncludeDir() . '/init/settings.php';
return;




// ... etc
index.php
      voiture/dfc/index.php

      not httpdocs/index.php

      uses Alias apache directive
<?php
/**
 * Voiture bootstrapping wrapper around drupal
 */
require dirname(__FILE__). '/../inc/init/web.inc.php';

// let drupal do its thing ...
menu_execute_active_handler();
Voiture’s update.php
     <?php

/**
 * Voiture bootstrapping wrapper around drupal
 */
require dirname(__FILE__). '/../inc/init/web-light.inc.php';

if   (in_array(DrupalApp::getMode(), array('stage', 'prod'))) {
	    if (!DrupalApp::isCLI() && !headers_sent())
	    	 header('Location: '.strip_tags($_SERVER['HTTP_HOST']));
	    exit;
}

/**
 * Global flag indicating that update.php is being run.
 *
 * When this flag is set, various operations do not take place, such as invoking
 * hook_init() and hook_exit(), css/js preprocessing, and translation.
 */
define('MAINTENANCE_MODE', 'update');

function update_selection_page() {
  drupal_set_title('Drupal database update');
  $elements = drupal_get_form('update_script_selection_form');
Demo Time!
  ... target definition, installation,
updating, destroying, switching version

Más contenido relacionado

La actualidad más candente

2012 04-19 theory-of_operation
2012 04-19 theory-of_operation2012 04-19 theory-of_operation
2012 04-19 theory-of_operation
bobwolff68
 

La actualidad más candente (20)

Drupal 8 Every Day: An Intro to Developing With Drupal 8
Drupal 8 Every Day: An Intro to Developing With Drupal 8Drupal 8 Every Day: An Intro to Developing With Drupal 8
Drupal 8 Every Day: An Intro to Developing With Drupal 8
 
Cenário atual do PHP e Introdução ao Laravel no Devinvale 2014
Cenário atual do PHP e Introdução ao Laravel no Devinvale 2014Cenário atual do PHP e Introdução ao Laravel no Devinvale 2014
Cenário atual do PHP e Introdução ao Laravel no Devinvale 2014
 
Demystifying Maven
Demystifying MavenDemystifying Maven
Demystifying Maven
 
Managed Beans: When, Why and How
Managed Beans: When, Why and HowManaged Beans: When, Why and How
Managed Beans: When, Why and How
 
Maven
Maven Maven
Maven
 
CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...
CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...
CollabSphere 2021 - DEV114 - The Nuts and Bolts of CI/CD With a Large XPages ...
 
Intro to Laravel 4
Intro to Laravel 4Intro to Laravel 4
Intro to Laravel 4
 
Maven
MavenMaven
Maven
 
Maven
MavenMaven
Maven
 
Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?
Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?
Connect2017 DEV-1550 Why Java 8? Or, What's a Lambda?
 
Maven
MavenMaven
Maven
 
2012 04-19 theory-of_operation
2012 04-19 theory-of_operation2012 04-19 theory-of_operation
2012 04-19 theory-of_operation
 
Introduction to Maven
Introduction to MavenIntroduction to Maven
Introduction to Maven
 
Maven Introduction
Maven IntroductionMaven Introduction
Maven Introduction
 
Ninja Build: Simple Guide for Beginners
Ninja Build: Simple Guide for BeginnersNinja Build: Simple Guide for Beginners
Ninja Build: Simple Guide for Beginners
 
Maven tutorial for beginners
Maven tutorial for beginnersMaven tutorial for beginners
Maven tutorial for beginners
 
Maven plugins, properties en profiles: Advanced concepts in Maven
Maven plugins, properties en profiles: Advanced concepts in MavenMaven plugins, properties en profiles: Advanced concepts in Maven
Maven plugins, properties en profiles: Advanced concepts in Maven
 
IBM Connect 2014 BP204: It's Not Infernal: Dante's Nine Circles of XPages Heaven
IBM Connect 2014 BP204: It's Not Infernal: Dante's Nine Circles of XPages HeavenIBM Connect 2014 BP204: It's Not Infernal: Dante's Nine Circles of XPages Heaven
IBM Connect 2014 BP204: It's Not Infernal: Dante's Nine Circles of XPages Heaven
 
Maven tutorial
Maven tutorialMaven tutorial
Maven tutorial
 
Vagrant
VagrantVagrant
Vagrant
 

Similar a Voiture tech talk

20130528 solution linux_frousseau_nopain_webdev
20130528 solution linux_frousseau_nopain_webdev20130528 solution linux_frousseau_nopain_webdev
20130528 solution linux_frousseau_nopain_webdev
Frank Rousseau
 

Similar a Voiture tech talk (20)

Configuration as Dependency: Managing Drupal 8 Configuration with git and Com...
Configuration as Dependency: Managing Drupal 8 Configuration with git and Com...Configuration as Dependency: Managing Drupal 8 Configuration with git and Com...
Configuration as Dependency: Managing Drupal 8 Configuration with git and Com...
 
Reactive application using meteor
Reactive application using meteorReactive application using meteor
Reactive application using meteor
 
Deployer - Deployment tool for PHP
Deployer - Deployment tool for PHPDeployer - Deployment tool for PHP
Deployer - Deployment tool for PHP
 
Behaviour Driven Development con Behat & Drupal
Behaviour Driven Development con Behat & DrupalBehaviour Driven Development con Behat & Drupal
Behaviour Driven Development con Behat & Drupal
 
Behaviour Driven Development con Behat & Drupal
Behaviour Driven Development con Behat & DrupalBehaviour Driven Development con Behat & Drupal
Behaviour Driven Development con Behat & Drupal
 
Drupal 8 configuration development flow
Drupal 8 configuration development flowDrupal 8 configuration development flow
Drupal 8 configuration development flow
 
Titanium appcelerator best practices
Titanium appcelerator best practicesTitanium appcelerator best practices
Titanium appcelerator best practices
 
Into to drupal8
Into to drupal8Into to drupal8
Into to drupal8
 
22Flutter.pdf
22Flutter.pdf22Flutter.pdf
22Flutter.pdf
 
Custom Buildpacks and Data Services
Custom Buildpacks and Data ServicesCustom Buildpacks and Data Services
Custom Buildpacks and Data Services
 
Intro to PhoneGap
Intro to PhoneGapIntro to PhoneGap
Intro to PhoneGap
 
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and BeyondDrupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
Drupal Day 2012 - Automating Drupal Development: Make!les, Features and Beyond
 
20130528 solution linux_frousseau_nopain_webdev
20130528 solution linux_frousseau_nopain_webdev20130528 solution linux_frousseau_nopain_webdev
20130528 solution linux_frousseau_nopain_webdev
 
Introduction to FreeNAS development by John Hixson
Introduction to FreeNAS development by John HixsonIntroduction to FreeNAS development by John Hixson
Introduction to FreeNAS development by John Hixson
 
Drupal 8 improvements for developer productivity php symfony and more
Drupal 8 improvements for developer productivity  php symfony and moreDrupal 8 improvements for developer productivity  php symfony and more
Drupal 8 improvements for developer productivity php symfony and more
 
Docker presentasjon java bin
Docker presentasjon java binDocker presentasjon java bin
Docker presentasjon java bin
 
IBM Drupal Users Group Discussion on Managing and Deploying Configuration
IBM Drupal Users Group Discussion on Managing and Deploying ConfigurationIBM Drupal Users Group Discussion on Managing and Deploying Configuration
IBM Drupal Users Group Discussion on Managing and Deploying Configuration
 
Drupal 8 - Core and API Changes
Drupal 8 - Core and API ChangesDrupal 8 - Core and API Changes
Drupal 8 - Core and API Changes
 
Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013
Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013
Strategies and Tips for Building Enterprise Drupal Applications - PNWDS 2013
 
SenchaCon 2016: Develop, Test & Deploy with Docker - Jonas Schwabe
SenchaCon 2016: Develop, Test & Deploy with Docker - Jonas Schwabe SenchaCon 2016: Develop, Test & Deploy with Docker - Jonas Schwabe
SenchaCon 2016: Develop, Test & Deploy with Docker - Jonas Schwabe
 

Último

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 

Último (20)

Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
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
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
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
 
[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
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
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...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
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
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 

Voiture tech talk

  • 1. I want to practice “better” web development with Drupal the first steps of a long road towards continuous integration in the context of Droopy
  • 4. developers aim to improve by identifying what sucks.
  • 5. What is my problem? Don’t want to develop on a live site Don’t want to develop and test on the same site Don’t want to have multiple developers working on a single installation Don’t want to spend hours/days manually rolling out and configuring new functionality
  • 6. I have more problems... Don’t click upgrade/install and pray it works Don’t want to bugfix a live site at 3am I’m not a site administrator!
  • 7. I need ... Multiple developers working on a project efficiently Multiple installations of a project Testable, reproducible rollouts of new functionality
  • 8. I need ... Multiple developers working on a project efficiently Multiple installations of a project Testable, reproducible rollouts of new functionality I need automation!
  • 9. automated Drupal deployment?! this is quite difficult! why?
  • 10. automated Drupal deployment?! this is quite difficult! why? nobody is offering a complete solution
  • 11. automated Drupal deployment?! this is quite difficult! why? nobody is offering a complete solution interactive site building paradigm
  • 12. automated Drupal deployment?! this is quite difficult! why? nobody is offering a complete solution interactive site building paradigm everything is in the database
  • 13. automated Drupal deployment?! this is quite difficult! why? nobody is offering a complete solution interactive site building paradigm everything is in the database drush only goes so far?
  • 14. Building a deployment automation vehicle for Drupal ...
  • 15. Building a deployment automation vehicle for Drupal ... Voiture!
  • 17. Voiture Requirements single command installation
  • 18. Voiture Requirements single command installation single command update (idempotent)
  • 19. Voiture Requirements single command installation single command update (idempotent) project integrated developer tools
  • 20. Voiture Requirements single command installation single command update (idempotent) project integrated developer tools everything in source control
  • 21. Voiture Requirements single command installation single command update (idempotent) project integrated developer tools everything in source control zero interactive configuration
  • 22. Voiture Requirements single command installation single command update (idempotent) project integrated developer tools everything in source control zero interactive configuration no hacks in core
  • 23. Voiture Limitations SVN support only *nix only (Linux & MacOSX) Seperate D6 & D7 versions Developers require [cmdline] experience Click & go not supported Fixed project structure project setup & configuration overhead
  • 24. Voiture Capabilities initialize ‘structural’ data install/enable project defined modules (removes all others) project integrated drush all site configuration in code per environment settings logged `changeset` functionality extensible bootstrap wrapper
  • 25. Voiture/Drupal Project Layout cnf shared ... config shared by all ‘targets’ targets ... per app-mode/install ‘target’ configs data structural_fixtures sql inc class .... custom classes funcs .... custom function ‘libs’ httpdocs ..... std drupal install + custom settings.php + sites/all/*/* voiture bin/*/* .. dev and deployment tools cnf dfc ...... custom ‘drupal front-controllers’ inc init . ‘bootstrapping’ include files
  • 26. Drupal Variables defined in code easy to edit (unserialized) overloads whatever is in the DB variables data lives in cnf/shared/vars/*.php
  • 27. installation targets contains your app.ini contains your vhost configuration
  • 28. shared `targets` contains project / app-mode shared app.ini + vhost configuration contains project module list contains other fun stuff too!
  • 29. SFI (wtf?) Data that defines the required structure & entities of your site, think: ★ Nodes (e.g. home page) ★ Menulinks ★ Taxonomy ★ Domains (domains module) ★ Users (admin accounts)
  • 30. Leveraging Features if it’s not a self-contained module put it in a feature! when it doesn’t fit in a feature go to Voiture! no inter-dependencies please!
  • 31. Developer tools ... voiture/bin/* install / update translation tools SQL dump & load DB backup & copy integrated drush svn cleanup, switch & update variable dumping & listing integrated php (+ debug & profile variants)
  • 32. Hole in one ... what happens when you “voiture/bin/app/update” 1. check target 13. load modules ** 2. check env (system dependencies) 14. load features ** 3. put site offline 15. load super user ** 4. fix file perms 16. load customer admin users ** 5. backup DB (production env’s) 17. cleanup ** 6. svn clean 18. cache purge ** 7. svn up/switch (optional branch/tag) 19. load SFIs ** 8. include core ** 20. display `messages` ** 9. load language (deltas) ** 21. run changesets *** 10. cache purge ** 22. update crontab 11. load themes ** 23. restart apache 12. load variables ** 24. put site online (if no errors) driven by PHP Code: ** AppMutator, *** ChangesetMutator
  • 33. Settings.php <?php // $Id: default.settings.php,v 1.51 2010/10/11 23:49:48 dries Exp $ include DrupalApp::getVoitureIncludeDir() . '/init/settings.php'; return; // ... etc
  • 34. index.php voiture/dfc/index.php not httpdocs/index.php uses Alias apache directive <?php /** * Voiture bootstrapping wrapper around drupal */ require dirname(__FILE__). '/../inc/init/web.inc.php'; // let drupal do its thing ... menu_execute_active_handler();
  • 35. Voiture’s update.php <?php /** * Voiture bootstrapping wrapper around drupal */ require dirname(__FILE__). '/../inc/init/web-light.inc.php'; if (in_array(DrupalApp::getMode(), array('stage', 'prod'))) { if (!DrupalApp::isCLI() && !headers_sent()) header('Location: '.strip_tags($_SERVER['HTTP_HOST'])); exit; } /** * Global flag indicating that update.php is being run. * * When this flag is set, various operations do not take place, such as invoking * hook_init() and hook_exit(), css/js preprocessing, and translation. */ define('MAINTENANCE_MODE', 'update'); function update_selection_page() { drupal_set_title('Drupal database update'); $elements = drupal_get_form('update_script_selection_form');
  • 36. Demo Time! ... target definition, installation, updating, destroying, switching version

Notas del editor

  1. \n \n
  2. \n \n
  3. \n \n
  4. \n \n
  5. \n \n
  6. \n \n
  7. \n \n
  8. \n \n
  9. \n \n
  10. \n \n
  11. \n \n
  12. \n \n
  13. \n \n
  14. \n \n
  15. \n \n
  16. \n \n
  17. \n \n
  18. \n \n
  19. \n \n
  20. \n \n
  21. \n \n
  22. \n \n
  23. \n \n
  24. \n \n
  25. \n \n
  26. \n \n
  27. \n \n
  28. \n \n
  29. \n \n
  30. \n \n
  31. \n \n
  32. \n \n