/** * implements hook_form_FORM_ID_alter() * * Plugins configuration form. * * Reorganize theme settings in vertical tabs. * Puts plugins tab in first. * * @param $form * @param $form_state */ function okcdesign_form_system_theme_settings_alter(&$form, $form_state) { // we'll need plugin API to build administration plugins form. require_once 'theme_plugins_manager.php'; $form['#submit'][] = 'okcdesign_plugins_form_submit'; // create vertical tabs to organize theme settings form. // put our plugin tab first as it may be more frequently used than general drupal settings. $form['okcdesign'] = array('#type' => 'vertical_tabs', '#weight' => -10); // put back Drupal settings in a "General settings" vertical tab $form['okcdesign']['general'] = array('#type' => 'fieldset', '#title' => t(' Drupal core Settings')); foreach (array('theme_settings', 'logo', 'favicon') as $field) { if (isset($form[$field])) { $form['okcdesign']['general'][$field] = $form[$field]; unset($form[$field]); } } // get all declared plugins in theme_plugins_registry.php file. $plugins = theme_get_plugins(); // Build individual "checkbox" FAPI element, as they are more flexible thant "checkboxes" FAPI element type. foreach ($plugins as $plugin_id => $plugin_datas) { // add a different symbol if plugin is enabled or disabled. $state = theme_plugin_is_enabled($plugin_id) ? '✓' : "✘"; // create a vertical by plugin $form['okcdesign'][$plugin_id] = array('#type' => 'fieldset', '#title' => $state . ' ' . $plugin_datas['title']); // add a checkbox to enable the plugin $form['okcdesign'][$plugin_id]["theme_plugin_{$plugin_id}"] = _okcdesign_build_plugin_checkbox($plugin_id, $plugins); // add configuration form for this plugin, if available. $plugin = new $plugin_id(); if (!theme_plugin_is_enabled($plugin_id)) { $form['okcdesign'][$plugin_id]["theme_plugin_{$plugin_id}"]['#description'] .= "<br/>Enable to see configuration form for this plugin, if any"; } else { if (method_exists($plugin, 'settings_form') && $plugin->settings_form($form)) { $form['okcdesign'][$plugin_id]["settings_{$plugin_id}"] = array('#type' => 'fieldset'); $form['okcdesign'][$plugin_id]["settings_{$plugin_id}"]["theme_plugin_settings_{$plugin_id}"] = $plugin->settings_form($form); // retain configuration in theme settings as an array for this specifig plugin. $form['okcdesign'][$plugin_id]["settings_{$plugin_id}"]["theme_plugin_settings_{$plugin_id}"]['#tree'] = TRUE; } } } }
/** * Return list of plugins than depends on a specific plugin. * So that in administration, user in informed that disable * a plugin may break other plugins. * * @param $plugin_id * machine name of the plugin, as defined in theme info file. * @return array() * array of plugin dependencies or empty array if no dependencies are found. */ function theme_get_required_by_plugins($plugin_id) { $plugins = theme_get_plugins(); $required_by_plugins = array(); foreach ($plugins as $id => $plugin) { if (isset($plugin['dependencies'])) { foreach ($plugin['dependencies'] as $dependency) { if ($dependency == $plugin_id) { $required_by_plugins[$id] = $plugins[$id]; } } } } return $required_by_plugins; }
function test_theme_plugin_get_enabled_plugins() { // Always do our test on okcdesign rather than default active theme. // this if for theme_get_setting function $GLOBALS['theme_key'] = 'okcdesign'; $plugins = theme_get_plugins(); // disable all plugins $theme_settings = variable_get("theme_okcdesign_settings"); foreach ($plugins as $plugin_id => $datas) { $theme_settings["theme_plugin_{$plugin_id}"] = 0; } variable_set("theme_okcdesign_settings", $theme_settings); drupal_static_reset('theme_get_setting'); // each plugin should be disabled now... foreach ($plugins as $plugin_id => $datas) { $this->assertFalse(theme_plugin_is_enabled($plugin_id)); } $this->assertEmpty(theme_plugin_get_enabled_plugins()); // re-enable only required plugins : $theme_settings = variable_get("theme_okcdesign_settings"); $required_plugins = $this->requiredPlugins(); foreach ($required_plugins as $plugin_id) { $theme_settings["theme_plugin_{$plugin_id}"] = 1; } variable_set("theme_okcdesign_settings", $theme_settings); drupal_static_reset('theme_get_setting'); // each required plugin should be enabled now. foreach ($required_plugins as $plugin_id) { $this->assertTrue(theme_plugin_is_enabled($plugin_id)); } // theme_get_enabled_plugins must return exactly the same plugins : $this->assertSame(ksort($required_plugins), ksort(array_keys(theme_plugin_get_enabled_plugins()))); }