2010-04-19 3 views
0

Je suis en train d'écrire un module pour mon organisation pour mettre en cache des flux XML vers des fichiers statiques à un endroit arbitraire sur notre serveur web. Je suis nouveau au développement de Drupal, et je voudrais savoir si j'approche de la bonne façon.Traitement de formulaire arbitraire avec Drupal

Fondamentalement, je:

  1. Expose une URL via le crochet de menu, où un utilisateur peut entrer dans un un répertoire de sortie sur le serveur Web et appuyez sur le bouton « dump » et ensuite PHP aller à drupal et obtenir le flux xml. Je n'ai pas besoin d'aide avec cette fonctionnalité, parce que j'ai un prototype fonctionnant en Python (en dehors de Drupal).
  2. Fournir un rappel pour le formulaire où je peux faire ma logique, en utilisant les paramètres de formulaire.

Voici le crochet de menu:

function ncbi_cache_files_menu() { 
    $items = array(); 


    $items['admin/content/ncbi_cache_files'] = array(
     'title' => 'NCBI Cache File Module', 
     'description' => 'Cache Guide static content to files', 
     'page callback' => 'drupal_get_form', 
     'page arguments' => array('ncbi_cache_files_show_submit'), 
     'access arguments' => array('administer site configuration'), 
     'type' => MENU_NORMAL_ITEM, 
    ); 

    return $items; 
} 

je produis la forme:

function ncbi_cache_files_show_submit() { 

    $DEFAULT_OUT = 'http://myorg/foo'; 
    $form[ 'ncbi_cache_files' ] = array(
     '#type' => 'textfield', 
     '#title' => t('Output Directory'), 
     '#description' => t('Where you want the static files to be dumped. 
      This should be a directory that www has write access to, and 
      should be accessible from the foo server'), 
     '#default_value' => t($DEFAULT_OUT), 
     '#size' => strlen($DEFAULT_OUT) + 5, 
    ); 

    $form['dump'] = array( 
     '#type' => 'submit', 
     '#value' => 'Dump', 
     '#submit' => array('ncbi_cache_files_dump'), 
    ); 

    return system_settings_form($form); 
} 

Ensuite, la fonctionnalité est dans le rappel:

function ncbi_cache_files_dump($p, $q) { 
    //dpm(get_defined_vars()); 
    $outdir = $p['ncbi_cache_files']['#post']['ncbi_cache_files']; 
    drupal_set_message('outdir: ' . $outdir); 

} 

La question: Est-ce c'est une manière décente de traiter une forme arbitraire dans Drupal? Je n'ai pas vraiment besoin d'écouter des hooks drupal, parce que je suis en train de faire un peu d'URL et de traitement de fichiers.

Quels sont les arguments que je reçois dans le rappel ($ q)? C'est le tableau de forme je suppose, avec les valeurs de poste? Est-ce la meilleure façon de travailler sur les paramètres de formulaire?

Merci pour tout conseil.

Répondre

0

Vous pouvez traiter des formulaires en deux étapes, les valider et les soumettre.

Valider est pour quand vous voulez valider certains utilisateur fourni et augmenter les erreurs de forme si une entrée utilisateur est invalide (comme une URL invalide ou adresse e-mail)

Soumettre qui est celui que vous utilisez est appelé si un formulaire passe toutes ses validations, donc à ce moment-là, si vous avez fait une validation correcte, vous saurez que les données fournies par l'utilisateur sont correctes.

Votre fonction d'envoi devrait ressembler à ceci:

function ncbi_cache_files_dump(&$form, &$form_state) { 
    // $form: an array containing the form data 
    // $form_state: data about the form, like the data inputted in the form etc. 
    // code... 
} 
0

Je pense que vous avez besoin de 2 formes distinctes ici:

  1. pour le réglage du répertoire (celui que vous avez maintenant);
  2. pour effectuer une sauvegarde (une autre forme qui utiliserait le chemin configuré).

Il semble également logique de publier le chemin enregistré précédemment comme valeur par défaut dans le formulaire de configuration (au lieu d'un chemin codé en dur).

Et en général, vous devriez vérifier les données d'entrée de formulaire à partir du deuxième paramètre de la fonction de rappel soumettre:

function ncbi_cache_files_dump(&$form, &$form_state) { 
    $outdir = $form_state['values']['ncbi_cache_files']; 
    // ... 
} 
Questions connexes