#605892 by ksenzee and justinrandell: Convert theme logo upload to filestream wrappers (with tests so we don't break it again).
parent
4f32e4165b
commit
20ffb94644
|
@ -457,11 +457,6 @@ function system_theme_default() {
|
||||||
* @see system_theme_settings_submit()
|
* @see system_theme_settings_submit()
|
||||||
*/
|
*/
|
||||||
function system_theme_settings($form, &$form_state, $key = '') {
|
function system_theme_settings($form, &$form_state, $key = '') {
|
||||||
$directory_path = file_directory_path();
|
|
||||||
if (!file_prepare_directory($directory_path, FILE_CREATE_DIRECTORY)) {
|
|
||||||
drupal_set_message(t('The directory %directory does not exist or is not writable.', array('%directory' => $directory_path)), 'warning');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Default settings are defined in theme_get_setting() in includes/theme.inc
|
// Default settings are defined in theme_get_setting() in includes/theme.inc
|
||||||
if ($key) {
|
if ($key) {
|
||||||
$var = 'theme_' . $key . '_settings';
|
$var = 'theme_' . $key . '_settings';
|
||||||
|
@ -474,36 +469,6 @@ function system_theme_settings($form, &$form_state, $key = '') {
|
||||||
|
|
||||||
$form['var'] = array('#type' => 'hidden', '#value' => $var);
|
$form['var'] = array('#type' => 'hidden', '#value' => $var);
|
||||||
|
|
||||||
// Check for a new uploaded logo, and use that instead.
|
|
||||||
if ($file = file_save_upload('logo_upload', array('file_validate_is_image' => array()))) {
|
|
||||||
$parts = pathinfo($file->filename);
|
|
||||||
$filename = ($key) ? $key . '_logo.' . $parts['extension'] : 'logo.' . $parts['extension'];
|
|
||||||
|
|
||||||
// The image was saved using file_save_upload() and was added to the
|
|
||||||
// files table as a temporary file. We'll make a copy and let the garbage
|
|
||||||
// collector delete the original upload.
|
|
||||||
if ($filepath = file_unmanaged_copy($file->uri, $filename, FILE_EXISTS_REPLACE)) {
|
|
||||||
$_POST['default_logo'] = 0;
|
|
||||||
$_POST['logo_path'] = $filepath;
|
|
||||||
$_POST['toggle_logo'] = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for a new uploaded favicon, and use that instead.
|
|
||||||
if ($file = file_save_upload('favicon_upload')) {
|
|
||||||
$parts = pathinfo($file->filename);
|
|
||||||
$filename = ($key) ? $key . '_favicon.' . $parts['extension'] : 'favicon.' . $parts['extension'];
|
|
||||||
|
|
||||||
// The image was saved using file_save_upload() and was added to the
|
|
||||||
// files table as a temporary file. We'll make a copy and let the garbage
|
|
||||||
// collector delete the original upload.
|
|
||||||
if ($filepath = file_unmanaged_copy($file->uri, $filename, FILE_EXISTS_REPLACE)) {
|
|
||||||
$_POST['default_favicon'] = 0;
|
|
||||||
$_POST['favicon_path'] = $filepath;
|
|
||||||
$_POST['toggle_favicon'] = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Toggle settings
|
// Toggle settings
|
||||||
$toggles = array(
|
$toggles = array(
|
||||||
'logo' => t('Logo'),
|
'logo' => t('Logo'),
|
||||||
|
@ -569,10 +534,16 @@ function system_theme_settings($form, &$form_state, $key = '') {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
$logo_path = theme_get_setting('logo_path', $key);
|
||||||
|
// If $logo_path is a public:// URI, display the path relative to the files
|
||||||
|
// directory; stream wrappers are not end-user friendly.
|
||||||
|
if (file_uri_scheme($logo_path) == 'public') {
|
||||||
|
$logo_path = file_uri_target($logo_path);
|
||||||
|
}
|
||||||
$form['logo']['settings']['logo_path'] = array(
|
$form['logo']['settings']['logo_path'] = array(
|
||||||
'#type' => 'textfield',
|
'#type' => 'textfield',
|
||||||
'#title' => t('Path to custom logo'),
|
'#title' => t('Path to custom logo'),
|
||||||
'#default_value' => theme_get_setting('logo_path', $key),
|
'#default_value' => $logo_path,
|
||||||
'#description' => t('The path to the file you would like to use as your logo file instead of the default logo.'),
|
'#description' => t('The path to the file you would like to use as your logo file instead of the default logo.'),
|
||||||
);
|
);
|
||||||
$form['logo']['settings']['logo_upload'] = array(
|
$form['logo']['settings']['logo_upload'] = array(
|
||||||
|
@ -604,10 +575,16 @@ function system_theme_settings($form, &$form_state, $key = '') {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
$favicon_path = theme_get_setting('favicon_path', $key);
|
||||||
|
// If $favicon_path is a public:// URI, display the path relative to the
|
||||||
|
// files directory; stream wrappers are not end-user friendly.
|
||||||
|
if (file_uri_scheme($favicon_path) == 'public') {
|
||||||
|
$favicon_path = file_uri_target($favicon_path);
|
||||||
|
}
|
||||||
$form['favicon']['settings']['favicon_path'] = array(
|
$form['favicon']['settings']['favicon_path'] = array(
|
||||||
'#type' => 'textfield',
|
'#type' => 'textfield',
|
||||||
'#title' => t('Path to custom icon'),
|
'#title' => t('Path to custom icon'),
|
||||||
'#default_value' => theme_get_setting('favicon_path', $key),
|
'#default_value' => $favicon_path,
|
||||||
'#description' => t('The path to the image file you would like to use as your custom shortcut icon.')
|
'#description' => t('The path to the image file you would like to use as your custom shortcut icon.')
|
||||||
);
|
);
|
||||||
$form['favicon']['settings']['favicon_upload'] = array(
|
$form['favicon']['settings']['favicon_upload'] = array(
|
||||||
|
@ -672,14 +649,119 @@ function system_theme_settings($form, &$form_state, $key = '') {
|
||||||
// We don't want to call system_settings_form_submit(), so change #submit.
|
// We don't want to call system_settings_form_submit(), so change #submit.
|
||||||
array_pop($form['#submit']);
|
array_pop($form['#submit']);
|
||||||
$form['#submit'][] = 'system_theme_settings_submit';
|
$form['#submit'][] = 'system_theme_settings_submit';
|
||||||
|
$form['#validate'][] = 'system_theme_settings_validate';
|
||||||
return $form;
|
return $form;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validator for the system_theme_settings() form.
|
||||||
|
*/
|
||||||
|
function system_theme_settings_validate($form, &$form_state) {
|
||||||
|
// Handle file uploads.
|
||||||
|
$validators = array('file_validate_is_image' => array());
|
||||||
|
|
||||||
|
// Check for a new uploaded logo.
|
||||||
|
$file = file_save_upload('logo_upload', $validators);
|
||||||
|
if (isset($file)) {
|
||||||
|
// File upload was attempted.
|
||||||
|
if ($file) {
|
||||||
|
// Put the temporary file in form_values so we can save it on submit.
|
||||||
|
$form_state['values']['logo_upload'] = $file;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// File upload failed.
|
||||||
|
form_set_error('logo_upload', t('The logo could not be uploaded.'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for a new uploaded favicon.
|
||||||
|
$file = file_save_upload('favicon_upload');
|
||||||
|
if (isset($file)) {
|
||||||
|
// File upload was attempted.
|
||||||
|
if ($file) {
|
||||||
|
// Put the temporary file in form_values so we can save it on submit.
|
||||||
|
$form_state['values']['favicon_upload'] = $file;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// File upload failed.
|
||||||
|
form_set_error('logo_upload', t('The favicon could not be uploaded.'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the user provided a path for a logo or favicon file, make sure a file
|
||||||
|
// exists at that path.
|
||||||
|
if ($form_state['values']['logo_path']) {
|
||||||
|
$path = _system_theme_settings_validate_path($form_state['values']['logo_path']);
|
||||||
|
if (!$path) {
|
||||||
|
form_set_error('logo_path', t('The custom logo path is invalid.'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($form_state['values']['favicon_path']) {
|
||||||
|
$path = _system_theme_settings_validate_path($form_state['values']['favicon_path']);
|
||||||
|
if (!$path) {
|
||||||
|
form_set_error('favicon_path', t('The custom favicon path is invalid.'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function for the system_theme_settings form.
|
||||||
|
*
|
||||||
|
* Attempts to validate normal system paths, paths relative to the public files
|
||||||
|
* directory, or stream wrapper URIs. If the given path is any of the above,
|
||||||
|
* returns a valid path or URI that the theme system can display.
|
||||||
|
*
|
||||||
|
* @param $path
|
||||||
|
* A path relative to the Drupal root or to the public files directory, or
|
||||||
|
* a stream wrapper URI.
|
||||||
|
* @return mixed
|
||||||
|
* A valid path that can be displayed through the theme system, or FALSE if
|
||||||
|
* the path could not be validated.
|
||||||
|
*/
|
||||||
|
function _system_theme_settings_validate_path($path) {
|
||||||
|
if (drupal_realpath($path)) {
|
||||||
|
// The path is relative to the Drupal root, or is a valid URI.
|
||||||
|
return $path;
|
||||||
|
}
|
||||||
|
$uri = 'public://' . $path;
|
||||||
|
if (file_exists($uri)) {
|
||||||
|
return $uri;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process system_theme_settings form submissions.
|
* Process system_theme_settings form submissions.
|
||||||
*/
|
*/
|
||||||
function system_theme_settings_submit($form, &$form_state) {
|
function system_theme_settings_submit($form, &$form_state) {
|
||||||
$values = $form_state['values'];
|
$values = $form_state['values'];
|
||||||
|
|
||||||
|
// If the user uploaded a new logo or favicon, save it to a permanent location
|
||||||
|
// and use it in place of the default theme-provided file.
|
||||||
|
if ($file = $values['logo_upload']) {
|
||||||
|
unset($values['logo_upload']);
|
||||||
|
$filename = file_unmanaged_copy($file->uri);
|
||||||
|
$values['default_logo'] = 0;
|
||||||
|
$values['logo_path'] = $filename;
|
||||||
|
$values['toggle_logo'] = 1;
|
||||||
|
}
|
||||||
|
if ($file = $values['favicon_upload']) {
|
||||||
|
unset($values['favicon_upload']);
|
||||||
|
$filename = file_unmanaged_copy($file->uri);
|
||||||
|
$values['default_favicon'] = 0;
|
||||||
|
$values['favicon_path'] = $filename;
|
||||||
|
$values['toggle_favicon'] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the user entered a path relative to the system files directory for
|
||||||
|
// a logo or favicon, store a public:// URI so the theme system can handle it.
|
||||||
|
if (!empty($values['logo_path'])) {
|
||||||
|
$values['logo_path'] = _system_theme_settings_validate_path($values['logo_path']);
|
||||||
|
}
|
||||||
|
if (!empty($values['favicon_path'])) {
|
||||||
|
$values['favicon_path'] = _system_theme_settings_validate_path($values['favicon_path']);
|
||||||
|
}
|
||||||
|
|
||||||
if (empty($values['default_favicon']) && !empty($values['favicon_path'])) {
|
if (empty($values['default_favicon']) && !empty($values['favicon_path'])) {
|
||||||
$values['favicon_mimetype'] = file_get_mimetype($values['favicon_path']);
|
$values['favicon_mimetype'] = file_get_mimetype($values['favicon_path']);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1224,6 +1224,33 @@ class SystemThemeFunctionalTest extends DrupalWebTestCase {
|
||||||
$this->node = $this->drupalCreateNode();
|
$this->node = $this->drupalCreateNode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the theme settings form.
|
||||||
|
*/
|
||||||
|
function testThemeSettings() {
|
||||||
|
// Specify a filesystem path to be used for the logo.
|
||||||
|
$file = current($this->drupalGetTestFiles('image'));
|
||||||
|
$edit = array(
|
||||||
|
'default_logo' => FALSE,
|
||||||
|
'logo_path' => $file->uri,
|
||||||
|
);
|
||||||
|
$this->drupalPost('admin/appearance/settings', $edit, t('Save configuration'));
|
||||||
|
$this->drupalGet('node');
|
||||||
|
$this->assertRaw($file->uri, t('Logo path successfully changed.'));
|
||||||
|
|
||||||
|
// Upload a file to use for the logo.
|
||||||
|
$file = current($this->drupalGetTestFiles('image'));
|
||||||
|
$edit = array(
|
||||||
|
'default_logo' => FALSE,
|
||||||
|
'logo_path' => '',
|
||||||
|
'files[logo_upload]' => drupal_realpath($file->uri),
|
||||||
|
);
|
||||||
|
$options = array();
|
||||||
|
$this->drupalPost('admin/appearance/settings', $edit, t('Save configuration'), $options);
|
||||||
|
$this->drupalGet('node');
|
||||||
|
$this->assertRaw($file->name, t('Logo file successfully uploaded.'));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test the administration theme functionality.
|
* Test the administration theme functionality.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue