- Chapter 1: Developing for Drupal 7 (Day 1)
- Introducing Drupal (for developers) (Day 1)
- Technologies that drive Drupal (Day 1)
- PHP
- Databases and MySQL
- HTML, CSS, and JavaScript
- Other technologies
- The web server
- The Operating System
- Technologies that drive Drupal (Day 1)
- Drupal architecture (Day 1)
- Drupal core libraries
- Drupal hooks
- Drupal core modules
- The database
- The theme system
- Drupal's major subsystems (Day 1)
- Themes
- Menus
- Nodes
- Files
- Users
- Comments
- Fields and entities
- Forms API
- Simple test
- Blocks
- Other subsystems
- Tools for developing Drupal code (Day 2)
- Version control with Git and CVS
- The API site and coding standards
- Developer-oriented modules (Day 2)
- The developer module
- Drush (the Drupal shell)
- Coder
- Introducing Drupal (for developers) (Day 1)
- Chapter 2: Creating Your First Module (Day 2)
- Our goal: a module with a block
- Creating a new module (Day 2)
- Module names
- Where does our module go?
- Creating the module directory
- Writing the .info file
- Creating a module file
- Source code standards
- Doxygen-style doc blocks
- The help hook
- The t() function and translations
- Working with the Block API (Day 2)
- The block info hook
- The block view hook
- The first module in action
- Writing automated tests (Day 2)
- Creating a test
- Starting out
- Writing a test case
- The basic pattern
- The getInfo() method
- Setting up the test case
- Writing a test method
- Creating a test
- Chapter 3: Drupal's Theme Layer (Day 3)
- Business logic versus presentation logic (Day 3)
- Data granularity
- Theme engines
- Two ways to theme (Day 3)
- Theme functions
- Preprocess functions
- Theme overrides
- Template files The preprocess zoo
- Theme functions
- Render elements (Day 3)
- Render properties
- hook_element_info
- hook_page_alter()
- The power of theme() (Day 3)
- Theme hook suggestions
- Theme registry (Day 3)
- Variable default values
- hook_theme
- hook_theme_registry_alter
- Chapter 4: Theming a Module (Day 4)
- Reusing a default theme implementation (Day 4)
- Drupal blocks revisited
- Theming a Drupal block
- Render element and a theme hook suggestion
- Creating a pre_render function
- Attaching CSS to render arrays
- RTL languages
- Steps to build a default theme implementation (Day 4)
- hook_theme() implementations
- Variables versus render element
- Preprocess functions
- Template files
- Reusing a default theme implementation (Day 4)
- Chapter 5: Building an Admin Interface (Day 5)
- The User Warn module (Day 5)
- Starting our module
- The Drupal menu system (Day 5)
- Defining a page callback with hook_menu
- Using wildcards in menu paths
- Form API (Day 5)
- Using drupal_get_form()
- Building a form callback function
- Managing persistent data
- Form submission process
- A shortcut for system settings
- A shortcut for confirmation forms
- Sending mail with drupal_mail() and hook_mail() (Day 5)
- Calling drupal_mail()
- Implementing hook_mail()
- The token system (Day 5)
- What are tokens?
- Implementing tokens in your text
- Chapter 6: Working with Content (Day 6)
- Why create your own entities (Day 6)
- The goal
- Bundles
- The Schema API
- Declaring our entity (Day 6)
- The entity declaration
- The entity controller
- Entity management (Day 6)
- Managing artwork types
- Adding artworks (Day 6)
- Adding new artwork
- Validation callback
- Submit callback
- Saving your artwork
- Handling revisions
- Viewing artworks (Day 6)
- Editing an artwork
- Chapter 7: Creating New Fields (Day 7)
- Our goal: a "dimensions" field
- How Field API works
- Creating our new field type (Day 7)
- Declaring the field
- Defining the field structure
- Defining empty
- Field settings
- Field validation
- Exposing fields to the Form API with widgets (Day 7)
- Declaring a widget
- Simple widget forms
- Complex widgets
- Using formatters to display our field (Day 7)
- Declaring a formatter
- Single-value formatters
- Complex formatters
- Managing non-Field fields (Day 7)
- Finding entities and fields
- Chapter 8: Drupal Permissions and Security (Day 8)
- Using user_access() to assert permissions
- Checking the proper user account
- Using hook_permission() (Day 8)
- Defining your module's permissions
- Writing hook_permission()
- Declaring your own access functions (Day 8)
- Responding when access is denied
- Enabling permissions programmatically
- Defining roles programmatically
- Securing forms in Drupal (Day 8)
- The Forms API
- Disabling form elements
- Passing secure data via forms
- Running access checks on forms
- Handling AJAX callbacks securely (Day 8) Using AJAX in forms Using AJAX in other contexts
- Chapter 9: Node Access (Day 9)
- Node Access compared to user_access() and other permission checks (Day 9)
- How Drupal grants node permissions
- The node_access() function (Day 9)
- The access whitelist
- Caching the result for performance
- Invoking hook_node_access()
- Access to a user's own nodes
- Invoking the node access API
- hook_node_access() compared to {node_access}
- Using hook_node_access() (Day 9)
- A sample access control module
- A second access control module
- View operations and access control modules
- When to write a node access module (Day 9)
- The {node_access} table and its role
- {node_access} table schema explained
- Defining your module's access rules
- Creating the role access module (Day 9)
- Using hook_node_access_records()
- Using hook_node_grants()
- Security considerations
- Rebuilding the {node_access} table
- Modifying the behavior of other modules (Day 9)
- Using hook_node_grants_alter()
- Using hook_node_access_records_alter()
- Testing and debugging your module (Day 9)
- Using Devel Node Access
- Using hook_node_access_explain()
- Using the Devel Node Access by user block
- Node Access compared to user_access() and other permission checks (Day 9)
- Chapter 10: JavaScript in Drupal (Day 10)
- JavaScript inside Drupal
- Adding JavaScript (Day 10)
- Adding JavaScript and CSS files to .info files
- Using drupal_add_js() (Day 10)
- Adding JavaScript files
- Adding CSS files
- Passing variables from PHP to JavaScript
- Adding inline JavaScript
- Adding inline CSS
- Using the Library API (Day 10)
- Defining a library with hook_library
- Altering information in hook_library
- Using renderable arrays
- Altering JavaScript (Day 10)
- Altering CSS
- Drupal specific JavaScript (Day 10)
- Themeable presentation
- Translatable strings
- Behaviors
- AJAX helpers
- Adding AJAX to forms (Day 11)
- AJAX automatically applied
- AJAX commands (Day 11)
- ajax_command_after
- ajax_command_alert
- ajax_command_append
- ajax_command_before
- ajax_command_changed
- ajax_command_css
- ajax_command_data
- ajax_command_html
- ajax_command_prepend
- ajax_command_remove
- ajax_command_replace
- ajax_command_restripe
- ajax_command_settings
- Chapter 11: Working with Files and Images (Day 11)
- The Twitpic and watermark modules
- Files in Drupal (Day 11)
- File API (Day 11)
- Stream wrappers
- Creating a stream wrapper
- Images in Drupal (Day 11)
- Image API
- Image Styles
- Creating image effects
- Creating image styles from a module
- Chapter 12: Installation Profiles (Day 12)
- Introducing installation profiles (Day 12)
- Drupal distributions (Day 12)
- Setting up a distribution
- Standard and minimal profiles
- Creating a profile directory
- Profile modules and themes
- Creating profiles (Day 12)
- Enabling modules
- The install task system
- Choosing an install task or using hook_install
- Anatomy of an install task
- Creating a task
- Altering tasks
- Configuring blocks
- Variable settings
- Text filters
- Code placement
- Running the installer from the command line (Day 12)
- The first week:
- Day 1: Cài đặt 1 site Drupal với các module cơ bản. Tìm hiểu các khái niệm chính.
- Day 2: Tìm hiểu về coding standards, git và drush, drush make.
- Day 3: Viết 1 module đơn giản, hiển thị thông tin người dùng hiện tại.
- Day 4: Tìm hiểu về theme, block và page.
- Day 5: Tìm hiểu về form và form api. tạo 1 page có form nhập liệu và 1 page hiển thị thông tin vừa nhập.
- The second week:
- Day 1: Tìm hiểu về Drupal DB và Entity.
- Day 2: Tìm hiểu và tạo mới 1 số content type và taxonomy.
- Day 3: Tìm hiểu về user permission và user_access().
- Day 4: Tìm hiểu về node_access().
- Day 5: Tạo ra 1 số trang listing và detail cho các content type ở trên. Sử dụng user_access và node_access để phân quyền.
- The third week:
- Day 1: Tìm hiểu về sử dụng javascript, js và css trong site.
- Day 2: Tìm hiểu về sử dụng ajax.
- Day 3: Tìm hiểu về tổ chức file và image trong site drupal.
- Day 4: Tìm hiểu về profile.
- Day 5: Tạo ra trang home_page, sử dụng block, template file để hiển thị thông tin. Sử dụng js để thêm 1 slide-show vào home page.
- The last week:
- Day 1:
- Day 2:
- Day 3:
- Day 4:
- Day 5: