FileUpload dans configurartion d'un block

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

Je suis en train de mettre en place un block avec quelques champs de config.

Je n'ai aucun problème pour ajouter des champs text ou textarea en revanche je n'arrive pas à ajouter un file upload dans la config du block.

J'ai actuellement un

$form['#attributes'] = array('enctype' => 'multipart/form-data');

et mon champs

$form['block_file'] = array(
'#type' => 'file',
'#title' => ...
...
)

Je vois bien le champs apparaitre (mais il s'agit juste d'un bouton "Parcourir", serait il possible également d'obtenir l'upload "classique" avec le bouton "parcourir" mais également le bouton "transfert de fichier" pour un envoi ajaxisé.

Bien cordialement et merci d'avance de m'avoir lu.

Sylvain

Forum : 
Version de Drupal : 

Bonjour,

non pas de solution pour ma part, je me suis dirigé vers une autre solution fonctionnelle.

Il faudrait peut être poster la question sur drupal.org, ils ont l'air de répondre davantage par la bas.

Cdlt

Sylvain

Merci de cette nouvelle,

pourriez vous nous donner un exemple avec l'initialisation du champs d'upload ainsi que votre fonction d'upload_save ?

cdlt

Voici le code que j'aurais aimé trouvé car j'ai bien galéré pour le faire! Heureusement j'ai pu trouver de l'aide en anglais

<?php
function pulls_attributs_uc_form_alter(&$form, &$form_state, $form_id) {
  if (
strpos($form_id, 'add_to_cart_form') || strpos($form_id, 'add_product_form')) {
   
  
  
$form['broderie']['fichier_broderie']=array(
      
'#type'   =>'file',
    
'#description'    => t("Télécharger l'image à broder"),
       
'#weight'=> '51',
      
'#size'=> '40'
     
  
);
 
  
$form['#submit'][]='_pulls_attributs_traitement_fichier';
 
  }
}

function _pulls_attributs_traitement_fichier($form, & $form_state){
  
       
//tableau contenant la liste des fonctions à appeler pour valider le transfert du fichier
 
$validators=array();
  
$validators['file_validate_extensions']=array('jpeg jpg gif png');
 
$validators['file_validate_size']=array(0=>$file, 1=>'58720256', 2=>'0' ); //58720256 bits = 7Mo
   
  
if($file = file_save_upload('fichier_broderie', $validators, $dest=false, $replace = FILE_EXISTS_RENAME)){
      
       
//change le statut du fichie pour qu'il soit enregistré de manière permanente
       
file_set_status($file, FILE_STATUS_PERMANENT);
    
drupal_set_message('Fichier broderie transféré');
    } else {
  
drupal_set_message('Erreur transfert fichier');  
   }
}
?>

« mais je pense que la communauté drupalfr n'est pas très impliquée...»

C'est vrai, vous êtes inscrit depuis plus de 40 semaines (presqu'un an) et vous n'êtes jamais intervenu pour aider qui que ce soit.

Une histoire de paille et de poutre, comme d'habitude.

Et voici ma solution, bien inspirée de celle-là

<?php
/****
 * @file
 * Mon module spécial.
 * Creation et configuration d'un block avec upload d'image
 ****/

/****
 * Implements hook_block_info().
 ****/
function MONMODULE_block_info() {
 
 
$blocks['topphoto'] = array(
   
'info' => t('La photo qui va bien'),
   
'status' => TRUE,
   
'region' => 'highlighted',//optionnel. une région existante de votre thème
   
'weight' => 0,//optionnel
   
'visibility' => 0,//0 => toutes les pages sauf 'pages'; 1 => seulement les 'pages'
   
'pages' => '<front>',//pages visibles ou pas selon choix ci-dessus
 
);

  return
$blocks;
}

/****
* Implements hook_block_configure().
****/
function MONMODULE_block_configure($delta) {
 
$form = array();
  switch(
$delta) {

    case
'topphoto':

     
$form['MONMODULE_photo_fid'] = array(
       
'#type' => 'managed_file',
       
'#title' => t('The photo'),
       
'#description' => t('The displayed photography on top of all pages except frontpage'),
       
'#default_value' => variable_get('MONMODULE_photo_fid', NULL),
       
'#upload_location' => 'public://MONDOSSIER_photo/',//un dossier dans files/
     
);

    break;
  }
 
  return
$form;
}

/****
* Implements hook_block_save().
****/
function MONMODULE_block_save($delta = '', $edit = array()) {
  switch(
$delta) {
    case
'topphoto':
     
// Chargez le fichier via file.fid.
     
$file = file_load($edit['MONMODULE_photo_fid']);
     
// Changez le status en permanent.
     
$file->status = FILE_STATUS_PERMANENT;
     
// Sauvegardez.
     
file_save($file);
     
//Récupérez l'objet block
     
$block = block_load('MONMODULE', $delta);
     
// Vous devez enregistrer le fait que votre module utilise ce fichier.
      // En l'occurence le block de votre module l'utilise.
     
file_usage_add($file, 'MONMODULE', 'block', $block->bid);
     
//créez votre variable
     
variable_set('MONMODULE_photo_fid', $file->fid);
   break;
  }

  return;
}

/****
* Implements hook_block_view().
****/
function MONMODULE_block_view($delta = '') {
  switch (
$delta) {
  
    case
'topphoto' :
     
$block['subject'] = '';
     
$block['content'] = MONMODULE_block_photo_view();
    break;

  }
  return
$block;
}

/****
 * custom view function for image
 ****/
function MONMODULE_block_photo_view() {
 
$block = array();
 
 
// Récupérez le chemin de votre image enregistrée
 
$image_file = file_load(variable_get('MONMODULE_photo_fid', ''));
 
$image_path = '';
 
  if (isset(
$image_file->uri)) {
   
//récupérez le chemin de l'image dans un certyain style d'image
    //style d'image que vous aurez configuré précédemment.
   
$image_path = image_style_url('MONSTYLE_IMAGE',$image_file->uri);
  }
 
 
$image = theme_image(array(
   
'path' => ($image_path),
   
'alt' => t('Image description here.'),
   
'title' => t('This is our block image.'),
   
'attributes' => array('class' => 'une-class-image'),
  ));
 

 
// Sortie du Block en HTML avec une div wrapper
  //vous noterez la superbe traduction de ce commentaire :-)
 
$block = array(
   
'image' => array(
     
'#prefix' => '<div class="une-class">',
     
'#type' => 'markup',
     
'#markup' => $image,
    ),
  );
 
  return
$block;
}
?>

NB : Vous noterez le léger abus des "****" mais sinon le sytème me met des <strong> ou des <em> à la place...