J'écris un module personnalisé et j'en ai besoin pour télécharger une image. J'ai du mal à trouver une bonne documentation à ce sujet, mais je pense que je suis proche.
Qu'est-ce que je rate? $ file retourne false dans la soumission du formulaire.
function mymodule_custom_content_block_form($form_state){
$form = array();
$form['custom_content_block_text'] = array(
'#type' => 'textarea',
'#title' => t('Block text'),
'#default_value' => variable_get('mymodule_custom_content_block_text'),
'#required' => true,
);
$form['custom_content_block_image'] = array(
'#type' => 'file',
'#name' => 'custom_content_block_image',
'#title' => t('Block image'),
'#size' => 40,
'#description' => t("Image should be less than 400 pixels wide and in JPG format."),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Update'),
);
return $form;
}
function mymodule_custom_content_block_form_submit($form, &$form_state){
if(isset($form_state['values']['custom_content_block_image'])){
$validators = array('file_validate_extensions' => array('jpg jpeg'));
$file = file_save_upload('custom_content_block_image', $validators, 'public://');
if($file == false){
drupal_set_message(t("Error saving image."), $type = "error", $repeat = false);
}
else{
$file->status = FILE_STATUS_PERMANENT;
$file = file_save($file);
}
}
variable_set('mymodule_custom_content_block_text', $form_state['values']['custom_content_block_text']);
drupal_set_message(t('Custom Content Block has been updated.'));
}
Si cela ne vous dérange pas que je dis que vous faites cela à la dure. Drupal a un managed_file
type d'élément qui gère la plupart de cette logique pour vous:
function mymodule_custom_content_block_form($form, &$form_state) {
$form['custom_content_block_image'] = array(
'#type' => 'managed_file',
'#name' => 'custom_content_block_image',
'#title' => t('Block image'),
'#size' => 40,
'#description' => t("Image should be less than 400 pixels wide and in JPG format."),
'#upload_location' => 'public://'
);
return $form;
}
function mymodule_custom_content_block_form_submit($form, &$form_state) {
if (isset($form_state['values']['custom_content_block_image'])) {
$file = file_load($form_state['values']['custom_content_block_image']);
$file->status = FILE_STATUS_PERMANENT;
file_save($file);
}
}
Avec la réponse Clive, mon image a été supprimée après 6 heures. Donc, si quelqu'un a rencontré le même problème que moi. Voici la solution (de la réponse de Clive avec un petit ajout).
function mymodule_custom_content_block_form($form, &$form_state) {
$form['custom_content_block_image'] = array(
'#type' => 'managed_file',
'#name' => 'custom_content_block_image',
'#title' => t('Block image'),
'#size' => 40,
'#description' => t("Image should be less than 400 pixels wide and in JPG format."),
'#upload_location' => 'public://'
);
return $form;
}
function mymodule_custom_content_block_form_submit($form, &$form_state) {
if (isset($form_state['values']['custom_content_block_image'])) {
$file = file_load($form_state['values']['custom_content_block_image']);
$file->status = FILE_STATUS_PERMANENT;
$file_saved =file_save($file);
// Record that the module is using the file.
file_usage_add($file_saved, 'mymodule_custom_content_block_form', 'custom_content_block_image', $file_saved->fid);
}
}
La solution consiste à ajouter file_usage_add
. De la documentation de l'API:
Remarque: Les nouveaux fichiers sont téléchargés avec un état de 0 et sont traités comme des fichiers temporaires qui sont supprimés après 6 heures via cron. Votre module est responsable de la modification du statut des objets $ file en FILE_STATUS_PERMANENT et de l'enregistrement du nouveau statut dans la base de données. Quelque chose comme ce qui suit dans votre gestionnaire de soumission devrait faire l'affaire.
Voir: https://api.drupal.org/api/drupal/developer%21topics%21forms_api_reference.html/7.x#managed_file
Cet attribut doit être ajouté à votre formulaire pour qu'il fonctionne avec les téléchargements de fichiers.
$form['#attributes']['enctype'] = "multipart/form-data";