'vertical_tabs',
'#weight' => 99,
);
// Provide the form item to choose which jQuery version to use.
$default_version = variable_get('jquery_update_jquery_version', JQUERY_UPDATE_DEFAULT_JQUERY_VERSION);
$custom_jquery = variable_get('jquery_update_custom_version_jquery', FALSE);
if (!empty($custom_jquery)) {
$default_version = $custom_jquery;
}
$version_options = jquery_update_get_version_options(FALSE);
$form['jquery_update_jquery_version'] = array(
'#type' => 'select',
'#title' => t('Default jQuery version'),
'#options' => $version_options,
'#default_value' => $default_version,
'#description' => t('Select which version of jQuery to use on the site.'),
);
// Theme-specific override version.
$themes = list_themes();
$theme_default = variable_get('theme_default', FALSE);
$admin_theme = variable_get('admin_theme', FALSE);
$header = array(t('Theme'), t('jQuery version'), t('Operations'));
$rows = array();
// Go through all themes.
foreach ($themes as $theme_key => $theme) {
// Skip disabled themes, but only if they are not configured as admin
// theme. This is an inconsistency in drupal core, that you can select a
// disabled theme as admin theme.
if (!$theme->status && $theme_key !== $admin_theme) {
continue;
}
// Retrieve the version jQuery for this theme.
$theme_version = theme_get_setting('jquery_update_jquery_version', $theme_key);
// Replace or modify the version name to be displayed.
if (empty($theme_version)) {
$theme_version = t('Site Default');
}
elseif (in_array($theme_version, array_keys($version_options))) {
$theme_version = $version_options[$theme_version];
}
else {
$theme_version .= ' (' . t('unknown version') . ')';
}
// Provide additional information for default and admin themes.
$theme_name = $theme->info['name'];
if ($theme_key === $theme_default && ($theme_key === $admin_theme || empty($admin_theme))) {
$theme_name .= ' (' . t('default/admin theme') . ')';
}
elseif ($theme_key === $theme_default) {
$theme_name .= ' (' . t('default theme') . ')';
}
elseif ($theme_key === $admin_theme) {
$theme_name .= ' (' . t('admin theme') . ')';
}
// Construct the table row.
$rows[] = array(
$theme_name,
$theme_version,
l(t('Configure'), 'admin/appearance/settings/' . $theme_key, array(
'attributes' => array(
'class' => array(
'module-link',
'module-link-configure',
),
),
'query' => drupal_get_destination(),
'fragment' => 'edit-jquery-update',
)),
);
}
$form['themes'] = array(
'#type' => 'fieldset',
'#title' => t('Theme Overrides'),
'#description' => t('You can override the default jQuery version above on each themes settings page. This is useful for administrative based themes.'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#tree' => FALSE,
'#weight' => -2,
'#group' => 'jquery_update',
);
$form['themes']['overrides'] = array(
'#theme' => 'table',
'#header' => $header,
'#rows' => $rows,
);
$form['performance'] = array(
'#type' => 'fieldset',
'#title' => t('Performance'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#tree' => FALSE,
'#weight' => -1,
'#group' => 'jquery_update',
'#description' => t('Modify how jQuery is loaded to increase download and render performance.'),
);
$form['performance']['jquery_update_compression_type'] = array(
'#type' => 'radios',
'#title' => t('jQuery compression level'),
'#options' => array(
'min' => t('Production (minified)'),
'none' => t('Development (uncompressed)'),
),
// Do not show this field if jQuery version is default.
'#states' => array(
'invisible' => array(
':input[name=jquery_update_jquery_version]' => array('value' => "default"),
),
),
'#default_value' => variable_get('jquery_update_compression_type', 'min'),
);
$form['performance']['jquery_update_jquery_cdn'] = array(
'#type' => 'select',
'#title' => t('jQuery and jQuery UI CDN'),
'#options' => array(
'none' => t('None'),
'google' => t('Google'),
'microsoft' => t('Microsoft'),
'jquery' => t('jQuery'),
),
// Do not show this field if jQuery version is default.
'#states' => array(
'invisible' => array(
':input[name=jquery_update_jquery_version]' => array('value' => "default"),
),
),
'#default_value' => variable_get('jquery_update_jquery_cdn', 'none'),
'#description' => t('Use jQuery and jQuery UI from a CDN. If the CDN is not available the local version of jQuery and jQuery UI will be used.'),
);
$form['jquery_migrate'] = array(
'#type' => 'fieldset',
'#title' => t('jQuery Migrate'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#tree' => FALSE,
'#group' => 'jquery_update',
'#description' => t('jQuery Migrate can be used to detect and restore APIs or features that have been deprecated in jQuery and removed as of version 1.9 or higher.', array(
'!url' => 'http://github.com/jquery/jquery-migrate/#readme',
)),
);
if (!empty($custom_jquery) && version_compare($custom_jquery, 3, '>=')) {
$form['jquery_migrate']['#description'] .= '
' . t('Note that the jQuery Update module only provides jQuery Migrate for jQuery versions before 3.x. A newer version of jQuery Migrate for the current version of jQuery can be configured via a Custom path.') . '';
}
$form['jquery_migrate']['jquery_update_jquery_migrate_enable'] = array(
'#type' => 'checkbox',
'#title' => t('Enable jQuery Migrate Plugin'),
'#default_value' => variable_get('jquery_update_jquery_migrate_enable', FALSE),
'#description' => t("Even if jQuery Migrate is enabled, it will not be loaded if the current page's jQuery version is lower than 1.9."),
);
$jquery_migrate_states = array(
'visible' => array(
':input[name="jquery_migrate[jquery_update_jquery_migrate_enable]"]' => array('checked' => TRUE),
),
);
$form['jquery_migrate']['jquery_update_jquery_migrate_cdn'] = array(
'#type' => 'select',
'#title' => t('jQuery Migrate CDN'),
'#options' => array(
'none' => t('None'),
'jquery' => t('jQuery'),
),
'#default_value' => variable_get('jquery_update_jquery_migrate_cdn', 'none'),
'#description' => t('Load the jQuery Migrate plugin using a CDN. If the CDN is not available the local module version of the plugin will be used instead.'),
'#states' => $jquery_migrate_states,
);
$jquery_migrate_api_url = 'https://github.com/jquery/jquery-migrate/#migrate-plugin-api';
$form['jquery_migrate']['jquery_update_jquery_migrate_warnings'] = array(
'#type' => 'checkbox',
'#title' => t('Console warnings'),
'#default_value' => variable_get('jquery_update_jquery_migrate_warnings', FALSE),
'#description' => t('Toggle the generation of console warnings when using the debug version of jQuery Migrate.', array(
'!url' => $jquery_migrate_api_url,
)),
'#states' => $jquery_migrate_states,
);
$form['jquery_migrate']['jquery_update_jquery_migrate_trace'] = array(
'#type' => 'checkbox',
'#title' => t('Console trace'),
'#default_value' => variable_get('jquery_update_jquery_migrate_trace', FALSE),
'#description' => t('Toggle the generation of console trace messages when using the debug version of jQuery Migrate.', array(
'!url' => $jquery_migrate_api_url,
)),
'#states' => $jquery_migrate_states,
);
$form['jquery_custom'] = array(
'#type' => 'fieldset',
'#title' => t('Custom paths'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#tree' => FALSE,
'#group' => 'jquery_update',
'#description' => t('Custom paths for jQuery libraries (e.g. CDN URLs or paths to local files).'),
);
$latest_version = jquery_update_latest_version('jquery');
$example_version = $latest_version ? $latest_version : JQUERY_UPDATE_EXAMPLE_JQUERY_VERSION;
$form['jquery_custom']['jquery_update_custom_path_jquery'] = array(
'#type' => 'textfield',
'#title' => t('Custom jQuery path'),
'#default_value' => variable_get('jquery_update_custom_path_jquery', ''),
'#description' => t('Example: %url or %path', array(
'%url' => 'https://code.jquery.com/jquery-' . $example_version . '.js',
'%path' => '/sites/default/files/jquery_update/jquery.js',
)),
);
$form['jquery_custom']['jquery_update_custom_version_jquery'] = array(
'#type' => 'textfield',
'#title' => t('Custom jQuery version'),
'#default_value' => variable_get('jquery_update_custom_version_jquery', ''),
'#description' => t('Example: %version', array('%version' => $example_version)),
);
$latest_version = jquery_update_latest_version('jqueryui');
$example_version = $latest_version ? $latest_version : JQUERY_UPDATE_EXAMPLE_JQUERYUI_VERSION;
$form['jquery_custom']['jquery_update_custom_path_jqueryui'] = array(
'#type' => 'textfield',
'#title' => t('Custom jQuery UI path'),
'#default_value' => variable_get('jquery_update_custom_path_jqueryui', ''),
'#description' => t('Example: %url or %path', array(
'%url' => 'https://cdnjs.cloudflare.com/ajax/libs/jqueryui/' . $example_version . '/jquery-ui.min.js',
'%path' => '/sites/default/files/jquery_update/jquery-ui.min.js',
)),
);
$form['jquery_custom']['jquery_update_custom_version_jqueryui'] = array(
'#type' => 'textfield',
'#title' => t('Custom jQuery UI version'),
'#default_value' => variable_get('jquery_update_custom_version_jqueryui', ''),
'#description' => t('Example: %version', array('%version' => $example_version)),
);
$latest_version = jquery_update_latest_version('jquery-migrate');
$example_version = $latest_version ? $latest_version : JQUERY_UPDATE_EXAMPLE_JQUERY_MIGRATE_VERSION;
$form['jquery_custom']['jquery_update_custom_path_migrate'] = array(
'#type' => 'textfield',
'#title' => t('Custom jQuery Migrate path'),
'#default_value' => variable_get('jquery_update_custom_path_migrate', ''),
'#description' => t('Example: %url or %path', array(
'%url' => 'https://cdn.jsdelivr.net/npm/jquery-migrate@' . $example_version . '/dist/jquery-migrate.min.js',
'%path' => '/sites/default/files/jquery_update/jquery-migrate.js',
)),
);
$form['jquery_custom']['jquery_update_custom_version_jquery_migrate'] = array(
'#type' => 'textfield',
'#title' => t('Custom jQuery Migrate version'),
'#default_value' => variable_get('jquery_update_custom_version_jquery_migrate', ''),
'#description' => t('Example: %version', array('%version' => $example_version)),
);
$latest_version = jquery_update_latest_version('jquery-cookie');
$example_version = $latest_version ? $latest_version : JQUERY_UPDATE_EXAMPLE_JQUERY_COOKIE_VERSION;
$form['jquery_custom']['jquery_update_custom_path_cookie'] = array(
'#type' => 'textfield',
'#title' => t('Custom jQuery Cookie path'),
'#default_value' => variable_get('jquery_update_custom_path_cookie', ''),
'#description' => t('Example: %url or %path', array(
'%url' => 'https://cdn.jsdelivr.net/gh/carhartl/jquery-cookie@' . $example_version . '/jquery.cookie.js',
'%path' => '/sites/default/files/jquery_update/jquery.cookie.js',
)),
);
$form['jquery_custom']['jquery_update_custom_version_jquery_cookie'] = array(
'#type' => 'textfield',
'#title' => t('Custom jQuery Cookie version'),
'#default_value' => variable_get('jquery_update_custom_version_jquery_cookie', ''),
'#description' => t('Example: %version', array('%version' => $example_version)),
);
$latest_version = jquery_update_latest_version('jquery.form');
$example_version = $latest_version ? $latest_version : JQUERY_UPDATE_EXAMPLE_JQUERY_FORM_VERSION;
$form['jquery_custom']['jquery_update_custom_path_form'] = array(
'#type' => 'textfield',
'#title' => t('Custom jQuery Form path'),
'#default_value' => variable_get('jquery_update_custom_path_form', ''),
'#description' => t('Example: %url or %path', array(
'%url' => 'https://cdn.jsdelivr.net/gh/jquery-form/form@' . $example_version . '/dist/jquery.form.min.js',
'%path' => '/sites/default/files/jquery_update/jquery.form.js',
)),
);
$form['jquery_custom']['jquery_update_custom_version_jquery_form'] = array(
'#type' => 'textfield',
'#title' => t('Custom jQuery Form version'),
'#default_value' => variable_get('jquery_update_custom_version_jquery_form', ''),
'#description' => t('Example: %version', array('%version' => $example_version)),
);
jquery_update_add_latest_version_info($form);
return system_settings_form($form);
}
/**
* Validate handler for settings form.
*/
function jquery_update_settings_form_validate($form, &$form_state) {
// Handle empty custom paths / versions.
if (!empty($form_state['values']['jquery_update_custom_path_jquery'])) {
if (empty($form_state['values']['jquery_update_custom_version_jquery'])) {
form_set_error('jquery_update_custom_version_jquery', 'Please provide a version for the custom jQuery path');
}
}
if (!empty($form_state['values']['jquery_update_custom_path_jqueryui'])) {
if (empty($form_state['values']['jquery_update_custom_version_jqueryui'])) {
form_set_error('jquery_update_custom_version_jqueryui', 'Please provide a version for the custom jQuery UI path');
}
}
if (!empty($form_state['values']['jquery_update_custom_path_cookie'])) {
if (empty($form_state['values']['jquery_update_custom_version_jquery_cookie'])) {
form_set_error('jquery_update_custom_version_jquery_cookie', 'Please provide a version for the custom jQuery Cookie path');
}
}
if (!empty($form_state['values']['jquery_update_custom_path_form'])) {
if (empty($form_state['values']['jquery_update_custom_version_jquery_form'])) {
form_set_error('jquery_update_custom_version_jquery_form', 'Please provide a version for the custom jQuery Form path');
}
}
if (!empty($form_state['values']['jquery_update_custom_path_migrate'])) {
if (empty($form_state['values']['jquery_update_custom_version_jquery_migrate'])) {
form_set_error('jquery_update_custom_version_jquery_migrate', 'Please provide a version for the custom jQuery Migrate path');
}
}
}
/**
* Implements hook_form_FORM_ID_alter().
*/
function jquery_update_form_jquery_update_settings_form_alter(&$form, &$form_state, $form_id) {
array_unshift($form['#submit'], 'jquery_update_settings_form_submit_early');
$form['#submit'][] = 'jquery_update_settings_form_submit_late';
}
/**
* Early submit handler for settings form.
*/
function jquery_update_settings_form_submit_early($form, &$form_state) {
// Handle empty custom paths / versions.
$variables = array(
'jquery_update_custom_path_cookie',
'jquery_update_custom_path_form',
'jquery_update_custom_path_jquery',
'jquery_update_custom_path_jqueryui',
'jquery_update_custom_path_migrate',
'jquery_update_custom_version_jquery',
'jquery_update_custom_version_jquery_cookie',
'jquery_update_custom_version_jquery_form',
'jquery_update_custom_version_jquery_migrate',
'jquery_update_custom_version_jqueryui',
);
foreach ($variables as $variable) {
if (empty($form_state['values'][$variable])) {
unset($form_state['values'][$variable]);
variable_del($variable);
}
}
}
/**
* Late submit handler for settings form.
*/
function jquery_update_settings_form_submit_late($form, &$form_state) {
// Special handling for the first time a custom jQuery version is configured.
if (isset($form_state['values']['jquery_update_custom_version_jquery'])) {
$custom_version = $form_state['values']['jquery_update_custom_version_jquery'];
// If the custom version is not yet available as an option in the form, set
// it as the default anyway. This avoids new custom versions requiring two
// submissions of the admin form.
if (!in_array($custom_version, array_keys($form['jquery_update_jquery_version']['#options']))) {
variable_set('jquery_update_jquery_version', $custom_version);
}
}
}
/**
* The Latest versions fieldset.
*/
function jquery_update_add_latest_version_info(&$form) {
$form['jquery_latest_versions'] = array(
'#type' => 'fieldset',
'#title' => t('Latest versions'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#tree' => FALSE,
'#group' => 'jquery_update',
'#description' => t('Information about the latest available versions of the jQuery libraries the jQuery Update module integrates.'),
);
$last_update = variable_get('jquery_update_latest_versions_checked', FALSE);
if ($last_update) {
$message = t('Version info last updated %datetime', array('%datetime' => format_date($last_update)));
$form['jquery_latest_versions']['#description'] .= '
' . $message;
}
$refresh_url = url('admin/config/development/jquery_update/refresh-version-info',
array(
'query' => array(
'token' => drupal_get_token('refresh-version-info'),
),
)
);
$form['jquery_latest_versions']['refresh_version_info'] = array(
'#type' => 'item',
'#markup' => '' . t('Refresh version info manually') . '',
);
$updates_available = _jquery_update_check_available_updates();
$libraries = array(
'jquery',
'jqueryui',
'jquery-migrate',
'jquery.form',
'jquery-cookie',
);
foreach ($libraries as $library) {
$version = jquery_update_latest_version($library);
$form['jquery_latest_versions']['latest_version_' . $library] = array(
'#type' => 'item',
'#title' => t('Library: %library', array('%library' => $library)),
'#markup' => t('Latest version: %version', array('%version' => $version)),
);
if (in_array($library, $updates_available)) {
$custom_version = variable_get('jquery_update_custom_version_' . _jquery_update_clean_library_name($library), 'error');
$message = t('An update (%update) is available for the current custom version (%current) of the %library library.',
array(
'%update' => $version,
'%current' => $custom_version,
'%library' => $library,
)
);
$form['jquery_latest_versions']['latest_version_' . $library]['#description'] = '' . $message . '';
if (variable_get('jquery_update_warning_available_update', TRUE)) {
drupal_set_message($message, 'warning', FALSE);
}
}
}
$form['jquery_latest_versions']['jquery_update_check_latest_versions'] = array(
'#type' => 'checkbox',
'#title' => t('Check latest version info?'),
'#default_value' => variable_get('jquery_update_check_latest_versions', TRUE),
'#description' => t('If enabled, jQuery Update checks %cdnjs for latest version info no more than once a day via cron.', array(
'%cdnjs' => 'api.cdnjs.com',
)),
);
$form['jquery_latest_versions']['jquery_update_warning_available_update'] = array(
'#type' => 'checkbox',
'#title' => t('Warn about available updates?'),
'#default_value' => variable_get('jquery_update_warning_available_update', TRUE),
'#description' => t("If enabled, jQuery Update will warn about available updates via messages in its admin UI and the main Status report."),
);
}
/**
* Menu callback to refresh jQuery libraries latest version info.
*
* @see system_run_cron()
*/
function jquery_update_refresh_version_info() {
if (!isset($_GET['token']) || !drupal_valid_token($_GET['token'], 'refresh-version-info')) {
return MENU_ACCESS_DENIED;
}
_jquery_update_refresh_version_info(TRUE);
drupal_set_message(t('Attempted to refresh latest version info.'));
drupal_goto('admin/config/development/jquery_update', array('fragment' => 'edit-jquery-latest-versions'));
}