Support for Drupal 7 is ending on 5 January 2025—it’s time to migrate to Drupal 10! Learn about the many benefits of Drupal 10 and find migration tools in our resource center.
This needs a little work, but currently it will create a new subtheme within the adaptivetheme directory (although it should be created outside of it, in the standard themes dir).
This file should be called adaptivetheme.drush.inc and be placed in your ~/.drush folder for drush 4.4, anything later than 4.4 (4.x dev), this file can remain inside the adaptivetheme directory and will be available to drush.
The command to invoke it is:
drush adaptivetheme "Your Theme Name" yourthemename
adaptivetheme.drush.inc
<?php
/**
* @file
* Contains functions only needed for drush integration.
*/
/**
* Implementation of hook_drush_command().
*/
function adaptivetheme_drush_command() {
$items = array();
$items['adaptivetheme'] = array(
'description' => 'Create a theme using adaptivetheme.',
'arguments' => array(
'name' => 'A name for your theme.',
'machine_name' => '[optional] A machine-readable name for your theme.',
),
'options' => array(
'name' => 'A name for your theme.',
'machine-name' => '[a-z, 0-9] A machine-readable name for your theme.',
'description' => 'A description of your theme.',
'without-rtl' => 'Remove all RTL stylesheets.',
),
'examples' => array(
'drush adaptivetheme "My theme name"' => 'Create a sub-theme, using the default options.',
'drush adaptivetheme "My theme name" my_theme' => 'Create a sub-theme with a specific machine name.',
),
);
return $items;
}
/**
* Create a adaptivetheme sub-theme using the existing sub theme.
*/
function drush_adaptivetheme($name = NULL, $machine_name = NULL) {
// Determine the theme name.
if (!isset($name)) {
$name = drush_get_option('name');
}
// Determine the machine name.
if (!isset($machine_name)) {
$machine_name = drush_get_option('machine-name');
}
if (!$machine_name) {
$machine_name = $name;
}
$machine_name = str_replace(' ', '_', strtolower($machine_name));
$search = array(
'/[^a-z0-9_]/', // Remove characters not valid in function names.
'/^[^a-z]+/', // Functions must begin with an alpha character.
);
$machine_name = preg_replace($search, '', $machine_name);
// Determine the path to the new subtheme by finding the path to adaptivetheme_subtheme.
$adaptivetheme_subtheme_path = drush_locate_root() . '/' . drupal_get_path('theme', 'adaptivetheme_subtheme');
$subtheme_path = explode('/', $adaptivetheme_subtheme_path);
array_pop($subtheme_path);
$subtheme_path = implode('/', $subtheme_path) . '/' . str_replace('_', '-', $machine_name);
// Make a fresh copy of the original starter kit.
drush_op('adaptivetheme_copy', $adaptivetheme_subtheme_path . '/', $subtheme_path);
// Rename the .info file.
$subtheme_info_file = $subtheme_path . '/' . $machine_name . '.info';
drush_op('rename', $subtheme_path . '/adaptivetheme_subtheme.info', $subtheme_info_file);
// Alter the contents of the .info file based on the command options.
$alterations = array(
'= AT Subtheme' => '= ' . $name,
);
if ($description = drush_get_option('description')) {
$alterations['Starter subtheme for Adaptivetheme. Copy this subtheme to get started building your own Drupal theme. For help see our <b><a href="http://adaptivethemes.com/documentation/base-theme">documentation</a></b> and <b><a href="http://vimeo.com/channels/61157">video tutorials</a></b>. If you have a problem and need additional help please use the <b><a href="http://drupal.org/project/issues/adaptivetheme">issue queue</a></b>.'] = $description;
}
drush_op('adaptivetheme_file_str_replace', $subtheme_info_file, array_keys($alterations), $alterations);
// Replace all occurrences of 'adaptivetheme_subtheme' with the machine name of our sub theme.
drush_op('adaptivetheme_file_str_replace', $subtheme_path . '/theme-settings.php', 'adaptivetheme_subtheme', $machine_name);
drush_op('adaptivetheme_file_str_replace', $subtheme_path . '/template.php', 'adaptivetheme_subtheme', $machine_name);
// Remove all RTL stylesheets.
if ($without_rtl = drush_get_option('without-rtl')) {
foreach (array('forms', 'html-reset', 'layout-fixed', 'layout-liquid', 'navigation', 'pages', 'tabs') as $file) {
// Remove the RTL stylesheet.
drush_op('unlink', $subtheme_path . '/css/' . $file . '-rtl.css');
drush_op('adaptivetheme_file_str_replace', $subtheme_path . '/css/' . $file . '.css', ' /* LTR */', '');
}
}
// Notify user of the newly created theme.
drush_print(dt('Starter kit for "!name" created in: !path', array(
'!name' => $name,
'!path' => $subtheme_path,
)));
}
/**
* Copy a directory recursively.
*/
function adaptivetheme_copy($source_dir, $target_dir, $ignore = '/^(\.(\.)?|CVS|\.svn|\.git|\.DS_Store)$/') {
if (!is_dir($source_dir)) {
drush_die(dt('The directory "!directory" was not found.', array('!directory' => $source_dir)));
}
$dir = opendir($source_dir);
@mkdir($target_dir);
while($file = readdir($dir)) {
if (!preg_match($ignore, $file)) {
if (is_dir($source_dir . '/' . $file)) {
adaptivetheme_copy($source_dir . '/' . $file, $target_dir . '/' . $file, $ignore);
}
else {
copy($source_dir . '/' . $file, $target_dir . '/' . $file);
}
}
}
closedir($dir);
}
/**
* Replace strings in a file.
*/
function adaptivetheme_file_str_replace($file_path, $find, $replace) {
$file_contents = file_get_contents($file_path);
$file_contents = str_replace($find, $replace, $file_contents);
file_put_contents($file_path, $file_contents);
}
This is an adaptation of John Albin's zen.drush.inc in the 7.x-5.x release
Comment | File | Size | Author |
---|---|---|---|
#7 | adaptivetheme-drushsubtheme-1235942-7.patch | 5.11 KB | KrisBulman |
#6 | adaptivetheme-drushsubtheme-1235942-5.patch | 5.76 KB | KrisBulman |
#4 | adaptivetheme.drush.inc (renamed during attach) | 5.14 KB | agileadam |
Comments
Comment #0.0
KrisBulman CreditAttribution: KrisBulman commentedcorrected typo, added filename & code block for drush command
Comment #0.1
KrisBulman CreditAttribution: KrisBulman commentedadded credit to John Albin
Comment #1
Jeff Burnz CreditAttribution: Jeff Burnz commentedSubscribe, cool, I'll give this a go, be good if we can get it to generate the subtheme in the themes directory rather than inside the actual theme folder.
Comment #2
KrisBulman CreditAttribution: KrisBulman commentedThe line that reads:
could actually be:
and it will output the theme outside of the adaptive theme directory, BUT it also changes the successful print message to:
there's likely a better solution.
Comment #3
Stan Turyn CreditAttribution: Stan Turyn commentedFound strange behaviour:
if I use
drush adaptivetheme "Test1" test1-test2
it will create a directory named "test1test2" (without dash)
However if I use
drush adaptivetheme "Test2" test1_test2
it will create a directory named "test1-test2" (now with dash, even though I used underscore)
Comment #4
agileadamThanks so much @KrisBulman!
Regarding the directory... why not just array_pop($subtheme_path) twice? (though there's probably a cleaner way to do this with some array_xyz function).
Also, you may want to make sure a "name" value is present. drush_get_option('name') wasn't returning anything on my system.
Also, @Stan, you should use an _ instead of - in your machine name. In the file I've attached I updated the options description for this field.
I've attached the version I'm currently using.
Again,
Thanks -- this will save me lots of time!
Comment #5
Jeff Burnz CreditAttribution: Jeff Burnz commentedI would love if this was updated to work with the latest version, bumping for visibility and changing to task, I would really love this to be in the theme in 3.x
Comment #6
KrisBulman CreditAttribution: KrisBulman commentedComment #7
KrisBulman CreditAttribution: KrisBulman commentedDisregard last patch RTL code now gone for real :P
Comment #8
Jeff Burnz CreditAttribution: Jeff Burnz commentedI'm stuck on a machine that is giving me 7 kinds of weirdness with Drush and I can't get this to work, but I can't get hardly any Drush commands to work so hey...
I committed this to DEV so others could test this out, if we can get someone to feedback that its working I will call this FIXED and close the issue and release stable version of the theme.
I can test it properly next week some time, but would really like to get this into bed sooner, so I can release a stable version, there is only one bug holding that up right now and I fixed it today.
Comment #9
Stan Turyn CreditAttribution: Stan Turyn commentedIt's working but with a minor issue along the way. Here's how it went:
We get an error first but it clears after running cron/clearing caches (not sure which one - force of habit of running these 2 together).
Comment #10
Jeff Burnz CreditAttribution: Jeff Burnz commentedLooks good, shouldn't Drupal CC all after enabling (enabling anything)? I will check that, I always thought it did. Wonder if this is bug with Drush and theme enabling?
Comment #11
brunodboIn my tests, the drush command behaved differently depending on whether I executed the command from within the site's folder or outside (using a drush alias in both cases). When outside the site's folder (docroot), I had to clear the cache first; when inside the folder, the command worked right after downloading and enabling adaptivetheme.
From what I could tell, drush doesn't do a cache clear after enabling modules or themes.
I took a look at how Omega creates subthemes using drush. I noticed they call system_rebuild_theme_data() in their drush extension (see http://drupalcode.org/project/omega_tools.git/blob_plain/refs/heads/7.x-...), which could maybe solve the problem described in #9.
Comment #12
Jeff Burnz CreditAttribution: Jeff Burnz commentedCould system_rebuild_theme_data() be executed at the end of drush_adaptivetheme()?
Comment #13
KrisBulman CreditAttribution: KrisBulman commentedCan anyone confirm adding system_rebuild_theme_data(); after drush_adaptivetheme works? I am unable to replicate the problem locally, in, or out of the adaptivetheme folder using drush 5.4
Comment #14
paskainos CreditAttribution: paskainos commentedFYI: I experienced this issue with AT 7.x-3.1 and Drush 5.4.
Comment #15
paskainos CreditAttribution: paskainos commentedMore specifically, as mentioned by Stan Shevchuk in comment #9, running
Results in the following
Clearing the cache (
drush cc all
) and reissuing the adaptivetheme subtheme command successfully creates the subtheme.Comment #16
KrisBulman CreditAttribution: KrisBulman commented@paskainos as asked in #13 does modifying the drush script to the following produce the same results, or resolve the issue?
Comment #17
paskainos CreditAttribution: paskainos commentedNo Kris, adding
system_rebuild_theme_data();
doesn't fix it. However, here's a strange 'anomaly' and perhaps a clue: I created a test install, mod'ed theadaptivetheme.drush.inc
file, and tried to create an AT sub-theme using drush, which failed. Then I removedsystem_rebuild_theme_data();
from the beginning offunction drush_adaptivetheme
and uncommented it at the end of the function (where it's already included, along with reference to this thread) which also failed. Then I accidentally cleared the cache(drush cc all)
in the test site directory - doh! I then removed all traces of the installation (i.e. settings.php, etc.) and ran the install again, and this time without mod'ingadaptivetheme.drush.inc
runningdrush adaptivetheme test
worked! I then created another test site ('test2' in a separate directory) and repeated the process, and again, runningdrush adaptivetheme test
worked without mod'ingadaptivetheme.drush.inc
. Since the test sites are installed in a 'dev' directory of a working Drupal install (i.e. dev.[workingsite].com/test and dev.[workingsite].com/test2) I repeated the process (clean install, test the script) in another directory (i.e. not *.[workingsite].com/*), which failed as expected. Hopefully that all makes sense. So my question is; why would clearing the cache in the site(s) installed in a subdirectory of a working Drupal install alter script run in another subdirectory install? Again, hopefully that makes sense. I'm investigating, but with no answers yet...Comment #18
P2790 CreditAttribution: P2790 commentedAfter enabling my subtheme everything is fine, when I tell it to be the default theme I get wsod
I used the drush command:
drush adaptivetheme "Your Theme Name" yourthemename
Comment #19
KrisBulman CreditAttribution: KrisBulman commentedPotential WSOD's are slightly concerning, setting this to needs work
Comment #20
P2790 CreditAttribution: P2790 commentedI had a check and created a sub theme manually and everything worked fine, so not certain exactly what is going wrong with the drush command.
Comment #21
sin CreditAttribution: sin commentedCan confirm #15, but the message was:
drush: The directory "_path_goes_here_//../at_subtheme" was not found.
Drush command terminated abnormally due to an unrecoverable error.
drush cc all helped, thank you!
Comment #22
madhattertech CreditAttribution: madhattertech commentedI had the same issue and after running "drush core-cron && drush cc all" my theme was created
Comment #23
Jeff Burnz CreditAttribution: Jeff Burnz commentedPlease see this thread: #1997614: drush adaptivetheme THEMENAME creates subtheme with base theme missing in info file
I think we should close this, I have personally never had a WSOD with this and its a standard Drush procedure that when you add new commands you really have to drush cc all to get them to kick in. I found this many times.
If we have more issues lets open new ones, rather than continuing on, this was really just about adding the functionality, for which I am most grateful since I now use it all the time!
Comment #23.0
Jeff Burnz CreditAttribution: Jeff Burnz commentedremoved echo