2016-07-28 1 views
2

J'essaie d'ajouter un champ de type «fichier» aux paramètres de mon thème. Je n'utilise pas de thème de base et je travaille dans Drupal 7. Le champ apparaît au bon endroit et je peux sélectionner un fichier, mais, quand j'enregistre les paramètres, le fichier n'apparaît pas dans mon dossier de fichiers et fonctionne theme_get_settings sur le paramètre renvoie une chaîne vide. Que fais-je incorrectement?Ajout d'un champ de formulaire de type de fichier aux paramètres du thème système Drupal

Voici mon code de champ:

// footer settings 
$form['footer_settings'] = array(
    '#type' => 'fieldset', 
    '#title' => t('Footer Settings'), 
    '#collapsible' => TRUE, 
    '#collapsed' => FALSE, 
); 
$form['footer_settings']['footer_logo_path'] = array(
    '#type' => 'textfield', 
    '#title' => t('Footer Logo Path'), 
    '#default_value' => theme_get_setting('footer_logo', ''), 
); 
$form['footer_settings']['footer_logo'] = array(
    '#type' => 'file', 
    '#title' => t('Footer Logo'), 
    '#description' => t('Upload a new logo image to be displayed in the footer of the website here.'), 
    '#upload_location' => file_default_scheme() . '://', 
); 

Répondre

0

Lorsque vous utilisez un contrôle de formulaire de fichier, vous devez ajouter une validation et un soumettre méthode (ou modifier ceux existants) pour télécharger le fichier lui-même.

Vous pouvez jeter un oeil à la méthode du thème par défaut du système, sorcière vous permet de définir le favicon et les fichiers logo à utiliser avec votre thème: => Dans le fichier /modules/system/system.admin.inc

... 
    $form['logo']['settings']['logo_upload'] = array(
     '#type' => 'file', 
     '#title' => t('Upload logo image'), 
     '#maxlength' => 40, 
     '#description' => t("If you don't have direct file access to the server, use this field to upload your logo.") 
    ); 
... 
    $form['#submit'][] = 'system_theme_settings_submit'; 
    $form['#validate'][] = 'system_theme_settings_validate'; 
... 
/** 
* 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.')); 
    } 
    } 

    $validators = array('file_validate_extensions' => array('ico png gif jpg jpeg apng svg')); 
... 
    // If the user provided a path for a logo or favicon file, make sure a file 
    // exists at that path. 
    if (!empty($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 (!empty($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.')); 
    } 
    } 
} 
... 

/** 
* Process system_theme_settings form submissions. 
*/ 
function system_theme_settings_submit($form, &$form_state) { 
... 
    if (!empty($values['logo_upload'])) { 
    $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 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']); 
    } 
... 
} 

Modifier

Comme je l'ai dit dans le commentaire ci-dessous, vous devez enregistrer le fichier reçu dans le combo « footer_logo », et remplir la valeur « footer_logo_path » avec le chemin du fichier enregistré.

// If the user uploaded a new logo, save it to a permanent location 
    if (!empty($values['footer_logo'])) { 
    $file = $values['footer_logo']; 
    unset($values['footer_logo']); 
    $filename = file_unmanaged_copy($file->uri); 
    $values['footer_logo_path'] = $filename; 
    } 

Ensuite, il ne sera pas une difficulté si les méthodes sont en cours d'exécution deux fois.

+0

Merci pour la réponse, Tytoo! J'ai ajouté de nouvelles fonctions de validation et de soumission personnalisées et les ai exécutées, mais elles semblent fonctionner deux fois. Comment puis-je empêcher cela? – Colin

+0

Juste pour clarifier, ma fonction de soumission/validation personnalisée s'exécute en premier, suivie par la valeur par défaut. – Colin

+0

@Colin, je ne sais pas pourquoi vos méthodes de validation de formulaire et de soumission sont en cours d'exécution deux fois. Mais si vous faites comme dans l'exemple, votre fichier 'footer_logo' doit être transformé et le chemin du fichier téléchargé doit être placé dans la valeur 'footer_logo_path'. – TytooF