Forked from
UNL Information Services / UNL-CMS
771 commits behind the upstream repository.
-
Tim Steiner authored
git-svn-id: file:///tmp/wdn_thm_drupal/branches/drupal-7.x/staging@596 20a16fea-79d4-4915-8869-1ea9d5ebf173
Tim Steiner authoredgit-svn-id: file:///tmp/wdn_thm_drupal/branches/drupal-7.x/staging@596 20a16fea-79d4-4915-8869-1ea9d5ebf173
unl.module 22.20 KiB
<?php
function unl_node_prepare($node) {
$node->menu['expanded'] = 1;
}
/**
* Implementation of hook_wywiwyg_plugin() found in wysiwyg.api.php
*/
function unl_wysiwyg_plugin($editor) {
switch ($editor) {
case 'tinymce':
return array(
'unl' => array(
// A URL to the plugin's homepage.
'url' => 'http://gforge.unl.edu/gf/project/wdn_tinymce/',
// The full path to the native editor plugin.
'path' => $editor['library path'] . '/plugins/unl',
// A list of editor extensions provided by this native plugin.
// Extensions are not displayed as buttons and touch the editor's
// internals, so you should know what you are doing.
'extensions' => array(
'unl' => 'UNL Extension'
),
// Boolean whether this plugin is a native plugin, i.e. shipped with
// the editor. Definition must be ommitted for plugins provided by
// other modules.
'internal' => TRUE,
// Boolean whether the editor needs to load this plugin. When TRUE,
// the editor will automatically load the plugin based on the 'path'
// variable provided. If FALSE, the plugin either does not need to
// be loaded or is already loaded by something else on the page.
// Most plugins should define TRUE here.
'load' => TRUE,
// A list of buttons provided by this native plugin. The key has to
// match the corresponding JavaScript implementation. The value is
// is displayed on the editor configuration form only.
'buttons' => array(
'unlZenBox' => 'UNL Zen Box',
'unlZenTable' => 'UNL Zen Table',
'unlLayout' => 'UNL Layout',
'unlTooltip' => 'UNL Tooltip',
),
// A list of global, native editor configuration settings to
// override. To be used rarely and only when required.
'options' => array(
'skin' => 'unl',
'table_styles' => 'ZenTable Bright (yellow)=zentable bright;ZenTable Cool (blue)=zentable cool;ZenTable Energetic (orange)=zentable energetic;ZenTable Soothing (green)=zentable soothing;ZenTable Primary (red)=zentable primary;ZenTable Neutral (gray)=zentable neutral;', 'doctype' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
'valid_elements' => '*[*],script[src|type=text/javascript]',
),
)
// Wysiwyg wrapper plugin AJAX callback.
// 'callback' => url('myplugin/browse'),
// 'icon' => drupal_get_path('module', 'mymodule') . '/myplugin/myplugin.png',
// Might need to be set later on; after retrieving customized editor
// layout.
//'theme_advanced_buttons1' => array(t('Button title (optional)') => 'myplugin'),
);
}
}
function unl_permission() {
return array(
'unl migration' => array(
'title' => t('Migration'),
'description' => t('Migrate UNL Template based sites to drupal'),
),
'unl site creation' => array(
'title' => t('Site Creation'),
'description' => t('Create new drupal sites using the UNL profile'),
'restrict access' => TRUE,
),
'unl grant all permissions' => array(
'title' => t('Grant All Permissions'),
'description' => t('If this is not checked, a user can only grant permissions that they themselves have. Requires the "Administer permissions" permission.'),
'restrict access' => TRUE,
),
'unl administer administrator permissions' => array(
'title' => t('Administer Administrator\'s Permissions'),
'description' => t('If this is not checked, a user can not change the permissions of the administrator role. Requires the "Administer permissions" permission.'),
'restrict access' => TRUE,
),
'unl theme settings' => array(
'title' => t('Change Theme Settings'),
'description' => t('Allow this role to change the current theme settings.'),
)
);
}
/**
* Adds UNL Migration Tool to the Content menu for admin
*/
function unl_menu() {
$access = array();
$items['admin/content/unl/migration'] = array(
'title' => 'UNL Migration Tool',
'description' => 'Migrate a static UNL template page into drupal',
'access arguments' => array('unl migration'),
'page callback' => 'drupal_get_form',
'page arguments' => array('unl_migration'),
'type' => MENU_LOCAL_TASK,
'file' => 'unl_migration.php',
);
$items['admin/themes'] = array(
'title' => 'Appearance',
'description' => 'Configure your theme.',
'access callback' => 'unl_user_access',
'access arguments' => array(array('!administer themes', 'unl theme settings')),
'page callback' => 'drupal_get_form',
'position' => 'left',
'weight' => -6,
);
if (conf_path() == 'sites/default') {
$items['admin/sites/unl'] = array(
'title' => 'UNL Site Creation Tool',
'description' => 'Create and manage UNL Drupal sites and aliases.',
'access arguments' => array('unl site creation'),
'page callback' => 'unl_sites_page',
'type' => MENU_LOCAL_TASK,
'file' => 'unl_site_creation.php',
);
$items['admin/sites/unl/sites'] = array(
'title' => 'Sites',
'description' => 'Create and manage UNL Drupal sites.',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -8,
);
$items['admin/sites/unl/aliases'] = array(
'title' => 'Aliases',
'description' => 'Manage aliases of UNL Drupal sites.',
'access arguments' => array('unl site creation'),
'page callback' => 'unl_aliases_page',
'type' => MENU_LOCAL_TASK,
'file' => 'unl_site_creation.php',
);
$items['admin/sites/unl/wdn_registry'] = array(
'title' => 'WDN Registry',
'description' => 'Settings for the connection to the WDN Registry.',
'access arguments' => array('unl site creation'),
'page callback' => 'drupal_get_form',
'page arguments' => array('unl_wdn_registry'),
'type' => MENU_LOCAL_TASK,
'file' => 'unl_site_creation.php',
);
}
return $items;
}
function unl_menu_alter(&$items) {
foreach (array('module', 'file', 'page arguments') as $key) {
$items['admin/themes'][$key] = $items['admin/appearance/settings/' . variable_get('theme_default')][$key];
}
return $items;
}
function unl_form_alter(&$form, $form_state, $form_id) {
// Make new menu items expanded by default.
if ($form_id == 'menu_edit_item' && $form['mlid']['#value'] == 0) {
$form['expanded']['#default_value'] = TRUE;
}
if ($form_id == 'system_site_information_settings') {
$form['site_information']['https'] = array(
'#type' => 'checkbox',
'#title' => 'SSL Enabled',
'#default_value' => variable_get('https', FALSE),
);
if (conf_path() != 'sites/default') {
$alternate_uris = unl_get_alternate_base_uris();
$base_urls = array('_null' => '--Select One--');
foreach ($alternate_uris as $alternate_uri) {
$base_urls[$alternate_uri] = $alternate_uri;
};
$form['site_information']['unl_primary_base_url'] = array(
'#title' => 'Primary Base URL',
'#type' => 'select',
'#options' => $base_urls,
'#default_value' => variable_get('unl_primary_base_url'),
);
$form['#submit'][] = 'unl_system_settings_form_submit';
}
}
/**
* Modify the Permissions and Roles forms for non-administrators
*/
$admin_role_id = variable_get('user_admin_role', -1);
if (!in_array($admin_role_id, array_keys($GLOBALS['user']->roles))) {
switch ($form_id) {
// Add additional validation on admin/people/permissions/roles/edit/%
case 'user_admin_role' :
$form['#validate'][] = 'unl_user_admin_role_validate';
break;
// Hide administrator role on admin/people/permissions/roles
case 'user_admin_roles' :
foreach ($form['roles'] as $key => $role) {
if (isset($role['#role']->rid) && $role['#role']->rid == $admin_role_id) {
unset($form['roles'][$key]);
}
}
break;
// Hide administrator column on admin/people/permissions
case 'user_admin_permissions' :
if (!user_access('unl grant all permissions')) {
// Remove permissions this user doesn't have from the headings list.
foreach ($form['permission'] as $permission => $sub_form) {
if (is_int($permission)) {
continue;
}
if (!user_access($permission)) {
unset($form['permission'][$permission]);
}
}
// Remove any empty permission section headings.
$permission_sections = array_keys($form['permission']);
foreach ($permission_sections as $index => $permission_section) {
if (!is_int($permission_section)) {
continue;
}
if (!isset($permission_sections[$index + 1]) || is_int($permission_sections[$index + 1])) {
unset($form['permission'][$permission_section]);
}
}
// Remove the permissions this user doesn't have from the checkboxes list.
foreach ($form['checkboxes'] as $role_id => $sub_form) {
foreach ($sub_form['#options'] as $permission => $value) {
if (!user_access($permission)) {
unset($form['checkboxes'][$role_id]['#options'][$permission]);
}
}
}
}
// Unset the administrator checkbox column if user can't administer administrator permissions
if (!user_access('unl administer administrator permissions')) {
unset($form['role_names'][$admin_role_id]);
unset($form['role_names']['#value'][$admin_role_id]);
unset($form['checkboxes'][$admin_role_id]);
}
// Make these settings unavailable even if they are enabled for the user
$administrator_permissions = array(
'unl administer administrator permissions',
'unl site creation',
'administer modules',
'administer themes',
'administer software updates',
'administer imce',
'administer filters',
);
foreach ($form['permission'] as $permission => $sub_form) {
if (in_array($permission, $administrator_permissions)) {
unset($form['permission'][$permission]);
}
}
foreach ($form['checkboxes'] as $admin_role_id => $sub_form) {
foreach ($sub_form['#options'] as $permission => $value) {
if (in_array($permission, $administrator_permissions)) {
unset($form['checkboxes'][$admin_role_id]['#options'][$permission]);
}
}
}
break;
default :
break;
}
}
/**
* On the node edit form, hide the "Provide a menu link" checkbox since we'll
* be using the menu to build a site hierarchy. Instead, add a button that will
* determine whether or not the menu link is visible or not.
*/
if (substr($form_id, -10) == '_node_form') {
$form['menu']['#title'] = 'Site hierachy';
$form['menu']['enabled']['#default_value'] = TRUE;
$form['menu']['enabled']['#prefix'] = '<div style="display: none;">';
$form['menu']['enabled']['#suffix'] = '</div>';
$form['menu']['link']['link_title']['#required'] = TRUE;
$mlid = $form['menu']['link']['mlid']['#value'];
if ($mlid) {
$menu_link = menu_link_load($mlid);
$default_visible = ($menu_link['hidden'] ? 0 : 1);
}
else {
$default_visible = 0;
}
$form['menu']['visible'] = array(
'#type' => 'checkbox',
'#title' => 'Display in menu',
'#default_value' => $default_visible,
'#weight' => 0,
);
$form['actions']['submit']['#submit'][] = 'unl_node_form_submit';
// Also turn on revisioning by default
$form['revision_information']['revision']['#default_value'] = TRUE;
unset($form['revision_information']['revision']['#states']);
// Also hide the "Promoted to front page" option
$form['options']['promote']['#prefix'] = '<div style="display:none;">';
$form['options']['promote']['#suffix'] = '</div>';
// Also hide the "Sticky at top of lists" option
$form['options']['sticky']['#prefix'] = '<div style="display:none;">';
$form['options']['sticky']['#suffix'] = '</div>';
}
}
/**
* When a node is modified, update its menu link to be hidden or not based on the user input.
*/
function unl_node_form_submit($form, &$form_state) {
$menu_data = $form_state['values']['menu'];
if ($menu_data['mlid']) {
$menu_link = menu_link_load($menu_data['mlid']);
}
else {
list($parent_menu_name, $parent_mlid) = explode(':', $menu_data['parent']);
$menu_links = menu_load_links($parent_menu_name);
foreach ($menu_links as $menu_link) {
if ($menu_link['plid'] != $parent_mlid) {
continue;
}
if ($menu_link['link_path'] != 'node/' . $form_state['values']['nid']) {
continue;
}
break;
}
}
$menu_link['hidden'] = $menu_data['visible'] ? 0 : 1;
menu_link_save($menu_link);
}
function unl_system_settings_form_submit($form, &$form_state) {
variable_set('https', (bool) $form_state['values']['https']);
if ($form_state['values']['unl_primary_base_url'] != '_null') {
variable_set('unl_primary_base_url', $form_state['values']['unl_primary_base_url']);
}
else {
variable_del('unl_primary_base_url');
}
}
function unl_theme() {
return array(
'unl_table' => array(
'render element' => 'form',
),
);
}
function unl_url_outbound_alter(&$path, &$options, $original_path) {
$path_parts = parse_url($path);
if (isset($path_parts['scheme']) || $path == 'user/cas') {
return;
}
$user = $GLOBALS['user'];
$user_roles = array_keys($user->roles);
$generic_user = TRUE;
foreach ($user_roles as $user_role) {
if (in_array($user_role, array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID))) {
continue;
}
$generic_user = FALSE;
}
if (isset($options['https'])) {
return;
}
$options['https'] = (bool) (variable_get('https', 0) && !$generic_user);
}
function unl_user_access($permissions, $account = NULL) {
foreach ($permissions as $permission) {
if (substr($permission, 0, 1) == '!') {
$permission = substr($permission, 1);
$result = !user_access($permission, $account);
}
else {
$result = user_access($permission, $account);
}
if (!$result) {
return FALSE;
}
}
return TRUE;
}
/**
* Additional validation on the user_admin_role form (admin/people/permissions/roles/edit/%)
* to prevent a user from deleting the administrator role.
*/
function unl_user_admin_role_validate($form, &$form_state) {
$admin_role_id = variable_get('user_admin_role', -1);
if ($form_state['values']['op'] == t('Delete role')) {
$role = user_role_load_by_name($form_state['values']['name']);
if ($role && $role->rid == $admin_role_id) {
form_set_error('name', t('The role name %name can not be deleted. Seriously dude. Seriously.', array('%name' => $form_state['values']['name'])));
}
}
}
function unl_cron() {
if (PHP_SAPI == 'cli') {
return;
}
$queue = DrupalQueue::get('unl_migration');
if ($queue->numberOfItems() > 0) {
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'unl_migration.php';
$item = $queue->claimItem(120);
$queue->deleteItem($item);
if (unl_migration_queue_step($item->data)) {
unl_send_site_created_email();
}
}
if (conf_path() == 'sites/default') {
$wdn_registry_info = array(
'database' => variable_get('unl_wdn_registry_database'),
'username' => variable_get('unl_wdn_registry_username'),
'password' => variable_get('unl_wdn_registry_password'),
'host' => variable_get('unl_wdn_registry_host'),
'driver' => 'mysql',
);
if (!$wdn_registry_info['database']) {
return;
}
Database::addConnectionInfo('wdn_registry', 'default', $wdn_registry_info);
db_set_active('wdn_registry');
try {
$data = db_select('site_request', 'r')
->fields('r')
->where('`url` IS NULL')
->execute()
->fetchAll();
}
catch (Exception $e) {
db_set_active();
return;
}
$sites_to_create = array();
foreach ($data as $site) {
$department = $site->department;
$department = strtr($department, array(' ' => ''));
$department = strtolower($department);
$department = preg_replace('/[^[a-z0-9]/', '', $department);
$site_name = $site->site_name;
$site_name = strtr($site_name, array(' ' => ''));
$site_name = strtolower($site_name);
$site_name = preg_replace('/[^[a-z0-9]/', '', $site_name);
$path = $department . '/' . $site_name;
$db_prefix = unl_create_db_prefix($site);
$sites_to_create[] = array(
'site_path' => $path,
'uri' => url($path),
'clean_url' => TRUE,
'db_prefix' => $db_prefix,
'site_admin' => $site->site_admin ? $site->site_admin : '',
'migration_url' => $site->migration_url ? $site->migration_url : '',
'migration_path' => $site->migration_path ? $site->migration_path : '',
);
if (variable_get('unl_wdn_registry_production')) {
db_update('site_request')
->fields(array('url' => url($path)))
->condition('id', $site->id)
->execute();
}
}
db_set_active();
foreach ($sites_to_create as $site_to_create) {
try {
db_insert('unl_sites')->fields($site_to_create)->execute();
}
catch (PDOException $e) {
// Ignore duplicate records.
if ($e->getCode() != 23000) {
throw $e;
}
}
}
}
}
// Creates a db_prefix short enough to not go over MySQL's max table name length
function unl_create_db_prefix($site) {
$parent_prefix = '_' . $GLOBALS['databases']['default']['default']['prefix'];
$site_name = strtolower($site->site_name);
$site_name = preg_replace('/[^[a-z0-9]/', '', $site_name);
$site_name = explode(' ', $site_name);
foreach ($site_name as $site_word) {
$site_words[$site_word] = strlen($site_word);
}
do {
$db_prefix = '';
$found = FALSE;
foreach ($site_words as $site_word => $length) {
$db_prefix .= substr($site_word, 0, $length);
if (max($site_words) == $length && !$found) {
$found = TRUE;
$site_words[$site_word] = $length-1;
}
}
} while (strlen($db_prefix . $parent_prefix) > 32);
return $db_prefix;
}
function unl_get_shared_db_prefix() {
require 'sites/default/settings.php';
$shared_prefix = $databases['default']['default']['prefix'];
return $shared_prefix;
}
function unl_get_alternate_base_uris() {
$shared_prefix = unl_get_shared_db_prefix();
if (is_array($GLOBALS['databases']['default']['default']['prefix'])) {
$db_prefix = $GLOBALS['databases']['default']['default']['prefix']['default'];
$db_prefix = substr($db_prefix, 0, 0 - strlen($shared_prefix) - 1);
}
else {
return array();
}
$rows = db_query(
"SELECT s.uri, a.base_uri, a.path "
. "FROM {$shared_prefix}unl_sites AS s "
. "LEFT JOIN {$shared_prefix}unl_sites_aliases AS a "
. " ON s.site_id = a.site_id "
. "WHERE db_prefix=:db_prefix",
array(':db_prefix' => $db_prefix)
)->fetchAll();
if (count($rows) < 1) {
return array();
}
$uris = array($rows[0]->uri);
foreach ($rows as $row) {
if ($row->base_uri . $row->path) {
$uris[] = $row->base_uri . $row->path;
}
}
return $uris;
}
function unl_init() {
$primary_base_url = variable_get('unl_primary_base_url');
if ($primary_base_url && substr($primary_base_url, -1) != '/') {
$primary_base_url .= '/';
}
if (conf_path() != 'sites/default'
&& $primary_base_url
&& $primary_base_url != url()
) {
drupal_goto($primary_base_url . current_path());
}
}
function unl_mail($key, &$message, $params) {
if ($key == 'site_created') {
$site = $params['site'];
$message['subject'] = 'New Site!';
$message['body'][] = 'A site has been set up!';
$message['body'][] = print_r($site, TRUE);
}
}
function unl_send_site_created_email($site = NULL) {
$shared_prefix = unl_get_shared_db_prefix();
// If no site was specified, get the current site.
if (!$site) {
if (!is_array($GLOBALS['databases']['default']['default']['prefix'])) {
return;
}
$db_prefix = $GLOBALS['databases']['default']['default']['prefix']['default'];
$db_prefix = substr($db_prefix, 0, 0 - strlen($shared_prefix) - 1);
$data = db_query(
"SELECT * "
. "FROM {$shared_prefix}unl_sites "
. "WHERE db_prefix = :prefix ",
array(':prefix' => $db_prefix)
)->fetchAll();
if (count($data) == 0) {
return;
}
$site = $data[0];
}
$unl_site_created_email_address = unl_shared_variable_get('unl_site_created_email_address');
$unl_site_created_alert_admins = unl_shared_variable_get('unl_site_created_alert_admins');
$recipients = array();
if ($unl_site_created_email_address) {
$recipients[] = $unl_site_created_email_address;
}
if ($unl_site_created_alert_admins) {
$role = user_role_load_by_name('Site Admin');
$select = db_select('users_roles', 'r');
$select->fields('r', array('uid'));
$select->condition('r.rid', $role->rid);
$uids = $select->execute()->fetchCol();
$users = user_load_multiple($uids);
foreach ($users as $user) {
if (!$user->mail) {
continue;
}
$recipients[] = $user->mail;
}
}
foreach ($recipients as $recipient) {
drupal_mail('unl', 'site_created', $recipient, language_default(), array('site' => $site), unl_shared_variable_get('site_mail'));
}
}
function unl_shared_variable_get($name, $default = NULL) {
$shared_prefix = unl_get_shared_db_prefix();
$data = db_query(
"SELECT * "
. "FROM {$shared_prefix}variable "
. "WHERE name = :name",
array(':name' => $name)
)->fetchAll();
if (count($data) == 0) {
return $default;
}
return unserialize($data[0]->value);
}