View source
<?php
function system_patterns($data) {
$files = array(
'modules/system/system.admin.inc',
);
$actions['module'] = array(
'descr' => t('Enable/Disable Modules'),
PATTERNS_CREATE => array(
'modules_enable',
),
PATTERNS_DELETE => array(
'modules_disable',
),
PATTERNS_EXPORT => array(
PATTERNS_EXPORT_ALL => 'system_patterns_export_all_modules',
),
PATTERNS_FILES => $files,
);
$actions['theme'] = array(
'descr' => t('Enable (and set default)/Disable Themes'),
PATTERNS_MODIFY => array(
'set_theme_properties',
),
PATTERNS_EXPORT => array(
PATTERNS_EXPORT_ALL => 'system_patterns_export_all_themes',
),
PATTERNS_FILES => $files,
);
$forms = array();
if ($data) {
if ($data['tag'] == 'form' && isset($data['form_id'])) {
$forms[] = $data['form_id'];
}
}
$actions['form'] = array(
'descr' => t('Submit Custom Forms'),
PATTERNS_CREATE => $forms,
PATTERNS_FILES => $files,
);
$actions['call_php_func'] = array(
'descr' => t('Call PHP Functions'),
PATTERNS_CREATE => array(
'call_php_func_form',
),
);
$actions['variables'] = array(
'descr' => t('Set/Modify/Delete System Variables'),
PATTERNS_MODIFY => array(
'variables_execute',
),
PATTERNS_EXPORT => array(
PATTERNS_EXPORT_ALL => 'system_patterns_export_all_variables',
),
);
return $actions;
}
function system_patterns_export_all_modules($args = NULL, &$result = NULL) {
$actions = array(
PATTERNS_CREATE => array(
'tag' => 'module',
),
);
foreach (module_list() as $module => $value) {
$action = array(
'value' => $module,
);
array_push($actions[PATTERNS_CREATE], $action);
}
$result = array(
$actions,
);
return $result;
}
function system_patterns_export_all_themes($args = NULL, &$result = NULL) {
$themes = list_themes();
$default_theme = variable_get('theme_default');
$admin_theme = variable_get('admin_theme');
$result = array();
foreach ($themes as $theme) {
$data = array(
'tag' => 'theme',
);
$data['value'] = $theme->name;
$data['status'] = $theme->status;
$data['default'] = $theme->name == $default_theme;
$data['admin'] = $theme->name == $admin_theme;
$action = array(
PATTERNS_MODIFY => $data,
);
array_push($result, $action);
}
return $result;
}
function system_patterns_export_all_variables($args = NULL, &$result = NULL) {
$query = db_select('variable', 'v')
->extend('TableSort');
$query
->fields('v', array(
'name',
'value',
));
$qresult = $query
->execute();
$actions = array(
PATTERNS_MODIFY => array(
'tag' => 'variables',
),
);
foreach ($qresult as $row) {
$name = $row->name;
$value = variable_get($name);
_htmlspecialchars_decode($value);
$action = array(
'name' => $name,
'value' => $value,
);
array_push($actions[PATTERNS_MODIFY], $action);
}
$result = array(
$actions,
);
return $result;
}
function system_patterns_prepare($action, $tag, &$data) {
if ($tag == 'module') {
if (is_string($data) || isset($data['value']) && !isset($data[0])) {
$data = array(
$data,
);
}
if (!empty($data['module']) && is_string($data['module'])) {
$data[0]['value'] = $data['module'];
unset($data['module']);
}
foreach ($data as &$item) {
if (is_string($item)) {
$item = array(
'value' => $item,
);
}
}
if (isset($data['disable']) && !isset($data['delete'])) {
$data['delete'] = $data['disable'];
}
unset($data['disable']);
}
elseif ($tag == 'form') {
}
else {
switch ($tag) {
case 'variable':
$tag = 'variables';
$data = array(
$data,
);
case 'variables':
if (!$data[0]) {
if ($data['variable'] && isset($data['variable'][0])) {
$data = $data['variable'];
unset($data['variable']);
}
elseif ($data['variable'] && isset($data['variable']['value'])) {
$data[0] = $data['variable'];
unset($data['variable']);
}
else {
$temp = $data;
$data[0] = $temp;
unset($data['id'], $data['value'], $data['delete']);
}
}
for ($i = 0, $total = count($data); $i < $total; $i++) {
$item =& $data[$i];
if (!isset($item['value']) && (!isset($item['delete']) || !$item['delete'])) {
$value = $item;
unset($value['name']);
$item = array(
'name' => $item['name'],
'value' => $value,
);
}
}
break;
}
}
return patterns_results();
}
function system_patterns_validate($action, $tag, &$data) {
$result = array();
$status = PATTERNS_SUCCESS;
$msg = '';
switch ($tag) {
case 'module':
switch ($action) {
case PATTERNS_CREATE:
case PATTERNS_DELETE:
$mandatory_attributes = array(
'value',
);
foreach ($data as $module) {
if (!_patterns_has_all_mandatory_attributes($module, $mandatory_attributes, $msg)) {
return patterns_results(PATTERNS_ERR, $msg);
}
}
foreach ($data as $module) {
if (_patterns_has_uninterpretable_attributes($module, $mandatory_attributes, $msg)) {
$status = PATTERNS_WARN;
}
}
break;
default:
$msg = t('Action %action is uncompatible for tag %tag.', array(
'%action' => $action,
'%tag' => $tag,
));
return patterns_results(PATTERNS_ERR, $msg);
}
break;
case 'theme':
if ($action == PATTERNS_MODIFY) {
$mandatory_attributes = array(
'value',
);
if (!_patterns_has_all_mandatory_attributes($data, $mandatory_attributes, $msg)) {
return patterns_results(PATTERNS_ERR, $msg);
}
$interpretable_attributes = array(
'value',
'status',
'default',
'admin',
);
if (_patterns_has_uninterpretable_attributes($data, $interpretable_attributes, $msg)) {
$status = PATTERNS_WARN;
}
}
else {
$msg = t('Action %action is uncompatible for tag %tag.', array(
'%action' => $action,
'%tag' => $tag,
));
return patterns_results(PATTERNS_ERR, $msg);
}
break;
case 'form':
if (!isset($data['form_id'])) {
$msg = t('"form_id" is missing.');
return patterns_results(PATTERNS_ERR, $msg);
}
list($menu, $masks) = menu_router_build();
foreach ($menu as $item) {
if (isset($item['page arguments'][0]) && $item['page arguments'][0] == $data['form_id'] && !empty($item['include file'])) {
$data['include'] = $item['include file'];
break;
}
}
if (!empty($data['include']) && is_file($data['include'])) {
require_once $data['include'];
}
elseif (is_array($data['include'])) {
$data['include'] = drupal_get_path('module', $data['include']['module']) . '/' . $data['include']['file'];
}
if (!function_exists($data['form_id'])) {
if (!empty($data['module']) && is_string($data['module'])) {
$modules = module_list();
if (in_array($data['module'], $modules)) {
module_load_include('inc', $data['module']);
module_load_include('inc', $data['module'], $data['module'] . '.admin');
module_load_include('inc', $data['module'], $data['module'] . '.page');
}
}
}
if (!function_exists($data['form_id'])) {
$msg = t("Couldn't load the form %form. Check if all required modules are enabled and try to define 'include' or 'module' for this action.", array(
'%form' => $data['form_id'],
));
return patterns_results(PATTERNS_ERR, $msg);
}
break;
case 'call_php_func':
if (empty($data['function'])) {
$msg = t("A function is required for this tag");
return patterns_results(PATTERNS_ERR, $msg);
}
elseif (!empty($data['type']) && empty($data['module'])) {
$msg = t("If you specify a type you must specify a module. See the documentation for module_load_include.");
return patterns_results(PATTERNS_ERR, $msg);
}
elseif (empty($data['type']) && !empty($data['module'])) {
$msg = t("If you specify a module you must specify a type. See the documentation for module_load_include.");
return patterns_results(PATTERNS_ERR, $msg);
}
elseif (!empty($data['filepath']) && !file_exists($data['filepath'])) {
$msg = t('The file that you specified does not exist: %file', array(
'%file' => $data['filepath'],
));
return patterns_results(PATTERNS_ERR, $msg);
}
break;
case 'variables':
if ($action == PATTERNS_MODIFY) {
$mandatory_attributes = array(
'name',
'value',
);
foreach ($data as $variable) {
if (!_patterns_has_all_mandatory_attributes($variable, $mandatory_attributes, $msg)) {
return patterns_results(PATTERNS_ERR, $msg);
}
}
foreach ($data as $variable) {
if (_patterns_has_uninterpretable_attributes($variable, $mandatory_attributes, $msg)) {
$status = PATTERNS_WARN;
}
}
}
else {
$msg = t('Action %action is uncompatible for tag %tag.', array(
'%action' => $action,
'%tag' => $tag,
));
return patterns_results(PATTERNS_ERR, $msg);
}
break;
}
switch ($tag) {
case 'module':
$enabled_modules = module_list();
switch ($action) {
case PATTERNS_CREATE:
foreach ($data as $module) {
if (in_array($module['value'], $enabled_modules)) {
$result[] = array(
PATTERNS_WARNING_ALREADY_DEFINED_ELEMENT => t('The module %mod is already enabled.', array(
'%mod' => $module['value'],
)),
);
}
}
break;
case PATTERNS_DELETE:
foreach ($data as $module) {
if (!in_array($module['value'], $enabled_modules)) {
$result[] = array(
PATTERNS_WARNING_ALREADY_DEFINED_ELEMENT => t('The module %mod is already disabled.', array(
'%mod' => $module['value'],
)),
);
}
}
break;
}
break;
case 'theme':
if (!array_key_exists($data['value'], list_themes())) {
$result[] = array(
PATTERNS_WARNING_ELEMENT_UNDEFINED => t('The theme %theme is not currently installed in the system.', array(
'%theme' => $data['value'],
)),
);
}
break;
case 'variables':
foreach ($data as $variable) {
if (!variable_get($variable['name'])) {
$result[] = array(
PATTERNS_WARNING_ELEMENT_UNDEFINED => t('The variable %var does not exist in the system.', array(
'%var' => $variable['name'],
)),
);
}
}
break;
}
return patterns_results($status, $msg, $result);
}
function system_patterns_build($action, $form_id, &$data = NULL, &$a) {
$status = PATTERNS_SUCCESS;
$msg = '';
$result = NULL;
if ($form_id == 'call_php_func_form') {
$data['type'] = empty($data['type']) ? '' : $data['type'];
$data['module'] = empty($data['module']) ? '' : $data['module'];
$data['name'] = empty($data['name']) ? '' : $data['name'];
$data['filepath'] = empty($data['filepath']) ? '' : $data['filepath'];
if (empty($data['arguments'])) {
$data['arguments'] = array();
}
elseif (!is_array($data['arguments'])) {
$data['arguments'] = array(
$data['arguments'],
);
}
_call_php_func_include_files($data);
if (!is_callable($data['function'])) {
$status = PATTERNS_ERR;
$msg = t('The given function %func is not callable', array(
'%func' => $data['function'],
));
}
}
else {
$form_state = $data['form_state_extras'];
unset($data['form_state_extras']);
unset($data['include']);
$form_state['values'] = $data;
$form_state['submitted'] = FALSE;
if (!isset($form_state['storage'])) {
$form_state['storage'] = NULL;
}
$result = $form_state;
}
return patterns_results($status, $msg, $result);
}
function system_patterns_params($action, $form_id, &$data = NULL, &$a) {
$result = NULL;
if ($form_id == 'call_php_func_form') {
$result = array(
$data['function'],
$data['type'],
$data['module'],
$data['name'],
$data['filepath'],
$data['arguments'],
);
}
else {
if (isset($data['args'])) {
$params = $data['args'];
unset($data['args']);
$result = params;
}
}
return patterns_results(PATTERNS_SUCCESS, t('Execution successful'), $result);
}
function system_patterns_cleanup($action, $tag, &$data) {
if ($tag == 'module') {
menu_rebuild();
}
return patterns_results();
}
function modules_enable($form_id, &$form_state) {
$modules_enabled = array();
foreach ($form_state['values'] as $module) {
module_enable(array(
$module['value'],
), TRUE);
$modules_enabled[] = $module['value'];
}
$msg = count($modules_enabled) > 0 ? t('Module(s) %modules enabled.', array(
'%modules' => implode(', ', $modules_enabled),
)) : t('No modules have been enabled.');
return patterns_results(PATTERN_SUCCESS, $msg);
}
function modules_disable($form_id, &$form_state) {
$modules_disabled = array();
foreach ($form_state['values'] as $module) {
module_disable(array(
$module['value'],
), TRUE);
$modules_disabled[] = $module['value'];
}
$msg = count($modules_disabled) > 0 ? t('Module(s) %modules disabled.', array(
'%modules' => implode(', ', $modules_disabled),
)) : t('No modules have been disabled.');
return patterns_results(PATTERN_SUCCESS, $msg);
}
function variables_execute($form_id, &$form_state) {
$names = array();
foreach ($form_state['values'] as $variable) {
$var = variable_get($variable['name'], NULL);
if (is_array($var)) {
$var = array_merge($var, $variable['value']);
variable_set($variable['name'], $var);
}
else {
variable_set($variable['name'], $variable['value']);
}
$names[] = $variable['name'];
}
$msg = t('Variable(s) %vars updated.', array(
'%vars' => implode(', ', $names),
));
return patterns_results(PATTERNS_SUCCESS, $msg);
}
function set_theme_properties($form_id, &$form_state) {
$theme = $form_state['values']['value'];
if (isset($form_state['values']['status']) && $form_state['values']['status'] == TRUE) {
theme_enable(array(
$theme,
));
}
else {
if (isset($form_state['values']['status']) && $form_state['values']['status'] == FALSE) {
theme_disable(array(
$theme,
));
}
}
if (isset($form_state['values']['default']) && $form_state['values']['default']) {
variable_set('theme_default', $theme);
}
if (isset($form_state['values']['admin']) && $form_state['values']['admin']) {
variable_set('admin_theme', $theme);
}
$msg = t('Properties(s) of theme %theme updated.', array(
'%theme' => $theme,
));
return patterns_results(PATTERNS_SUCCESS, $msg);
}
function call_php_func_form($form, $form_state, $func, $type, $module, $name, $filepath, $args) {
return array(
'#call_php_func' => array(
'function' => $func,
'type' => $type,
'module' => $module,
'name' => $name,
'filepath' => $filepath,
'arguments' => $args,
),
);
}
function call_php_func_form_submit($form, &$form_state) {
$values = $form['#call_php_func'];
_call_php_func_include_files($values);
call_user_func_array($values['function'], $values['arguments']);
}
function _call_php_func_include_files($values) {
if ($values['type'] && $values['module']) {
module_load_include($values['type'], $values['module'], $values['name']);
}
elseif ($values['filepath']) {
require_once $values['filepath'];
}
}
function _htmlspecialchars_decode(&$value) {
if (!is_array($value)) {
$value = htmlspecialchars_decode($value);
}
else {
foreach ($value as &$v) {
_htmlspecialchars_decode($v);
}
}
}