2016-07-28 13 views
0

Meine Anforderung besteht darin, Dateien in bestimmte Ordner hochzuladen. Wie erreiche ich das mit form api? Wie kann ich den folgenden Code ändern, so dass upload_location dynamisch sein sollte. Die hochgeladene Datei sollte in den vom Benutzer angegebenen Ordnernamen gespeichert werden.
#submit-Element ruft keine custom_document_submit-Funktion auf.Wie übergibt man den Speicherort für dynamische Dateien in der Formular-API?

$form['folder_name'] = array(
     '#type' => 'textfield', 
     '#title' => t('Folder Name'), 
); 
    $form['document'] = array(
    '#type' => 'managed_file', 
    '#upload_validators' => array('file_validate_extensions' => array('xml')), 
    '#upload_location' => 'public://', 
    '#submit' => array('custom_document_submit'), 
    ); 
function custom_document_submit($form, &$form_state){ 
    $destination = $form_state['values']['folder_name']; 
    $validators = array(); 
    $file = file_save_upload('document', $validators, 'public://'.$destination); 
} 

Antwort

0

Die #submit property kann nicht auf einem managed_file Form Objekt erklärt sein ...

Stattdessen müssen Sie hinzufügen oder einreichen Aktion auf dem Formular (oder Taste) zu ändern.

$form['#submit'][] = 'custom_document_submit'; 

Wenn Sie nicht die einreichen Methode des Formulars ändern möchten, können Sie auch fügen Sie einfach einen Validator (mit #validate property), Hexe wird ändern Sie die ‚#upload_location‘ Eigenschaft des Dokuments auf die je folder_name Wert.

Die Eigenschaften #submit und #validate müssen dem Formular selbst hinzugefügt werden.

0
<?php 

define('IMPORT_DIRECTORY_PATH', 'public://import'); 

$form['folder_name'] = array(
     '#type' => 'textfield', 
     '#title' => t('Folder Name'), 
); 


    form['document'] = array(
    '#title' => t('Upload .xml'), 
    '#type' => 'managed_file', 
    '#upload_validators' => array(
     'file_validate_extensions' => array('xml'), 
    ), 
    '#process' => array('import_document_element_process'), 
); 

$form['submit'] = array(
    '#type' => 'submit', 
    '#value' => t('Upload'), 
    '#submit' => array('custom_document_submit'), 
); 

function custom_document_submit($form, &$form_state){ 

    // Validate extensions. 
    $validators = array(
     'file_validate_extensions' => array('xml'), 
    ); 
    $file = file_save_upload('document', $validators, FALSE, FILE_EXISTS_RENAME); 

    // If the file passed validation. 
    if ($file) { 
     // Rename uploaded file to prevent cache from remembering name file. 
     $directory = SCHEDULES_IMPORT_DIRECTORY_PATH; 
     if (file_prepare_directory($directory, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS)) { 
     $uri = $directory . '/xml_' . $file->uid . '_' . $file->timestamp . '.xml'; 
     if ($file = file_move($file, $uri)) { 
      $form_state['values']['document'] = $file; 
     } 
     else { 
      form_set_error('document', t('The file could not be uploaded.')); 
     } 
     } 
     else { 
     form_set_error('document', t('The directory is not writable.')); 
     } 
    } 
    else { 
     form_set_error('document', t('The file extension is not correct.')); 
    } 
    // dpm($form_state['values']['document']); 
    // var_dump($form_state['values']['document']); 
} 


/** 
* Removing the upload button in managed files. 
*/ 
function import_document_element_process($element, &$form_state, $form) { 
    $element = file_managed_file_process($element, $form_state, $form); 
    $element['upload_button']['#access'] = FALSE; 

    return $element; 
}