
. How to use a scalable Git branching model called Gitflow
1. Throughout this series you've seen the number of branches that we use in order to manage our workflow growing. So to begin with, we started with a single branch called master and this is the branch that gets created when our repository is originally initialized, and we did all of our development on that branch. We even created a remote repository and cloned that repository in a production environment using just that branch, and we were all able to sync up code from our development site up to our production site and back again. Now, if you're a one-person team, this single branch model could be sufficient for you, but near the beginning of this series we explored using a feature branch in order to pull out our code into a separate branch and begin working on a feature making a series of commits to that feature before rolling it back into the master branch, the purpose of that being that we can create multiple feature branches and be able to polish our code on those features before pulling it into the main branch which will be pushed eventually to our production site.
2. Having our changes on that feature branch allows us to roll back simply by deleting the branch instead of having to roll back individual commits. So where this model starts to break down where we're using just a master and maybe some feature branches is when it comes to releasing to a production site that needs to be very stable; or maybe stability isn't a huge problem for you, but you have a larger team working together and so you need to make sure not to be stepping on each other's toes and breaking each other's development environments. In those situations, we need something a little bit more.
3. So one thing we did in the last video is we created a development branch and we made that the central branch where our development takes places, and then only when we are ready to release our code to our production site will we then push it straight to master. What this does is free us up a little bit to use that main development branch for actual development without having to worry too much about updating master and accidentally pulling in non-tested code. But there is still a couple of problems with that model, which is since we're using our development branch in order to push directly to production, that development branch could have some unmeasured features or some changes that we don't intend to push.
4. Also, it doesn't really give us a chance to test out our release code before we put it into production. In most website projects where stability is very important, where there is a large number of users or the types of users are very important to keep happy, then there will be a staging environment which is basically a duplicate of the production server where a new release is tested rigorously before that release then gets pushed to the production site. So a branching model that matches well with this model is to develop in the develop branch; and then at some point when you're ready for a release, you don't push directly to master, but instead you push to another branch called a release branch and that's the branch that you use on the staging server in order to test the release.
5. Now, as you find bugs and missing features on this release branch, you make fixes to that branch directly; and at the same time, there is still development going on in the development branch where people are adding new features and bug fixes that are going to be added to the next release. When the release is done being tested, it's then pushed to production and any changes that were made to this release are then merged back into the development branch in order to carry them forward to the next release. At that point, the release branch has had its life.
6. So then, what happens if we've pushed the release after we have tested it to the master branch, it's on production now and we find a bug? Well, this release is actually complete. We pushed it to master and we tagged it with a particular release version and we push those changes back to the development environment, and then we actually deleted this release branch because we are no longer going to make any modifications to it. Any bugs that we find that are now on the master branch are going to have to be fixed in a new release.
7. Now, some bugs are so important that they can't wait for the development branch to be ready for a new release. So a solution to this is to create another type of branch called the hotfix branch and what this does is it branches directly from master so it's got the same code base and then you make modifications to fix the bug, and then you merge it back with master, creating a new minor release of your software, of your application or website, and then you bring it back into development so that it's incorporated in the next release. Now, if you're new to version control and you are new to this whole concept of branching and merging, this is going to feel a little bit complex and a little bit overwhelming, and so it's totally okay for you to stick with a simple branching model using just the master branch, and experimenting a little bit with feature branches will get you a long way.
8. The rest of this setup though is a robust workflow that will work at any scale of project. So once you wrap your mind around it and maybe even employ it in your own projects, you're ready to work with a larger team; you're ready to work on projects that need great stability; and so it's a really good skill to have. Now, this whole branching model where there is master, develop, feature branches, release branches and hotfix branches is called Gitflow.
9. Now, a lot of the concepts in this model aren't really new, but they were brought together in this unique way to work with Git by a fellow named Vincent Driessen, and you can learn more about the model by going to nvie dot com slash posts a-successful-git-branching-model, and you see he's got some great diagrams here and he explains the purpose of each type of branch and what rules are associated with those branches. What's particularly excellent about this model is that even though it seems complex at first, this is really it. It's limited in its complexity.
10. Once you understand the purpose of each branch and integrate it in with your workflow, you really don't have to go any further than that when it comes to a branching-merging model. So in our next steps what we are going to do is talk through the creation of a release branch, a hotfix branch, and a feature branch and how to integrate those branches with a local development, a production and a team member's environment.
2. Having our changes on that feature branch allows us to roll back simply by deleting the branch instead of having to roll back individual commits. So where this model starts to break down where we're using just a master and maybe some feature branches is when it comes to releasing to a production site that needs to be very stable; or maybe stability isn't a huge problem for you, but you have a larger team working together and so you need to make sure not to be stepping on each other's toes and breaking each other's development environments. In those situations, we need something a little bit more.
3. So one thing we did in the last video is we created a development branch and we made that the central branch where our development takes places, and then only when we are ready to release our code to our production site will we then push it straight to master. What this does is free us up a little bit to use that main development branch for actual development without having to worry too much about updating master and accidentally pulling in non-tested code. But there is still a couple of problems with that model, which is since we're using our development branch in order to push directly to production, that development branch could have some unmeasured features or some changes that we don't intend to push.
4. Also, it doesn't really give us a chance to test out our release code before we put it into production. In most website projects where stability is very important, where there is a large number of users or the types of users are very important to keep happy, then there will be a staging environment which is basically a duplicate of the production server where a new release is tested rigorously before that release then gets pushed to the production site. So a branching model that matches well with this model is to develop in the develop branch; and then at some point when you're ready for a release, you don't push directly to master, but instead you push to another branch called a release branch and that's the branch that you use on the staging server in order to test the release.
5. Now, as you find bugs and missing features on this release branch, you make fixes to that branch directly; and at the same time, there is still development going on in the development branch where people are adding new features and bug fixes that are going to be added to the next release. When the release is done being tested, it's then pushed to production and any changes that were made to this release are then merged back into the development branch in order to carry them forward to the next release. At that point, the release branch has had its life.
6. So then, what happens if we've pushed the release after we have tested it to the master branch, it's on production now and we find a bug? Well, this release is actually complete. We pushed it to master and we tagged it with a particular release version and we push those changes back to the development environment, and then we actually deleted this release branch because we are no longer going to make any modifications to it. Any bugs that we find that are now on the master branch are going to have to be fixed in a new release.
7. Now, some bugs are so important that they can't wait for the development branch to be ready for a new release. So a solution to this is to create another type of branch called the hotfix branch and what this does is it branches directly from master so it's got the same code base and then you make modifications to fix the bug, and then you merge it back with master, creating a new minor release of your software, of your application or website, and then you bring it back into development so that it's incorporated in the next release. Now, if you're new to version control and you are new to this whole concept of branching and merging, this is going to feel a little bit complex and a little bit overwhelming, and so it's totally okay for you to stick with a simple branching model using just the master branch, and experimenting a little bit with feature branches will get you a long way.
8. The rest of this setup though is a robust workflow that will work at any scale of project. So once you wrap your mind around it and maybe even employ it in your own projects, you're ready to work with a larger team; you're ready to work on projects that need great stability; and so it's a really good skill to have. Now, this whole branching model where there is master, develop, feature branches, release branches and hotfix branches is called Gitflow.
9. Now, a lot of the concepts in this model aren't really new, but they were brought together in this unique way to work with Git by a fellow named Vincent Driessen, and you can learn more about the model by going to nvie dot com slash posts a-successful-git-branching-model, and you see he's got some great diagrams here and he explains the purpose of each type of branch and what rules are associated with those branches. What's particularly excellent about this model is that even though it seems complex at first, this is really it. It's limited in its complexity.
10. Once you understand the purpose of each branch and integrate it in with your workflow, you really don't have to go any further than that when it comes to a branching-merging model. So in our next steps what we are going to do is talk through the creation of a release branch, a hotfix branch, and a feature branch and how to integrate those branches with a local development, a production and a team member's environment.
Change Management and Version Control
Learn how to use the Git version control system and explore how to use the Features module to capture everything in code. In this collection we also discuss using the Drush command line tool, as well as:
- How to use the command line (even if you've never used it before)
- How to build, deploy and update a feature module
- How to use Git to build Drupal site scaffolding and extend Drush
Video Library
21m 46sIntroduction
21m1. Welcome to BuildAModule
3:121. A quick message from Chris Shattuck, the creator of BuildAModule3:372. Getting started with BuildAModule3:353. How to quickly create a remote Drupal site with Pantheon1:594. Brief overview of the Apache, MySQL, PHP (AMP) stack
2:205. How to install Drupal locally on Mac with Acquia Dev Desktop2:426. How to install Drupal locally on Windows with Acquia Dev Desktop2:557. How to import a default Drupal site into Acquia Dev Desktop1:268. How to use the resource pack
10h 36mBuild Your First Drupal 7 Web Site
36m1. Introduction to Our Project and Reviewing Mockups
1:491. Updates to the "Build Your First Drupal 7 Web Site" collection3:152. Introduction2:233. Review of the resources sent by the client3:114. Review of the home page mockup4:265. Review of the calendar, contact us and guide page mockups0:456. Recap of files in our client resource pack
4:447. How to map a mockup to existing Drupal elements3:038. How to use the administration menu and breadcrumbs to get around4:329. Overview of the Appearance page, how theme settings work and how to upload a new logo2:0210. How to hide the site name in the header4:0211. How to work around the disappearing logo bug1:5012. Chapter review and challenges for the "Introduction to Our Project and Reviewing Mockups" chapter
35m2. How to Create and Edit Content
2:1613. What this chapter covers and how to change the site name6:3114. How to add a new page and overview of settings on the "add content" form2:1915. What "node" means and how the notifications area works3:1416. How to edit a piece of content3:0917. How to set the default home page4:1618. How to add content as a menu item and how weight works
1:4419. How URL aliases work1:4720. Finishing adding the About Us page1:1521. How to change the position of a menu item with weight5:0622. Review of the Contact Us form mockup and how the Module listing page works1:1423. How to find a core module that you need and enable it2:0924. Chapter review and challenges for the "How to Create and Edit Content" chapter
38m3. How to Work With Menus, Modules and Webform
3:5725. How to work with the menu listing page1:2426. How to work with the menu "list links" page4:0727. How to enable, edit and move a menu item1:4028. How menu sorting impacts menu item weight4:5329. How to find help and configure the Contact module2:4130. How to disable and uninstall a module
4:3231. How to use the Update Manager module to install a module2:5332. How to set up the initial webform container6:0133. How to add an input to a webform, overview of component types and input options4:0134. Adding an email input and how machine names and tokens work1:5435. Chapter review and challenges for the "How to Work With Menus, Modules and Webform" chapter
41m4. How to Work With Content Types and Fields
4:0436. Finishing up the contact us webform3:2937. How to create a single item checkbox (sign up for newsletter) with Webform2:2438. Testing our contact form as logged in and logged out users (anonymous and authenticated)6:2839. How to view webform submissions and set up e-mail templates2:0240. How content types work3:4641. How to disable "published by" information and a review of the content type edit form
4:0542. How to add a new content type5:3843. How fields work and how to use the field edit form to change a field title3:5644. How to add a new field to a content type3:2345. Adding the rest of the fields we need for the Tour content type2:0446. Chapter review and challenges for the "How to Work With Content Types and Fields" chapter
37m5. How to Work With Pathauto and Introduction to Views
3:0647. Previewing our "add tour" form and introduction to the Pathauto module3:4948. How to install module dependencies4:2749. How to change automated URL alias settings for a content type with Pathauto1:1450. How to find a piece of content that doesn't have a menu item4:2851. How to update URL aliases after a pattern change with Pathauto2:0052. How to work with shortcuts in the shortcut bar
5:2853. What the Views module is for and how to install it1:3254. A deeper explanation of the Views module and the view listing page3:5655. Filling out the "add view" wizard5:5956. Overview of the "add view" settings page and how a view "display" works1:5557. Chapter review and challenges for the "How to Work With Pathauto and Introduction to Views" chapter
32m6. How to Add Fields to a View and Work With the Date Module
3:0558. How to add a new field to a view3:3159. How to set the label, wrap HTML and set default text for a field in a view2:5760. How to rewrite the output of a field to include other fields1:3961. How to edit a view from the view display2:2262. Adding our remaining view fields in quick succession
3:2263. How to adjust the sort order of content in a view4:5364. How to deal with module installation errors and install the Date module4:5865. How to add and configure a date field4:0566. How to work with the pop up calendar and extend the year range1:5367. Chapter review and challenges for the "How to Add Fields to a View and Work With the Date Module" chapter
36m7. How to Fix Broken Views and Work With Taxonomy
1:1768. How to delete a field from a content type4:3069. How to deal with broken views handlers and restore unsaved view changes3:5270. How to modify date formats both globally and in a view2:4271. How to sort view fields and fix broken sort handlers5:0072. How to change view menu settings and add a header4:4173. How to add a date-based filter to a view
1:5374. How to delete a piece of content and modify multiple pieces of content at the same time3:1775. Reviewing our guide data and adding another content type1:0276. A brief explanation of taxonomy2:1177. How to add a taxonomy vocabulary with terms3:4478. How to add a taxonomy term reference field to a content type2:0679. Chapter review and challenges for the "How to Fix Broken Views and Work With Taxonomy" chapter
35m8. How to use Term and Node Reference Fields
4:5380. Updating the guide automatic alias pattern and adding the guide data5:4181. How to share a field between two content types and why you would want to3:3982. Updating our calendar view to use a new field1:3183. Overview of the multiple ways to link a Views field to other related content2:3884. Overview of development (dev) versions of modules and installing the References module3:2785. Adding a node reference field and updating our content
3:0686. Updating our calendar view to use the new node reference field4:0887. How to add an autocomplete (free tagging) field to a content type2:1688. How to use an autocomplete field2:0289. Quickly removing a field and updating our view to use a different field2:0890. Chapter review and challenges for "How to Use Term and Node Reference Fields" chapter
31m9. How to Work With Blocks and Permissions
2:0091. A comparison of our current site to the mockups4:3092. What blocks and regions are, and how to use the blocks administration page2:0193. How to hide the user login and "Powered by Drupal" blocks3:4094. How to add a "log in" menu item to the user menu2:0495. How to enable a menu block and hide a block title1:2896. How to hide the secondary menu (user menu)
5:2097. What permissions are and how to modify them4:4098. How to configure search and how cron runs work2:2299. How to add a new user1:58100. How roles work and how to add a new role1:43101. Chapter review and challenges for "How to Work With Blocks and Permissions" chapter
31m10. Overview of Permissions and Text Formats
1:24102. Review of how roles and permissions work1:15103. What each permission does, from the Block to Menu modules5:44104. What each Node or content-related permission does2:52105. What each permission does, from the Path to System modules3:37106. What each permission does, from the Taxonomy to Views modules2:56107. What each Webform permission does, and a review of our Guide role
1:49108. Different methods for testing the site as another user3:36109. How to use the Masquerade module to act like another user2:28110. Adding a piece of content as a Guide4:00111. How text formats work1:34112. Chapter review and challenges for "Overview of Permissions and Text Formats" chapter
34m11. Configuring Text Formats and Setting Up a Wysiwyg
3:58113. Review of the text format settings page and how filters work1:34114. How to re-order text format filters and why order matters2:54115. How to configure text format filters2:11116. How to add a new text format3:58117. How to configure permissions for text formats2:05118. What Wysiwygs are and how to install the Wysiwyg module1:03119. The problems with Wysiwygs and possible alternatives
2:39120. How libraries work2:38121. How to install the TinyMCE library for the Wysiwyg module3:05122. How the Wysiwyg "Basic settings" and "Buttons and Plugins" options work3:20123. How the Wysiwyg "Editor appearance" and "Cleanup and output" options work3:13124. How the Wysiwyg "CSS" settings work and our Wysiwyg in action1:57125. Chapter review and challenges for "Configuring Text Formats and Setting Up a Wysiwyg" chapter
33m12. Working With Custom Blocks and Image Styles
3:43126. How to add a custom block2:41127. The difference between "URL" and "path" and how to use a "Show on specific pages" input2:08128. How to modify the visibility settings for a block0:50129. Seeing our new block in action4:33130. How to deal with shared field conflicts (unlimited vs. limited values)6:15131. How to add and configure an image field
1:48132. Previewing the display of our image field1:38133. How to hide a field label on a node display page3:26134. What image styles are and a review of existing image styles3:16135. How image style effects work and how to add a new image style1:45136. How to link up an image style with an image field1:50137. Chapter review and challenges for "Working With Custom Blocks and Image Styles" chapter
34m13. How to Work With CSS
3:24138. A recap of what we have covered so far, and what is to come1:35139. How to change the order of fields on the node display page1:10140. How to install Firebug in the Firefox browser2:37141. How to use Firebug to inspect any element3:38142. How to manipulate CSS with firebug4:00143. How to find a good selector and apply styles to a specific element
3:29144. How to rapidly experiment with CSS in Firebug3:30145. How to install the CSS Injector module and find most module configuration pages4:16146. How to add a custom CSS stylesheet to certain pages based on path with CSS Injector1:53147. How to use Firebug to learn more about what an element is2:36148. How to hide breadcrumbs (or any other element) using CSS1:52149. Chapter review and challenges for "How to Work With CSS" chapter
34m14. Troubleshooting Module Installation and Configuration
3:24150. Updating other guide nodes and using alt and title attributes for an image field2:07151. Review of what we need to complete our template2:10152. How to install the Media module3:22153. How to find a module dependency when it is not its own module project2:46154. Where to find information about a newly installed module1:41155. How managed and unmanaged files work, and the benefits of using the Media module
3:32156. How to upload an image with the Media module and use it as a background4:54157. What to do when CSS changes aren't being applied3:17158. What to do when you get a fatal error and how to clear all caches3:57159. How to search for an error in Google and tips for reading a long issue1:42160. The difference between module development versions and official releases2:04161. Chapter review and challenges for the "Troubleshooting Module Installation and Configuration" chapter
33m15. Updating Modules and Manipulating CSS
2:27162. How to check for module updates from your site3:36163. How to update a module with the Update Manager1:31164. How and why to clear Drupal's caches4:10165. How to update a module manually3:43166. How to fix our issue by reading the module help page1:36167. Summary of the steps we took to fix module errors
3:10168. How to insure image URLs work on a remote server3:30169. How to remove the background color of main menu tabs5:41170. What to do about disappearing CSS properties in Firebug2:12171. How to change the font size of the main menu items2:19172. Chapter review and challenges for the "Updating Modules and Manipulating CSS" chapter
32m16. More CSS Updates and Troubleshooting Text Formats
6:12173. How to adjust CSS in the footer using Firebug for testing3:03174. Adding and troubleshooting our footer CSS changes with CSS Injector1:47175. Finishing up our footer margin changes4:45176. How to add a repeating background image to the footer3:30177. Adding a new user with a new role
2:23178. Giving our new user permission to add, edit and delete pages2:17179. How to fix "This field has been disabled because you do not have sufficient permissions to edit it"2:58180. How content and text formats are related, and how to deal with placeholder text3:37181. How to integrate the Media module with a WYSIWYG2:14182. Chapter review and challenges for the "More CSS Updates and Troubleshooting Text Formats" chapter
31m17. How to Evaluate Modules and Install IMCE
4:32183. How to turn the Media browser Wysiwyg plugin on2:47184. How to troubleshoot permissions issues with a module2:33185. How to find solutions on Drupal.org by using Google and reading comments first4:28186. How to assess the health of a module by reviewing the module project page3:21187. How to learn more about what a module does by reading the module project page2:21188. Viewing a demo of IMCE and installing the IMCE module
1:58189. Overview of the IMCE main configuration page4:31190. How an IMCE profile configuration works1:27191. Comparing two IMCE configurations1:38192. How to set up a new IMCE configuration profile1:52193. Chapter review and challenges for the "How to Evaluate Modules and Install IMCE" chapter
44m18. How to configure IMCE and Wrap Up Our Project
4:59194. How to associate IMCE profiles with user roles and upload an image5:04195. How to embed an image in a Wysiwyg with IMCE4:10196. Why styles sometimes display properly in a Wysiwyg but not when viewing the content1:56197. Overview of two solutions to the Wysiwyg style inconsistency issue2:57198. Overview of how to set up a Wysiwyg to use a drop-down selector for CSS classes3:05199. How to configure the styles available in the Wysiwyg0:57200. How to add a class to an element in a Wysiwyg with the "font style" plugin1:18201. How to add easy-to-read aliases for class names in a Wysiwyg
3:20202. How to troubleshoot line break or paragraph problems in the Wysiwyg1:36203. Comparing our home page to the mockup4:10204. How to set a custom 404 "page not found" error page and navigate up paths1:38205. Adding a missing piece of content4:10206. Why it's a good idea to review all the settings when creating a piece of content1:44207. Chapter review and challenges for the "How to Configure IMCE and Wrap Up Our Project" chapter3:37208. Congratulations
6h 18mAdvanced Site Building in Drupal 7
23m1. Welcome to Advanced Site Building
1:521. Welcome to "Advanced Site Building"3:342. About our project and how project roles work4:113. What a "site builder" is and the powerful tools they work with1:224. What wireframes are and where to find them in our resource pack
2:485. Identifying the components in our blog home page wireframe2:476. Reviewing our blog post and review page wireframes0:527. About our step-by-step approach6:128. How to set up our Drupal installation with Acquia Dev Desktop
30m2. How to Set Up Administration Tools to Speed Up Productivity
1:399. About the administration modules we'll be using3:2810. How to install a module the traditional way and configure the Administration Menu module6:0811. How to install a module using Drush, and how we approach installing modules in this series1:1412. How to use the Coffee module1:1713. How the Navigate module works2:5414. How the Backup and Migrate module works and creating our first backup (Backup 1)1:3215. How to restore a Backup and Migrate backup
2:0316. How Backup and Migrate works with cron and cache tables3:5617. How the Module Filter module works2:3118. How the Module Instructions module works0:3919. About the Admin module and why we're waiting to install it1:5420. How to set up some basic visual branding0:5721. A quick summary of our work and backing up (Backup 2)
36m3. How to Configure Content Type Settings and Splitting Fields Between Types
1:5622. How to determine when to split up content into two content types3:4323. How to set sane default publishing settings for a content type1:3624. Why you would want to share existing fields between content types4:3525. How to set up an image field and why to use individual folders for media fields3:0526. How to choose a good, basic URL scheme and adding our first product1:2627. About the special role of the first created user (user 1)1:3928. Setting up our "review" content type
2:3929. How to install module depencies and installing the Entity Reference module2:1930. The difference between a field and a field instance, and setting up an entity reference field1:4431. About the Fivestar and Voting API modules4:0432. How to add a fivestar field and configure voting tags4:3733. Adding our additional fivestar fields and why site building can sometimes feel tedious2:4334. How to put field labels inline and hide the text below a fivestar rating
41m4. How to Use Display Suite for Grouping Fields and Positioning Content
1:0735. Creating a backup and why things are going to start getting interesting (Backup 3)3:2336. An overview of the two methods to group fields in a display: view modes and the views module2:2637. The 4 more common methods of positioning content on a page0:5838. Quick recap of the 4 methods of positioning content3:1639. How to choose the correct view mode for a particular context2:3340. Overview of the Display Suite modules and which ones we should enable2:0741. How to enable editing view modes and adding a custom view mode with Display Suite2:0642. How to enable a custom view mode and test it out2:0943. How to hide the 'submitted by' information and node title by setting a Display Suite layout
1:4344. How to add a field with custom content to a view mode with Display Suite1:4845. How to choose an image style for a particular context2:2846. When to create a new image style and how to name it0:3847. Creating a backup and nice work (Backup 4)3:3648. How to display content in a sidebar within the content region using Display Suite1:4349. How the 'region to block' feature works and what we mean by 'region'6:1050. How to display fields in blocks that can be enabled in theme regions using Display Suite1:5651. Removing the block title, label and shrinking our image style1:2652. Making another backup (Backup 5)
14m5. How to Use the Context Module for Positioning Content
2:0353. The limitations of the default blocks listing page and what the Context module does1:2554. Overview of the modules that come in the Context package and installing Context4:0055. How the Context module works and how to create a context
1:0456. Why it might make sense to use Context for positioning all blocks5:3457. How to use Context instead of the default blocks configuration page0:3658. Creating a backup before diving into Panels (Backup 6)
42m6. How to Use Panels for Positioning Content
1:1159. Why we're looking at so many ways of doing the same thing2:5460. About your responsibilities as a site builder, and thinking in terms of boxes1:1761. Why Panels is so powerful and potentially intimidating2:4062. How to install Panels and what the Page Manager module does4:2263. How variants work in Panels3:4664. How to use the Panels builder layout to understand regions, rows, columns and canvas1:5165. How to add a panel pane that contains a full node2:1366. How to add a pane for a node field and what we still need to complete our Panels layout0:5567. How to modify a context with the Context module
1:5268. How we will approach aligning the title with the content sidebar in Panels2:2869. How to install the Meta tags and Token modules4:2970. Attempting to display the title of our panel by using the node title pane (and failing)1:5771. Why using the page title Panel pane doesn't work for our panel page title2:0772. How to add custom content to a panel pane3:0373. How to inspect an HTML element to find out why it looks different than we want it to0:4274. A pre-exploritory backup (Backup 7)4:2875. Comparing Panels and Display Suite side-by-side
48m7. How to Import Content With Feeds
1:3176. About what's coming up next (Feeds and Views)1:3277. About what the Feeds and Migrate modules accomplish2:5678. About the Feeds modules, alpha releases and why the UI (user interface) is in a separate module2:4779. What to do when there isn't a recommended module release, and about development releases3:1380. How to structure a CSV (comma-separated values) file for Feeds and a bit about our import4:4781. How to import nodes with the Feeds module (basic settings and importer)6:0182. How to import nodes with the Feeds module (parser and processor settings)2:0283. How to import nodes with the Feeds module (mapping title, body and image)2:3284. How to import nodes with Feeds and undo our import
2:2685. Setting up our node images in our files directory and what we need to rewrite an image path2:0386. How to install the Feeds Tamper module5:0187. How to use Feeds Tamper to rewrite the path of an image so it imports properly2:4788. Setting up our product review Feeds importer3:3689. Setting up our mappings for the product review Feeds importer2:2490. Updating our product review nodes manually2:0191. How to bulk publish nodes and strategy for importing content for site building0:3992. Backing up our project (Backup 8)
48m8. Advanced Views
3:1093. Why to display a single piece of content with Views, installing Views, and why we're building the same view 3 times5:2994. How to group views displays, and how to decide what entity to base a view on1:4695. How to fill in the views wizard to create a block1:5196. How contextual filters work in the Views module2:2797. How to add a views contextual filter for the node currently being viewed1:2398. How to preview a view with a contextual filter3:4899. How to display a full node in a views block1:09100. Why to disable a block even when it's not visible, and displaying a block only for certain node types1:37101. How to display a block for certain node types using Context2:30102. Comparison between using Context and the default blocks configuration workflow
2:39103. The difference between our two views and filling out the views wizard1:43104. How relationships work in Views and how to add a referencing entity relationship2:49105. How to create a contextual filter with a relationship in Views2:27106. How to use fields or rendered entities when using a relationship in Views0:53107. Enabling our product-based block with Context1:49108. How to hide a block title using the Context module and why it's a bad idea1:38109. How to hide a Views block title0:56110. About how we're going to rebuild these views using fields instead of a view mode5:44111. How rebuilding our review-based view using fields adds complexity2:16112. How to rebuild our product-based view to use fields
30m9. Where Display Modules Overlap and URL Strategy
0:32113. Backing up our work (Backup 9)2:25114. Where Panels, Views, Display Suite and Context overlap in functionality5:22115. Overview of options for displaying blocks in sidebars (Panels, Views, Display Suite, Context)3:23116. How to use Mini-Panels to create one block that includes all our global blocks2:00117. How to position a Mini-Panel block using the Context module2:24118. How and why to hide PHP errors with the "Logging and errors" settings1:30119. How to disable a view and removing blocks using Context
1:35120. Why ordering blocks across multiple contexts is tricky, and what we're about to do2:33121. How we will approach creating an exception for a site-wide context2:38122. How to set good default URL alias patterns and installing the Pathauto module1:31123. Why it's important to establish a URL alias strategy before launching a site1:33124. How to bulk update the URL aliases of existing nodes and how the Global Redirect module works2:09125. How to use multiple conditions in a context and exclude certain paths1:02126. Adding our mini-panel block back in through the "review page" context
28m10. How to Work With User Fields and Import Users
0:25127. Backing up our work (Backup 10)2:07128. About the views-based blocks we're about to build2:35129. How to add a textual bio field to a user3:38130. How to install the Link module and configure a link field2:30131. The problem with using Feeds with user images, and adding a user avatar3:15132. Setting up our user image field
4:05133. How to use an image field as the user avatar with the User Picture Field module0:56134. Hiding our default user avatar and why we did this switch again3:14135. Reviewing our settings for our user feeds importer3:17136. Setting up our mappings and tamperings for our user feeds importer2:34137. Importing our users and moving our user images over
34m11. Formatting a Blog Entry Page
0:38138. Backing up our work (Backup 11)3:15139. When to use the core blog module, and when to create your own from scratch1:50140. Reviewing our blog content structure in a CSV file3:11141. Creating our basic blog entry content type6:03142. Adding a 'tags' field and image field to our blog entry content type1:19143. Moving our blog images over to prepare for the feeds importer2:09144. Verifying and adjusting our blog entry feeds importer settings
2:47145. Setting up our blog entry feeds importer mappings2:30146. How to import multiple entries into a single field using the "explode" feeds tamper plugin1:46147. Why to use multiple roles with fewer permissions, and why our import fails1:41148. How to add a "blog contributor" role and assign roles to multiple users at once1:37149. Importing and verifying our blog entry content3:35150. Cleaning up the display of our blog entry display2:01151. How we will approach building our "About the author" block
12h 48mPHP Programming Basics
25m1. Series Introduction and Your First PHP Script
3:021. Welcome to PHP Programming Basics5:142. What programming is and tips for following along1:593. Overview of the AMP stack (Apache, MySQL, and PHP)2:204. How to install Acquia Dev Desktop on a Mac
2:425. How to install Acquia Dev Desktop on Windows2:556. How to import a default Drupal site on Dev Desktop4:067. Setting up our example folder and creating our first web page3:418. Creating our first PHP script and the structure of a simple PHP statement
45m2. Working With Strings and Variables in PHP
1:469. What an IDE is and the benefits of using one2:1210. How to work with white space and comments4:4111. How to work with strings2:4412. How to use a variable7:0413. How to work with string, number and boolean variables5:5614. How to identify and fix common syntax errors2:4915. How a PHP function is structured and how to use strstr()
3:0316. How to use the string functions nl2br(), trim() and strlen()1:3817. Practical uses for strstr(), nl2br(), trim() and strlen()3:3918. How to use additional string functions like str_replace() and strip_tags()3:0319. How to use the date() function to display a readable date6:0120. How to read a PHP.net function page1:2121. String function challenges
31m3. How to Work With Arrays in PHP
5:3922. How to work with simple arrays and use var_dump()4:1223. How to work with associative arrays8:0924. How to work with multi-dimensional arrays
7:4425. How to use array functions like asort(), array_pop() and array_rand()4:5226. How to work with array-like objects1:1927. Array function challenges
40m4. Logic, Control Structures and Looping
1:3028. What logic is and how we're approaching learning it3:3229. How to use an "if" control structure4:3530. How to use an "if ... elseif" control structure6:0831. Incorporating what we know about arrays and control structures in a random generator script5:5132. Adding additional elements of randomness to our random generator script
3:3633. How to use a "foreach" loop6:4334. How to use a foreach loop to generate an HTML table from an array4:3735. How to use a "while" loop1:0036. How to use a "for" loop and how it compares to "while"2:3637. How to modify PHP settings with the php.ini file and stop runaway scripts
1h5. Creating Custom Functions and Working With External Data
1:1338. Why separating data from logic is important6:1239. How to use include() and include_once()1:5540. Moving our data into a user-friendly text file3:5441. How to use an output buffer to store data from an external file as a string5:3442. How to create a parser that converts a comma-separated string (CSV) into an array3:0943. How and why to create a simple custom function1:3544. How to create a function that accepts parameters4:0545. How to create a function that has optional parameters and build a virtual dice roller1:4646. A deeper explanation of the purpose of custom functions4:1447. How to work with references in a function (i.e. variables with an ampersand)
1:3948. A quick summary of what we've covered so far, and what's to come3:2249. How to wrap existing code in a function5:3850. How to generalize our random text generator code to make it more powerful3:2451. Using our random text generator script to create a virtual Twister spinner4:1252. Wrapping our people parser in a function, reviewing the code and identifying improvements7:3853. Reviewing our generalized parsing function, part 15:5754. Reviewing our generalized parsing function, part 26:3255. Exploring our generalized table rendering function2:5056. Re-using our table rendering function and evaluating our changes
22m6. Troubleshooting errors and using operators
2:3257. Accidentally assigning a variable instead of comparing it2:5458. Troubleshooting a missing closing bracket1:3459. Troubleshooting a missing opening bracket2:1160. Troubleshooting a missing parenthesis1:2061. Troubleshooting the "Wrong parameter count" error
3:3262. How to use assignment and string operators2:4063. How to use comparison operators1:4764. How to use arithmetic and incrementing operators2:0365. How to use logical operators2:0166. How to use array operators
1h7. Working With Forms in PHP
4:0767. The lifecycle of a form and chapter overview6:0668. How to process a simple form with PHP1:4069. A quick overview of the next three form examples4:1070. How to use a hidden input to distinguish multiple forms on one page and how $_REQUEST works2:0071. The HTML structure of a simple contact form2:0672. How to pre-fill form inputs, and seeing our rendered forms4:0073. How to use a switch statement and the $_POST variable6:1074. How to process a contact form and send a plain text mail with PHP3:4275. How to keep data in an input after a form is submitted, and a quick revie9:1776. How to run our examples in a remote development environment with Pantheon8:0477. How to run our examples in a remote development environment with WebEnabled
5:1978. How to use a ternary operator and our search form in action3:1179. Stepping through our search form code the first time the form is generated8:5080. Stepping through our search form code after a search is submitted3:3381. Demoing our random text generator with a form for user-set tokens3:3982. Stepping through our random text generator form code the first time it's generated6:4483. Stepping through our random text generator form code after it's been submitted5:1084. How to use file comparison tools to see differences between files1:4885. Demoing our random text form with loop-generated infinite inputs5:5686. Stepping through our infinite randomness code the first time it's loaded2:0987. Stepping through our infinite randomness code after submitting the "number of inputs" form3:3288. Stepping through our infinite randomness code after submitting the "random generation" form
1h8. Working With Sessions in PHP
4:1189. How use to sessions and the $_SESSION variable to store user information1:1890. Demoing our log in form3:0091. How to create a log in form4:3492. How to handle log in errors when submitting an invalid username and password3:0593. How to log a user in after submitting a valid username and password2:1294. How to log out a user and pass variables through the URL3:5995. A demo of our text adventure game13:1296. Stepping through our code the first time the game is loaded, and how global variables work9:3797. Entering a command in our text adventure game, and using the eval() function
6:1298. Stepping through our game code as we move south and north8:5599. Stepping through our game code as we pick up and item, use it, then reset our game4:38100. How an index.php page works, and a quick demo of our refactored game2:20101. The pros and cons of using .inc files, and a review of our new file structure3:02102. The benefits of creating a function library and reviewing our index and function files6:12103. Reviewing the updates we made to avoid using global variables6:01104. Continuing our review, the benefits of generalizing code and caching data4:22105. Wrapping up our review of changes in our refactored text adventure3:29106. Creating a render function for our game as a final touch
1h9. Working With the (MySQL) Database
4:22107. The benefits of using a database (MySQL)4:42108. What databases and tables are, plus a quick tour of PHPMyAdmin5:06109. What SQL is and how to write a simple SELECT query2:45110. How to filter SQL query results with LIKE and wildcards4:47111. How to create your first database and table4:04112. How to change column types using PHPMyAdmin and adding our final entry5:40113. How to use AND and LIKE with two wildcards in a query6:03114. How to connect to a MySQL database with PHP3:11115. How to run a MySQL database query in PHP
2:44116. How to use ORDER BY to sort query results and a couple other query examples2:23117. How to move our database connect script to a commonly included file3:36118. How to add new fields to a table and a warning about modifying existing tables2:46119. Populating our new people table columns and demoing our login form2:36120. Comparing our array-based login form to our database-based version1:17121. How to turn off magic quotes for a more realistic server enviornment4:38122. What an SQL injection attack is and how to create one2:51123. How to protect against an SQL injection attack1:37124. The two types of attack, and brief explanation of defense strategy
1h10. Working with CRUD functionality and our database
2:27125. What CRUD is (Create, Read, Update, Delete) and how to backup a database in PHPMyAdmin4:23126. How to import from PHPMyAdmin and protect against Cross Site Request Forgeries (CSRF)3:21127. How to display a list of database data in an HTML table using PHP2:34128. How to create a "delete" HTML link that deletes a database record2:36129. How an INSERT statement is structured, and a demo of our insert form3:05130. Reviewing the diffrences after added the insert form to our script4:59131. How to generate an INSERT statement using a loop, and a review of our workflow2:55132. Why to validate forms, and a demo of validating numbers, usernames and empty inputs3:32133. Comparing the validation changes made in our CRUD script5:46134. How to use looping in validation and validate empty and numeric inputs
3:44135. How to validate alphanumeric inputs and unique usernames2:14136. Demo of our update form script1:17137. How to structure an UPDATE statement and the importance of not forgetting WHERE5:54138. Reviewing changes where we added the ability to update a record4:19139. How to use the same form to both create and update records6:02140. Walking through our add and edit form code as it is processed2:13141. Ways that our CRUD script could be refactored and improved6:09142. Comparing our refactored changes to our previous CRUD script1:32143. A quick review of our CRUD form improvements
2h11. How to Build Your Own Content Management System and Understand Drupal Better
2:41144. Additional ways that we could use databases and our next big example3:13145. Reviewing the visual structure of our static site1:07146. Reviewing the folder and file structure of our static site5:35147. Comparing the HTML structure of our home and about pages3:23148. How to create a header template file3:53149. Creating our footer and applying our templates to the home page2:07150. Applying our header and footer to our other pages1:52151. Reviewing our product page and identifying repetition that can be turned into a function4:03152. How to render our products with a function to reduce HTML repetition3:01153. When to use unique identifiers (IDs) and what a universally unique ID is (UUID)5:00154. How to use a central product array for both of our product listings1:54155. Applying our product rendering function to the product page1:27156. The benefits of routing every page request through a single file with mod_rewrite2:24157. How a .htaccess file works and how to set one up5:41158. How to route all URLs through a single file (the Front Controller pattern)3:29159. How to use the URL query string to trigger an include1:32160. How to use the heredoc syntax to avoid escaping multiple quotes2:06161. Why to use a full page template file instead of a header and footer2:50162. A quick summary of our changes and a review of our other include files
1:27163. Why it's useful to have configurable settings for the end user and to reuse on other sites6:04164. Walking through changes after adding configurable settings2:14165. Why it's better to use a function for settings instead of direct variables3:24166. What still needs to happen to allow end users to manipulate data on our site3:19167. Creating the database and users table for our next steps1:38168. Demo of our CMS login form5:42169. Adding our database connect script, notices function and login links3:52170. How our login and logout features work2:18171. Demo of our new edit, delete and add user features0:48172. Reviewing changes in our login form6:53173. What happens in our updated CRUD code when we submit a user edit form5:52174. What happens in our updated CRUD code when we add a user5:24175. The problem with using relative or absolute paths in subfolders4:23176. Using a URL function to route all requests to the right location regardless of subfolder3:28177. Creating our products database table and populating it2:41178. Discussing the similiarties that will exist between our product and user administration pages1:04179. Demo of our updated product CRUD script4:17180. Comparing the code in our user and product CRUD scripts2:25181. Reviewing changes in our product rendering code, and how the WHERE IN SQL syntax works
1h12. Generalizing Functionality and Object Oriented Programming Primer
1:37182. Why generalizing CRUD functionality makes so much sense1:35183. Setting up the next steps and a demo of our generalized CRUD script5:30184. How to distill CRUD configuration options into an array1:25185. Overview of the functions in our generalized CRUD script6:09186. How to create a generalized record listing function6:51187. How to build a generalized CRUD edit and add form function5:39188. How to build a generalized CRUD form validation function3:46189. How to create a generalized CRUD form processing script1:54190. Summary of what we've accomplished, and a few challenges2:00191. How to set up a database table to store page data5:26192. Demoing our page administration tools and adding our adding our first pages6:00193. How to load pages from both files and the database
3:29194. How to convert file-based pages to database-based pages, and deciding which to convert1:16195. How this split file and database structure relates to Drupal3:41196. What we've accomplished with our CMS, compared to other CMS's like Drupal3:07197. Challenge your new PHP skills with these CMS enhancements1:20198. Why there's no need to be scared of OOP (Object Oriented Programming)2:30199. Demonstration of our new object oriented CRUD code2:38200. The weaknesses of function-based coding, and what objects are in OOP3:57201. How classes, methods, properties and constructors work3:29202. How instantiation works, and comparing our old render function to our new OOP one1:39203. How to use properties in a class1:35204. What extending a class means0:26205. Congratulations on finishing PHP Programming Basics
12h 23mDrupal 7 Development Core Concepts
22m1. Welcome to Module Building
6:241. Why to build a module instead of modifying source code, and how this video series works2:582. Setting up the module folder3:363. About the .info file
35m2. How to Build Module Scaffolding
3:356. Setting up the .module file structure4:067. The .info file in detail11:528. The .module file in detail
7:479. Adding a module settings page in an include file5:5210. Adding documentation with the README file2:3111. Review and next steps for the "How to Build Module Scaffolding" chapter
1h3. How Hooks Work and How to Use Them
5:5812. What hooks are and a demo of our final module9:5713. How hooks are invoked with module_invoke_all()3:3114. How hooks are invoked with module_invoke()5:2115. How hooks are invoked through custom functions0:4116. Summary of hook implementations4:5717. Using hook_init() to execute code on every page2:0418. How to watch data change in the database
2:3619. How to implement hook_permission()7:4320. Adding a settings page with hook_menu()4:2521. Implementing scheduled events with hook_cron()3:3022. Adding a block starting with hook_block_info()5:1923. Adding block configuration with hook_block_configure()10:4024. Displaying a block with hook_block_view() and checking permissions with user_access()3:1925. Seeing our final module in action and next steps
26m4. Overview of Coding Standards
6:2526. Why coding standards are useful and important2:5027. Using the Coder module to find problems2:4728. Working with white space2:1629. Using operators1:2530. Defining functions and class constructors
1:3031. Working with arrays2:0832. Quotes and string concatenation2:2633. Writing good comments2:2834. Including code files, php tags and semi-colons2:1435. A few miscellaneous items
51m5. Development Tips and Tricks
3:0436. About the Tips module11:1837. Using url() and l() to generate URLs and links5:5138. Using the t() function to make text translatable8:4139. Using variable_set(), variable_get() and variable_del()
13:0540. IDE features and comparison6:2941. How to find out if your module exists already2:4642. Review and next steps for the "Development Tips and Tricks" chapter
1h6. How to Build and Manipulate Forms with the Form API
6:1643. The benefits of using the Form API7:2544. Creating a simple form3:3345. Creating an embedded form5:3146. Using validation functions2:3347. Creating submission functions6:3748. Exploring more form elements and attributes
5:0949. Adding usability with the #states attribute7:5450. Modifying forms with hook_form_alter()7:3351. Adding autocomplete to a text input12:4452. Using the #ajax attribute for dynamic form building8:5153. Creating confirmation forms7:1654. Creating a module settings form
1h7. How to Add and Manipulate Pages With the Menu System
4:4255. How the menu system works5:4756. A simple menu callback9:4157. How to use render arrays and tabs2:0958. How to use sub-tabs2:0159. How to add a page without adding a menu item5:2960. How to pass arguments through the path
5:0261. How to use placehoders to pass arguments in the middle of a path8:1362. How to load objects through placeholders4:0963. How to create dynamic titles with a title callback7:5364. How to modify page output with hook_page_alter()4:0365. How to modify menu items with hook_menu_alter()5:2266. How to use include files to improve performance and next steps
52m8. How to Add to and Manipulate the Theme Layer
4:1267. How the theme layer helps designers and coders work together4:3968. How to invoke a theme function1:3669. A more complex example of theme_item_list()5:1470. How to theme tables and the essence of theming6:4471. How to implement a theme function and how the theme registry works
6:4772. How to create template files7:4173. How to use preprocessing functions5:4174. How to add CSS files in theme functions and template files5:5075. How to override theme functions with hook_theme_alter()4:1576. How to override template files and next steps
1h9. How to Work With the Database
3:3177. What is the Database API2:3178. Preview of the final module6:3979. Review of existing module3:1980. How to use table schemas and a description of the Schema module3:5481. Building a database table in an external application6:5582. Setting up the install file and generating a schema with the schema module6:4883. The wrong way to write queries, and restructuring the module5:3684. How to write an INSERT query with the Database API
3:1785. The 4 big benefits of using the Database API3:4286. How to write a static SELECT query with the Database API2:2887. How to write a DELETE query with the Database API9:1288. How to write a dynamic SELECT query and easily paginate a result set3:2089. A dynamic SQL query in action5:4890. Using hook_update_N() to add a new table8:5891. Adding utility queries and functions for INSERT, SELECT and DELETE1:4992. Review and next steps for the "How to Work With the Database" chapter
54m10. How to Work With Users
2:4493. What this video covers and a preview of the final module5:0094. How to modify the user settings form11:1895. How to save data to an authenticated user6:2396. How to modify the user page6:2197. How to work with user permissions (complete)
3:3398. How to respond to a user login or logout4:1099. How to add user bulk operations9:14100. How to store anonymous user data in a cookie4:04101. How to store user data in a session variable1:45102. Review and next steps of the "How to Work With Users" chapter
1h11. How to Work With Nodes
2:03103. Introduction to the Node API10:09104. How to load and view a single node and create fake content2:47105. How to load and view multiple nodes at once3:13106. How to manipulate node data with node_save()13:03107. How to add custom data to a node with hook_node_insert() and hook_node_update()8:35108. How to display custom node data in forms and in the node display5:00109. How to add a custom view mode
4:19110. How to add bulk operations6:02111. How to control node-based access using hook_node_access()7:37112. How to control node-based access using grants9:27113. How to add a new node type with a module3:43114. How to remove custom content types when a module is uninstalled5:57115. How to add a custom field formatter1:31116. Review and next steps for the "How to Work With Nodes" chapter
2h12. How to Work With JavaScript and jQuery
5:59117. Two major use cases for jQuery and JavaScript and what this video covers6:51118. How to include a JavaScript file on every page and intro to the jQuery object7:08119. How to load JavaScript after a page is done loading3:22120. How to use the dollar sign as an alias for the jQuery object9:18121. How to use jQuery selectors9:03122. How to manipulate content in the DOM (Document Object Model) with jQuery6:10123. How to use jQuery events to add interactivity6:14124. How to use effects and work with CSS in jQuery11:22125. How to use Drupal behaviors to add JavaScript functionality to new content10:58126. How to use drupal_add_js() to include and set the weight of JavaScript files
6:15127. How to use drupal_add_js() to add inline JavaScript, use the footer, and store settings5:09128. How to include and define a Drupal JavaScript library3:25129. How to use hook_library_alter() to see what JavaScript libraries are available14:54130. How to use the Drupal Ajax library to load dynamic HTML2:38131. How to dynamically load JavaScript and CSS with Ajax2:26132. How to display status messages when using Ajax3:06133. How to add CSS styles, classes, and JavaScript alerts through Ajax commands7:14134. An overview of JavaScript utilities included in core Drupal2:14135. Review and next steps of the "How to Work With JavaScript and jQuery" chapter
9h 25mChange Management and Version Control
49m1. Installing Git and Working on the Command Line
5:591. Welcome to "Change Management and Version Control"7:362. How to install Git on Windows with mysygit3:053. How to install git and SmartGit on a Mac7:304. How to create a Git repository and add a complete Drupal site to it7:125. Why the command line can be scary, and the benefits of conquering your fear
7:086. How to navigate file structures and stop processes on the command line3:237. How to edit and save text files on the command line with VIM2:518. How to use built-in help on the command line5:009. How to create, move, copy and remove files on the command line
58m2. Staging, Committing and Undoing in Git
10:5310. Introduction to version control6:3111. How to stage and unstage files and what staging means2:2812. How to commit a file and stage multiple files5:5913. Why certain files are ignored and how to add your own ignored files3:0514. How to commit unstaged changes and modify staged files4:4915. How to use the diff command to review modifications
3:2716. How to use git help5:0017. How to use SmartGit to view graphical diffs and revision trees5:5218. How to undo modifications to staged and unstaged files2:1719. How to use the log command for viewing revision information5:5120. How to undo commits2:0621. Quick summary of undoing in Git
34m3. Branching, Merging and Tagging in Git
3:5422. How to move files in Git4:0623. Introduction to branching and merging in Git5:0924. How to create a new branch and navigate existing branches5:1425. How to merge with and without branch history1:3126. How to modify an existing commit message
0:5227. How to delete a branch5:1928. How to use a stash to save uncommited changes when switching branches3:0129. How to apply a saved stash2:2330. Quickly commiting, merging and deleting a branch3:2031. How to add, remove, list and rename tags
1h4. Working With Remote Git Repositories
2:5832. How remote central repositories work11:0533. How to create an account on GitHub and set up SSH key pair authentication6:1134. How to set up a remote repository and connect to it1:1635. What we'll be doing now with our remote repository3:0936. How to clone our remote repository into a production environment5:0037. How to push a change from dev to production with push, fetch and merge1:3338. How to push a change from dev to production with push and pull
6:5039. How to undo commits to a remote repository3:1740. How to push changes from production to dev8:5641. What conflicts are and how to resolve them3:2342. How to create a branch and track it remotely6:5843. How to create a release with a develop-master branch system3:0144. How to set up a new environment for a team member
38m5. Deploying Releases, Features, and Fixes With Git
6:4145. How to use a scalable Git branching model called Gitflow1:3846. Summary of how to use release, hotfix and feature branches8:3747. How to create, deploy and clean up a release branch1:2648. Release branch cycle summary
5:0949. How to create, deploy and clean up a hotfix branch8:5550. How to troubleshoot pushes, pulls and conflicts with a feature branch3:0251. Merging an update into a feature branch, then deploying and cleaning up2:3752. Summary of lessons learned in the feature branch cycle
24m6. How to Version Control the Database
5:5053. Overview of database components you can add to version control2:5754. Where to store version controlled assets2:0355. How to set up an assets folder that is not accessible via the web3:3156. How to export a database schema for version control
4:0957. How to export database content for version control3:0358. Cleaning up our assets folder and rolling our assets into a feature branch3:2259. How often should you update version controlled database dumps and why
1h7. How To Version Control Site Configuration With Features
9:2560. Overview of a typical push cycle, with and without version control1:5061. How to download and install the Features module10:0962. How to build a feature module, and how each component group works1:4763. The 3 big benefits of having our components in a feature module2:4864. How to revert a modification to a feature module component3:4165. How to install and use the Diff module to view feature module overrides7:4466. How to learn more about your feature by reviewing the code5:3367. How to update a feature and review updates with Git diff
1:4368. How to revert a feature once changes are in code3:0869. How to deploy a feature module2:3870. Overview of merging multi-user changes to the same component3:0471. Pushing a feature modification and explaining unsolicited changes8:4172. How to merge our feature component changes and update a feature module4:0973. How to organize features and implications of getting everything into code2:5774. How to re-organize components into new features with the UI or the .info file4:5275. Overview of other exportable components and enabling a copied feature module
25m8. How To Manage Non-Exportable Configuration Changes
2:0776. Overview of using Selenium IDE to store config-building macros7:0877. How to create and modify a Selenium macro that builds a node4:1778. How to export Selenium tests and creating one more test
2:3679. How to keep team members up to speed with manual changes using a simple list3:3980. How to package several repository modifications into multiple commits6:0281. How to load and play back Selenium tests to update another environment
57m9. How to Override Shared Features and Modify Text
4:5382. The challenges of overriding shared feature modules and some solutions4:4583. How to override a box title, and how to learn about what else we can change4:0084. How to override block position, and a brief overview of the Context module2:5785. How to override user permissions5:4086. How to override Views options like title, ajax and number per page4:4087. How to override a Views query, like changing node type or order
2:5288. How to override a menu item title4:5189. How to override variables and how the Strongarm module works3:4490. How to modify interface text and version control the overrides5:1991. How to use a version controlled settings.php include to share settings6:0992. How to find and override strings with dynamic content or links7:1593. How to override a feature module by cloning
33m10. How to Upgrade Drupal and Patch Contributed Modules
8:3894. How to patch a module3:4695. How to upgrade a module sustainably4:1196. How to prepare for a minor Drupal upgrade
7:5997. How to use a patch to upgrade the Drupal codebase4:5698. How to upgrade the Drupal codebase the traditional way3:4299. How to complete a minor upgrade
37m11. How to Install Drupal, Manage Features and Perform Common Tasks Using Drush
5:31100. Introduction to Drush, the ultimate Drupal productivity tool2:53101. How to install Drush on a Mac1:12102. How to install Drush on Windows4:25103. How to use Drush status, help, clear-cache and archive-dump2:04104. Overview of using Drush to speed up Features
5:44105. How to update, review and revert feature modules with Drush3:44106. How to add new components to a feature module with the .info file and Drush5:35107. How to download and install Drupal using Drush2:14108. How to download and enable a module or theme using Drush3:58109. How to update Drupal core and contributed modules using Drush
31m12. How to Configure Drush and use Drush Make
3:59110. How to set up a Drush configuration file (drushrc.php) and use shell aliases1:52111. How to set up a global Drush configuration file4:35112. How to use Drush aliases to simultaneously work with multiple Drupal installations3:43113. How to set up a remote site alias for Drush3:20114. Why building site scaffolding is tricky and how Drush Make can save you time
1:45115. How to install Drush Make and any Drush extension6:27116. How to create and run a Drush Make file3:27117. How to generate a Drush Make file from an existing Drupal installation2:29118. How to quickly generate a Drush Make file with drushmake.me
37m13. How to Extend Drush and Other Useful Drush Tools
3:53119. How to review and filter Watchdog log messages with Drush4:43120. How to add, remove and manage users with Drush5:01121. How to extend Drush with PHP scripts and run arbitrary PHP on-the-fly5:42122. How to pass arguments to a custom PHP script for use with the Drush php-script command
4:09123. How to install and use the Drush sandwich example command4:51124. How the Drush example custom sandwich command works5:20125. How to create a custom Drush command3:23126. How to perform SQL queries in Drush and quickly set variables
8h 1mDrupal Theming Essentials
1h1. Important Drupal Theming Concepts
3:141. Who these theming videos are for and what they do (and don't) cover7:182. What is the difference between designing, theming and coding, and why do they overlap so much?10:403. What are all of the different ways to modify Drupal output?3:254. How to determine which method to use when modifying output2:315. A conceptual introduction to the Features module for exporting configuration options as code4:046. How to decide whether to use a module or a theme for your modifications2:427. How to decide when to use a theme function or template file9:528. How the theme registry works5:119. How to find out where any piece of output comes from
6:0510. What view modes are and why you would use them7:1011. How to adjust node view modes through the user interface5:5512. What field formatters are and how to use them to modify field output5:2413. How coding standards apply to the theme layer, and how to add comments to template files10:5314. Template file coding standards and conventions2:4815. How to apply CSS coding standards4:3516. Theme troubleshooting and what to do when you don't see your theme output changes applied7:3117. How to troubleshoot CSS problems in your theme4:0118. Review of 'Important Drupal Theming Concepts' and review
1h2. How to Build and Modify a Drupal Theme or Sub-Theme
7:1819. Overview of included themes and the themes directory, and where to put new themes6:4520. How the different parts of a theme work9:0121. Learning about theme structures by reviewing core Drupal themes4:5222. Learning from the Zen theme file structure2:4023. Learning from the Basic theme file structure2:5624. Learning from the Fusion theme file structure2:2525. Learning from the Marinelli theme file structure8:2026. Review of the theme .info file options
4:4327. How to create a theme folder, add an info file and enable a custom theme5:0028. How to add a screenshot2:5629. How to add a default logo file5:1830. How to override the page template with a page.tpl.php file9:2831. How to add a new region and what regions are4:4632. How to add a CSS file4:5733. How to add a JavaScript file
1h3. How to Build and Modify a Drupal Theme or Sub-Theme, Part 2
5:4534. How to add a new setting to the theme settings form4:4635. How to set a default for a theme setting and use it in a template file9:2536. How the template.php file works and a review of the Bartik theme template.php file5:5737. Learning from the Garland and Seven template.php files4:5238. How to add a template.php file and use a page preprocessing function4:1239. The advantages and disadvantages of using a sub-theme
5:5440. How to create a sub-theme5:1541. How sub-themes inherit or override base theme components6:3442. How to override CSS, JavaScript and screenshot files of a base theme using a sub-theme3:1143. The advantages of copying an existing theme10:5444. How to create a new theme by copying an existing theme6:1345. Overview of theme CSS file structures
54m4. Theme CSS File Structure and Extended Drupal Theme Building
10:3346. A close look at the Bartik stylesheet structure2:5847. A quick look at the Garland and Seven theme stylesheet structures5:5048. How the Zen theme uses extensive CSS files for learning6:4249. Review of the Basic and Fusion CSS file structures
5:1950. How to enable element toggling with theme 10:1351. How to add CSS or JavaScript files to a theme conditionally based on node type9:2752. How to add CSS or JavaScript files to a theme conditionally based on path or user role3:4353. Review and next steps for the "Theme CSS File Structure and Extended Drupal Theme Building" chapter
1h5. Template Files, Theme Function Overrides and Preprocessing Functions
4:2054. Before you start, is there a simpler way?13:2655. Why use template files, how file suggestions work, and setting up for later examples8:5456. How to use the page template file (page.tpl.php) and override it by path9:0657. How to use the node template file (node.tpl.php) and override it by content type or node ID10:5958. How to use the block template file (block.tpl.php) and override it by module, region or delta8:2359. How to use the comment (comment.tpl.php) and comment wrapper (comment-wrapper.tpl.php) template files4:2560. How to name preprocessing functions to use with theme functions and template files5:5261. How to use simple preprocessing functions
3:5262. How to apply preprocessing code only in certain situations4:0163. How template file suggestions work in depth and adding new suggestions10:2964. How to override template files for specific conditions using template file suggestions2:0265. How to override a theme function7:1866. Theme function override examples8:1067. How to conditionally add CSS classes to the body, page and node wrapper tags for easier styling4:3468. A practical example of adding a conditional body class3:2869. Review and next steps for the "Template Files, Theme Function Overrides and Preprocessing Functions" chapter
1h6. How to Work With Drupal Theme Settings
6:3570. What this chapter covers and basic global toggle options available in the theme setting4:5671. Overview of additional element toggle options such as main and secondary menus7:1372. How to tell when global or theme-specific settings are used, and how to uninstall a theme5:5473. How to add a custom theme setting and set a default for it2:4374. How to use the custom theme setting in code using theme_get_setting()3:2175. Overview of how the color module works to add custom color selections to a theme
2:1076. What steps are required to integrate the color module with your theme6:3177. Overview of color module integration files part 1, including the color.inc file7:3778. Overview of color module integration files part 2, including the preview.js file10:4579. How to add a new color selector to your theme with the color module2:1980. Review of the "How to Work With Drupal Theme Settings" chapter
8h 55mDrupal 6 Development and Tools
3h1. Essential Concepts
3:301. How to install and uninstall a module14:032. How to build your first Drupal module13:473. Introduction to hooks8:214. How to add permissions27:135. Introduction to the Form API12:446. How to make your module customizable21:337. How to add and configure blocks
10:138. How to add JavaScript and CSS15:079. How to theme a Drupal module16:1810. How to create an install script19:0011. How to create, format and validate a form21:2412. How to improve form validation and process a form18:4713. How to create edit and delete forms and alter other forms10:2914. How to apply for a Drupal CVS account
27m2. Working with jQuery and Javascript
1h3. Securing a Module
19:2917. A review of module security and the t() function16:5018. How to use string filtering functions, l() and url()
17:2219. How to use drupal_get_token() and user_access()13:2220. How to work with the database securely
58m4. Testing and Debugging a Module
1h5. PHP and MySQL Basics
23:0126. Introduction to MySQL, tools and SELECT queries24:4027. How to use JOINs, insert variables and INSERT, UPDATE and DELETE
1h6. Using Komodo Edit as an IDE
5:2328. How to create a project in Komodo Edit8:5929. How to work with projects in Komodo Edit11:0330. How to work with files in Komodo Edit12:2831. Understanding the Komodo Edit interface
10:1932. How to create snippets with variables and options11:2633. Advanced snippet usage: Key binding, tabstops and abbreviations13:4734. How to use templates in Komodo Edit
2h 17mWorking with Files and the File API
39m1. How to Work With Files and the File API
2:431. What this video covers and a demo of our node-free image gallery module2:242. What the difference is between a URI and a URL3:223. What stream wrappers are and how they work1:364. How the private file system works5:155. How file and folder permissions work, and best practices
2:416. How to set up PHP to properly handle file uploading5:457. How to create a simple form with an unmanaged file input5:028. How to use a form validation function to validate a file3:369. How to use hook_file_validate() to validate an uploaded file6:4310. How to use core file validation functions and define your own validator
1h2. How to Work With Files and the File API, Part 2
7:5611. How to process an unmanaged file and recursively create a directory7:3212. How to use file_unmanaged_copy() to move a file to a permanent location7:3713. How to loop through a file directory and create a URL from a URI6:4914. How to delete an unmanaged file4:5215. How to recursively delete all unmanaged files in a directory10:0716. How to use the private file system with unmanaged files7:3017. How private files are delivered and how to troubleshoot private file issues
10:3418. How to add a managed file input to a form5:5719. How to validate a managed file, prevent it from being deleted and add a usage marker5:5820. How to use the EntityFieldQuery class to match certain criteria and display the results6:4221. How to delete managed files6:0822. How to work with private managed files4:1923. How to configure and use X-Sendfile to improve private file performance6:0524. A quick look at the code behind stream wrappers
22m 53sAppendix
22m1. Mentored Training Resources
Double-tap to return to library