2011-09-18 @ drupalcity.de

                            features+
     „A Presentation about monsters, features and the plus“




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     1
whoami


Florian Latzel
 ●   @fl3a
 ●   http://is-loesungen.de
 ●   http://netzaffe.de




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     2
whoami: f – l – 3 – what?!



 ●   @fl3a → flEa




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     3
whoami: f – l – 3 – what?!



 ●   @fl3a → flea [fliː]




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     4
whoami: f – l – 3 – what?!



 ●   @fl3a → flea [fliː]




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     5
whoami: f – l – 3 – what?!



 ●   @fl3a → flea [fliː]




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     6
whoami: fl3a → flEa → flea → floh...



 ●   @fl3a → floh




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     7
cat features+/toc.txt


●   Questions
●   Conclusion
●   Features
●   Drupal API
●   Drush
●   Installation profiles
●   The Plus



    features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     8
Questions: What is stored where?


Filesystem:                                Database:
●   Code                                    ●   Drupal Settings
●   Code Settings                           ●   Modules Settings
                                            ●   Content Types
                                            ●   Content
                                            ●   Views
                                            ●   Rules
                                            ●   ...


features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     9
Questions: What is exportable* right now?


Filesystem:                                Database:
●   Code                                    ●   Drupal Settings
●   Code Settings                           ●   Modules Settings
                                            ●   Content Types
                                            ●   Content

    *(and importable)
                                            ●   Views
                                            ●   Rules
                                            ●   ...


features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     10
Questions...




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     11
Questions: How to cooperate with a team*?

●   Working together on live?




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     12
Questions: How to cooperate with a team*?

●   Working together on live?
●   Working with ftp?




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     13
Questions: How to cooperate with a team*?

●   Working together on live?
●   Working with ftp?
●   Sharing sqldumps?




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     14
Questions: How to cooperate with a team*?

 ●   Working together on live?
 ●   Working with ftp?
 ●   Sharing sqldumps?
 ●   Overwriting others' work?


*(Perhaps a distributed team)




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     15
Questions: How to handle the staging issue?


Everything works on dev. Now what?




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     16
Questions: How to handle the staging issue?


Everything works on dev. Now what?
●   Install modules again on stage




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     17
Questions: How to handle the staging issue?


Everything works on dev. Now what?
 ●   Install modules again on stage
 ●
     Export Views, Rules, CT's manually from dev*




* Also possible via code for Rules[1] and Views[2]




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     18
Questions: How to handle the staging issue?


Everything works on dev. Now what?
●   Install modules again on stage
●
    Export Views, Rules, CT's manually from dev*
●   Import them manually into stage




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     19
Questions: How to handle the staging issue?


Whats about the „unexportable“ functionality?




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     20
Questions: How to handle the staging issue?


Whats about the „unexportable“ functionality?
Reproduce manually!




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     21
Questions: How to handle the staging issue?


Whats about the „unexportable“ functionality?
Reproduce manually:
●   Module Settings / Configuration




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     22
Questions: How to handle the staging issue?


Whats about the „unexportable“ functionality?
Reproduce manually:
●   Module Settings / Configuration
●   Roles and its Permissions




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     23
Questions: How to handle the staging issue?


Whats about the „unexportable“ functionality?
Reproduce manually:
●   Module Settings / Configuration
●   Roles and its Permissions
●   And so on...




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     24
Questions: How to handle the staging issue?


Whats about the „unexportable“ functionality?
Reproduce manually:
●   Module Settings / Configuration
●   Roles and its Permissions
●   And so on...
●   Ooops, i forgot the live environment, repeat....




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     25
Conclusion




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     26
Conclusion

●   Not a good strategy for a team...




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     27
Conclusion

●   Not a good strategy for a team...
●   No granularity...




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     28
Conclusion

●   Not a good strategy for a team...
●   No granularity...
●   Mostly cumbersome work...




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     29
Conclusion

●   Not a good strategy for a team...
●   No granularity...
●   Mostly cumbersome work...
●   Hard to use repeating patterns...




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     30
Conclusion

●   Not a good strategy for a team...
●   No granularity...
●   Mostly cumbersome work...
●   Hard to use repeating patterns...
●   Prone to errors...




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     31
Conclusion

●   Not a good strategy for a team...
●   No granularity...
●   Mostly cumbersome work...
●   Hard to use repeating patterns...
●   Prone to errors...
●   No revision history...




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     32
Conclusion

●   Not a good strategy for a team...
●   No granularity...
●   Mostly cumbersome work...
●   Hard to use repeating patterns...
●   Prone to errors...
●   No revision history...
●   No VCS / SCM...




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     33
features




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     34
features: The Features Module


Features
http://drupal.org/project/features

Requires ctools
http://drupal.org/project/ctools
●   Uses the ctools export API
●   Export functionality
    and configuration into code
●   Code means Drupal Module


features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     35
features: What can it handle?


Drupal Core:
●   CCK Fields
●   CCK Fieldgroups
●   Content Types
●   Dependencies (required modules)
●
    Menus and Menu links*
●   Permissions
●   Roles
●
    Taxonomy (Vocabularies)*                          * Currently in development.


features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     36
features: What can it handle?


Contributed Modules:
 ●   Context                                ●   ImageCache
 ●   CKEditor Profiles                      ●   Panels
                                                (Page Manager)
 ●   Feeds
                                            ●   Rules
 ●   Flags (from 6.x-2.x)
                                            ●   Views




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     37
features: What is missing?


●   Configuration
●   Custom Blocks
●   Input Formats
●   Content




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     38
features: Rule #35?


Rule #35: "There's a Drupal module for that." [3]




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     39
features: Rule #35 ­ Configuration


Strongarm
http://drupal.org/project/strongarm
●   Settings are usually stored
    in {variables}
●   Strongarm makes variables
    exportable via features
●   Uses the ctools export API




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     40
features: Rule #35 ­ Boxes


Boxes
http://drupal.org/project/boxes
●   A reimplementation
    of custom blocks (boxes)
●   Uses the ctools export API




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     41
features: Rule #35 ­ Content




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     42
features: Rule #35 ­ Content


Nodes, Node revisions, User, Taxonomy
http://drupal.org/project/uuid_features
●   Requires uuid
    → Universally Unique Identifier
    http://drupal.org/project/uuid
●   e.g. node/259 gets the following uuid:
    f3159efc-3e1c-102e-882c-fd9c148d8804




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     43
Features: Rule #35 ­ import formats 


Input Formats
http://drupal.org/project/input_formats
●   Allows you to export / import Input Formats
    manually like CT's and Views
●   Features Module Integration
●   Requires Exportables
    http://drupal.org/project/exportables
●   Requires Strongarm and Ctools, too




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     44
features: myfeature


A Profile CT with...
●   content_profile
●   cck_private_fields
●   flag_friend, flag_friend_access
●   content_taxonomy
●   And a lot of fields...




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     45
features: myfeature


 myfeature/
 ├── myfeature.features.content.inc
 ├── myfeature.features.fieldgroup.inc
 ├── myfeature.features.inc
 ├── myfeature.info
 ├── myfeature.module
 └── myfeature.strongarm.inc




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     46
Features: myfeature.info

core = "6.x"
dependencies[] = "cck_private_fields"
dependencies[] = "cck_private_fields_flag_friend"
dependencies[] = "content_profile"
...
description = "Myfeature desciption"
features[ctools][] = "strongarm:strongarm:1"
...
features[fieldgroup][] = "profile-group_personal"
...
features[node][] = "profile"
...
features[user_permission][] = "edit own profile content"
features[user_permission][] = "edit privacy options for field field_relations
features[user_permission][] = "view private data for field field_relationship
...
features[user_role][] = "Community member"
features[variable][] = "comment_anonymous_profile"
...
name = "myfeature"
package = "Features"



  features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     47
features: myfeature.module


 <?php

 include_once('myfeature.features.inc');




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     48
Features: myfeature.features.inc (1)


<?php

/**
  * Implementation of hook_ctools_plugin_api().
  */
function myfeature_ctools_plugin_api() {
   list($module, $api) = func_get_args();
   if ($module == "strongarm" && $api == "strongarm") {
     return array("version" => 1);
   }
}




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     49
Features: myfeature.features.inc (2)

/**
  * Implementation of hook_node_info().
  */
function myfeature_node_info() {
   $items = array(
     'profile' => array(
       'name' => t('Profile'),
       'module' => 'features',
       'description' => t('A user profile built as content.'),
       'has_title' => '1',
       'title_label' => t('Title'),
       'has_body' => '0',
       'body_label' => '',
       'min_word_count' => '0',
       'help' => '',
     ),
   );
   return $items;
}

features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     50
Features: myfeature.features.inc


<?php

/**
  * Implementation of hook_ctools_plugin_api().
  */
function myfeature_ctools_plugin_api() {
   list($module, $api) = func_get_args();
   if ($module == "strongarm" && $api == "strongarm") {
     return array("version" => 1);
   }
}




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     51
features: myfeature.features.content.inc

<?php

/**
  * Implementation of hook_content_default_fields().
  */
function myfeature_content_default_fields() {
   $fields = array();
   ...
   // Exported field: field_relationship_status
   $fields['profile-field_relationship_status'] = array(
     'field_name' => 'relationship_status',
     'type_name' => 'profile',
     'display_settings' => array(
        'weight' => '37',
        'parent' => 'group_common,
        'label' => array(
          'format' => 'above',
        ),
       ...
       'allowed_values' => 'solo^M
In a relationship^M
complicated',
       ...
      'label' => 'relationship status',
   );
}

features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     52
features: Specifications


Kit [4]
●   KIT Feature Specification (kitf 1.0-draft)
●   KIT Theme Specification (kitt 1.0-draft)




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     53
features: Known Issues


Lost in translation [5]...
 ●   e.g. a field is named 'Beziehungsstatus'
 ●   e.g. in your myfeature.content.inc
     you will get: t('Beziehungsstatus')
     that will be used as translation source
 ●   but it should be t('relationship status')
 ●   Still a open issue in Features Module [6]
 ●   Solution: Features Export Language [7]



features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     54
Drupal API: If a feature is not enough... 


You know, Drupal has an API...
Create Upgrade-Path's with Drupal's update.php
●   Create myfeature.install file
●   Implement hook_install()
    http://api.drupal.org/api/drupal/developer--hooks--install.php/function/hook_install/6

●   Implement hook_update_N()
    http://api.drupal.org/api/drupal/developer--hooks--install.php/function/hook_update_N/6

Perhaps you might use db_query()
or implement hook_you_name_it()



features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de              55
drush




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     56
drush fu


Features Module provides some drush commands:
●   drush features
●   drush features-export [feature name]
    [component list]
●   drush features-update [feature name]
●   drush features-revert [feature name]
●   drush features-diff [feature name]




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     57
drush: Useful features related extensions

●   Features Clone
    http://drupal.org/project/features_clone
●   Features Plumber
    http://drupal.org/project/features_plumber
●   Features Fetch
    http://drupal.org/project/features_fetch




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     58
Installation profiles


You might know Installation Profiles from...
●   DrupalCenter
●   OpenAtrium
●   Acquia Drupal
●   Commons
●   Open Publish
●   ...




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     59
Installation Profiles: myprofile

drupal-6.x/
├── COPYRIGHT.txt
├── cron.php
├── includes
├── index.php
├── install.php
├── misc
├── modules
├── profiles
│   ├── default
│   │    └── default.profile
│   └── myprofile
│        ├── myprofile.profile
│        └── translations
│            └── de.po
├── robots.txt
├── scripts
├── sites
├── themes
├── update.php
└── xmlrpc.php

features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     60
Installation Profile: myprofile.profile


/**
 * Implementation of hook_profile_modules()
 *
 * @return
 * array of modules to be required and activated
 */
function myprofile_profile_modules(){
   return array(

      // feature-stuff
      'myfeature',
       …
    );
}


features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     61
The Plus

●   Perhaps your own Drupal Distribution?




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     62
The Plus

●   Perhaps your own Drupal Distribution?
●   Feature Server
    http://drupal.org/project/fserver




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     63
The Plus

●   Perhaps your own Drupal Distribution?
●   Feature Server
    http://drupal.org/project/fserver
●   Drush Make
    http://drupal.org/project/drush_make




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     64
The Plus

●   Perhaps your own Drupal Distribution?
●   Feature Server
    http://drupal.org/project/fserver
●   Drush Make
    http://drupal.org/project/drush_make
●   Drush make UI
    http://drupal.org/project/drush_make_ui




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     65
The Plus

●   Perhaps your own Drupal Distribution?
●   Feature Server
    http://drupal.org/project/fserver
●   Drush Make
    http://drupal.org/project/drush_make
●   Drush make UI
    http://drupal.org/project/drush_make_ui
●   drush site-install
    (in drush core >= 4.0)



features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     66
The Plus

●   Perhaps your own Drupal Distribution?
●   Feature Server
    http://drupal.org/project/fserver
●   Drush Make
    http://drupal.org/project/drush_make
●   Drush make UI
    http://drupal.org/project/drush_make_ui
●   drush site-install
    (in drush core >= 4.0)
●   CI – Continious Integration
    (with e.g. Hudson / Jenkins)
features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     67
echo ­e “Thank you!n“


Questions?
 ●   @fl3a
 ●   http://is-loesungen.de
 ●   http://netzaffe.de




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de     68
cat ~/feature+/appendix/references.txt


[1] http://drupal.org/node/298634
[2] http://api.lullabot.com/hook_views_default_views
[3] Robert Douglass at DrupalCamp Stockholm
  http://twitter.com/#!/toddross/statuses/1970578988
[4] http://drupal.org/project/kit
[5] http://blog.erdfisch.de/2011/05/features-international
[6] http://drupal.org/node/874760
[7] http://drupal.org/sandbox/xamanu/1161994




features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de  
cat ~/feature+/appendix/image­credits.txt

●   Flea (RHCP)
    http://en.wikipedia.org/wiki/File:Flea_in_skeleton_t-shirt.jpg
●   Flea (anatomy)
    http://en.wikipedia.org/wiki/File:Scheme_flea_anatomy-en.svg
●   Feature Monster
    http://drupal.org/files/images/features_monster.png
●   The future of drupal features
    http://www.flickr.com/photos/developmentseed/3575550279/
●   Strongarm Monster
    http://drupal.org/files/images/strongarm.png
●   Boxes Monster
    http://drupal.org/node/820924
●   „Node Collision“
    http://www.slideshare.net/eaton/drupal-deployment-presentation
●   Adrian <3 drush
    http://www.flickr.com/photos/developmentseed/3614279203/
Feature related images by developmentSEED, monsters by Saman Bemel Benrud

features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de  

features+ #dcb11

  • 1.
    2011-09-18 @ drupalcity.de features+ „A Presentation about monsters, features and the plus“ features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   1
  • 2.
    whoami Florian Latzel ● @fl3a ● http://is-loesungen.de ● http://netzaffe.de features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   2
  • 3.
    whoami: f – l – 3 – what?! ● @fl3a → flEa features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   3
  • 4.
    whoami: f – l – 3 – what?! ● @fl3a → flea [fliː] features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   4
  • 5.
    whoami: f – l – 3 – what?! ● @fl3a → flea [fliː] features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   5
  • 6.
    whoami: f – l – 3 – what?! ● @fl3a → flea [fliː] features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   6
  • 7.
    whoami: fl3a → flEa → flea → floh... ● @fl3a → floh features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   7
  • 8.
    cat features+/toc.txt ● Questions ● Conclusion ● Features ● Drupal API ● Drush ● Installation profiles ● The Plus features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   8
  • 9.
    Questions: What is stored where? Filesystem: Database: ● Code ● Drupal Settings ● Code Settings ● Modules Settings ● Content Types ● Content ● Views ● Rules ● ... features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   9
  • 10.
    Questions: What is exportable* right now? Filesystem: Database: ● Code ● Drupal Settings ● Code Settings ● Modules Settings ● Content Types ● Content *(and importable) ● Views ● Rules ● ... features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   10
  • 11.
  • 12.
    Questions: How to cooperate with a team*? ● Working together on live? features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   12
  • 13.
    Questions: How to cooperate with a team*? ● Working together on live? ● Working with ftp? features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   13
  • 14.
    Questions: How to cooperate with a team*? ● Working together on live? ● Working with ftp? ● Sharing sqldumps? features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   14
  • 15.
    Questions: How to cooperate with a team*? ● Working together on live? ● Working with ftp? ● Sharing sqldumps? ● Overwriting others' work? *(Perhaps a distributed team) features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   15
  • 16.
    Questions: How to handle the staging issue? Everything works ondev. Now what? features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   16
  • 17.
    Questions: How to handle the staging issue? Everything works ondev. Now what? ● Install modules again on stage features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   17
  • 18.
    Questions: How to handle the staging issue? Everything works ondev. Now what? ● Install modules again on stage ● Export Views, Rules, CT's manually from dev* * Also possible via code for Rules[1] and Views[2] features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   18
  • 19.
    Questions: How to handle the staging issue? Everything works ondev. Now what? ● Install modules again on stage ● Export Views, Rules, CT's manually from dev* ● Import them manually into stage features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   19
  • 20.
    Questions: How to handle the staging issue? Whats about the„unexportable“ functionality? features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   20
  • 21.
    Questions: How to handle the staging issue? Whats about the„unexportable“ functionality? Reproduce manually! features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   21
  • 22.
    Questions: How to handle the staging issue? Whats about the„unexportable“ functionality? Reproduce manually: ● Module Settings / Configuration features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   22
  • 23.
    Questions: How to handle the staging issue? Whats about the„unexportable“ functionality? Reproduce manually: ● Module Settings / Configuration ● Roles and its Permissions features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   23
  • 24.
    Questions: How to handle the staging issue? Whats about the„unexportable“ functionality? Reproduce manually: ● Module Settings / Configuration ● Roles and its Permissions ● And so on... features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   24
  • 25.
    Questions: How to handle the staging issue? Whats about the„unexportable“ functionality? Reproduce manually: ● Module Settings / Configuration ● Roles and its Permissions ● And so on... ● Ooops, i forgot the live environment, repeat.... features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   25
  • 26.
  • 27.
    Conclusion ● Not a good strategy for a team... features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   27
  • 28.
    Conclusion ● Not a good strategy for a team... ● No granularity... features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   28
  • 29.
    Conclusion ● Not a good strategy for a team... ● No granularity... ● Mostly cumbersome work... features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   29
  • 30.
    Conclusion ● Not a good strategy for a team... ● No granularity... ● Mostly cumbersome work... ● Hard to use repeating patterns... features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   30
  • 31.
    Conclusion ● Not a good strategy for a team... ● No granularity... ● Mostly cumbersome work... ● Hard to use repeating patterns... ● Prone to errors... features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   31
  • 32.
    Conclusion ● Not a good strategy for a team... ● No granularity... ● Mostly cumbersome work... ● Hard to use repeating patterns... ● Prone to errors... ● No revision history... features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   32
  • 33.
    Conclusion ● Not a good strategy for a team... ● No granularity... ● Mostly cumbersome work... ● Hard to use repeating patterns... ● Prone to errors... ● No revision history... ● No VCS / SCM... features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   33
  • 34.
  • 35.
    features: The Features Module Features http://drupal.org/project/features Requires ctools http://drupal.org/project/ctools ● Uses the ctools export API ● Export functionality and configuration into code ● Code means Drupal Module features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   35
  • 36.
    features: What can it handle? Drupal Core: ● CCK Fields ● CCK Fieldgroups ● Content Types ● Dependencies (required modules) ● Menus and Menu links* ● Permissions ● Roles ● Taxonomy (Vocabularies)* * Currently in development. features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   36
  • 37.
    features: What can it handle? Contributed Modules: ● Context ● ImageCache ● CKEditor Profiles ● Panels (Page Manager) ● Feeds ● Rules ● Flags (from 6.x-2.x) ● Views features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   37
  • 38.
    features: What is missing? ● Configuration ● Custom Blocks ● Input Formats ● Content features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   38
  • 39.
    features: Rule #35? Rule #35: "There'sa Drupal module for that." [3] features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   39
  • 40.
    features: Rule #35 ­ Configuration Strongarm http://drupal.org/project/strongarm ● Settings are usually stored in {variables} ● Strongarm makes variables exportable via features ● Uses the ctools export API features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   40
  • 41.
    features: Rule #35 ­ Boxes Boxes http://drupal.org/project/boxes ● A reimplementation of custom blocks (boxes) ● Uses the ctools export API features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   41
  • 42.
  • 43.
    features: Rule #35 ­ Content Nodes, Node revisions,User, Taxonomy http://drupal.org/project/uuid_features ● Requires uuid → Universally Unique Identifier http://drupal.org/project/uuid ● e.g. node/259 gets the following uuid: f3159efc-3e1c-102e-882c-fd9c148d8804 features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   43
  • 44.
    Features: Rule #35 ­ import formats  Input Formats http://drupal.org/project/input_formats ● Allows you to export / import Input Formats manually like CT's and Views ● Features Module Integration ● Requires Exportables http://drupal.org/project/exportables ● Requires Strongarm and Ctools, too features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   44
  • 45.
    features: myfeature A Profile CTwith... ● content_profile ● cck_private_fields ● flag_friend, flag_friend_access ● content_taxonomy ● And a lot of fields... features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   45
  • 46.
    features: myfeature myfeature/ ├──myfeature.features.content.inc ├── myfeature.features.fieldgroup.inc ├── myfeature.features.inc ├── myfeature.info ├── myfeature.module └── myfeature.strongarm.inc features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   46
  • 47.
    Features: myfeature.info core = "6.x" dependencies[]= "cck_private_fields" dependencies[] = "cck_private_fields_flag_friend" dependencies[] = "content_profile" ... description = "Myfeature desciption" features[ctools][] = "strongarm:strongarm:1" ... features[fieldgroup][] = "profile-group_personal" ... features[node][] = "profile" ... features[user_permission][] = "edit own profile content" features[user_permission][] = "edit privacy options for field field_relations features[user_permission][] = "view private data for field field_relationship ... features[user_role][] = "Community member" features[variable][] = "comment_anonymous_profile" ... name = "myfeature" package = "Features" features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   47
  • 48.
  • 49.
    Features: myfeature.features.inc (1) <?php /** *Implementation of hook_ctools_plugin_api(). */ function myfeature_ctools_plugin_api() { list($module, $api) = func_get_args(); if ($module == "strongarm" && $api == "strongarm") { return array("version" => 1); } } features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   49
  • 50.
    Features: myfeature.features.inc (2) /** *Implementation of hook_node_info(). */ function myfeature_node_info() { $items = array( 'profile' => array( 'name' => t('Profile'), 'module' => 'features', 'description' => t('A user profile built as content.'), 'has_title' => '1', 'title_label' => t('Title'), 'has_body' => '0', 'body_label' => '', 'min_word_count' => '0', 'help' => '', ), ); return $items; } features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   50
  • 51.
    Features: myfeature.features.inc <?php /** *Implementation of hook_ctools_plugin_api(). */ function myfeature_ctools_plugin_api() { list($module, $api) = func_get_args(); if ($module == "strongarm" && $api == "strongarm") { return array("version" => 1); } } features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   51
  • 52.
    features: myfeature.features.content.inc <?php /** *Implementation of hook_content_default_fields(). */ function myfeature_content_default_fields() { $fields = array(); ... // Exported field: field_relationship_status $fields['profile-field_relationship_status'] = array( 'field_name' => 'relationship_status', 'type_name' => 'profile', 'display_settings' => array( 'weight' => '37', 'parent' => 'group_common, 'label' => array( 'format' => 'above', ), ... 'allowed_values' => 'solo^M In a relationship^M complicated', ... 'label' => 'relationship status', ); } features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   52
  • 53.
    features: Specifications Kit [4] ● KIT Feature Specification (kitf 1.0-draft) ● KIT Theme Specification (kitt 1.0-draft) features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   53
  • 54.
    features: Known Issues Lost in translation[5]... ● e.g. a field is named 'Beziehungsstatus' ● e.g. in your myfeature.content.inc you will get: t('Beziehungsstatus') that will be used as translation source ● but it should be t('relationship status') ● Still a open issue in Features Module [6] ● Solution: Features Export Language [7] features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   54
  • 55.
    Drupal API: If a feature is not enough...  You know, Drupalhas an API... Create Upgrade-Path's with Drupal's update.php ● Create myfeature.install file ● Implement hook_install() http://api.drupal.org/api/drupal/developer--hooks--install.php/function/hook_install/6 ● Implement hook_update_N() http://api.drupal.org/api/drupal/developer--hooks--install.php/function/hook_update_N/6 Perhaps you might use db_query() or implement hook_you_name_it() features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   55
  • 56.
  • 57.
    drush fu Features Module providessome drush commands: ● drush features ● drush features-export [feature name] [component list] ● drush features-update [feature name] ● drush features-revert [feature name] ● drush features-diff [feature name] features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   57
  • 58.
    drush: Useful features related extensions ● Features Clone http://drupal.org/project/features_clone ● Features Plumber http://drupal.org/project/features_plumber ● Features Fetch http://drupal.org/project/features_fetch features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   58
  • 59.
    Installation profiles You might knowInstallation Profiles from... ● DrupalCenter ● OpenAtrium ● Acquia Drupal ● Commons ● Open Publish ● ... features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   59
  • 60.
    Installation Profiles: myprofile drupal-6.x/ ├── COPYRIGHT.txt ├── cron.php ├──includes ├── index.php ├── install.php ├── misc ├── modules ├── profiles │ ├── default │ │ └── default.profile │ └── myprofile │ ├── myprofile.profile │ └── translations │ └── de.po ├── robots.txt ├── scripts ├── sites ├── themes ├── update.php └── xmlrpc.php features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   60
  • 61.
    Installation Profile: myprofile.profile /** * Implementationof hook_profile_modules() * * @return * array of modules to be required and activated */ function myprofile_profile_modules(){ return array( // feature-stuff 'myfeature', … ); } features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   61
  • 62.
    The Plus ● Perhaps your own Drupal Distribution? features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   62
  • 63.
    The Plus ● Perhaps your own Drupal Distribution? ● Feature Server http://drupal.org/project/fserver features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   63
  • 64.
    The Plus ● Perhaps your own Drupal Distribution? ● Feature Server http://drupal.org/project/fserver ● Drush Make http://drupal.org/project/drush_make features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   64
  • 65.
    The Plus ● Perhaps your own Drupal Distribution? ● Feature Server http://drupal.org/project/fserver ● Drush Make http://drupal.org/project/drush_make ● Drush make UI http://drupal.org/project/drush_make_ui features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   65
  • 66.
    The Plus ● Perhaps your own Drupal Distribution? ● Feature Server http://drupal.org/project/fserver ● Drush Make http://drupal.org/project/drush_make ● Drush make UI http://drupal.org/project/drush_make_ui ● drush site-install (in drush core >= 4.0) features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   66
  • 67.
    The Plus ● Perhaps your own Drupal Distribution? ● Feature Server http://drupal.org/project/fserver ● Drush Make http://drupal.org/project/drush_make ● Drush make UI http://drupal.org/project/drush_make_ui ● drush site-install (in drush core >= 4.0) ● CI – Continious Integration (with e.g. Hudson / Jenkins) features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   67
  • 68.
    echo ­e “Thank you!n“ Questions? ● @fl3a ● http://is-loesungen.de ● http://netzaffe.de features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de   68
  • 69.
    cat ~/feature+/appendix/references.txt [1] http://drupal.org/node/298634 [2] http://api.lullabot.com/hook_views_default_views [3]Robert Douglass at DrupalCamp Stockholm http://twitter.com/#!/toddross/statuses/1970578988 [4] http://drupal.org/project/kit [5] http://blog.erdfisch.de/2011/05/features-international [6] http://drupal.org/node/874760 [7] http://drupal.org/sandbox/xamanu/1161994 features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de  
  • 70.
    cat ~/feature+/appendix/image­credits.txt ● Flea (RHCP) http://en.wikipedia.org/wiki/File:Flea_in_skeleton_t-shirt.jpg ● Flea (anatomy) http://en.wikipedia.org/wiki/File:Scheme_flea_anatomy-en.svg ● Feature Monster http://drupal.org/files/images/features_monster.png ● The future of drupal features http://www.flickr.com/photos/developmentseed/3575550279/ ● Strongarm Monster http://drupal.org/files/images/strongarm.png ● Boxes Monster http://drupal.org/node/820924 ● „Node Collision“ http://www.slideshare.net/eaton/drupal-deployment-presentation ● Adrian <3 drush http://www.flickr.com/photos/developmentseed/3614279203/ Feature related images by developmentSEED, monsters by Saman Bemel Benrud features+ | 2011­09­18 | drupalcity.de | Florian Latzel | http://is­loesungen.de