Example #1
0
/**
 * 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())));
 }