2009-10-29 6 views
2

Je suis en train de créer une fonction de transfert groupé pour un site Drupal. En utilisant Flash, je suis capable de télécharger les fichiers sur une URL spécifique qui gère ensuite les fichiers. Ce que je veux faire, ce n'est pas seulement de télécharger les fichiers, mais de créer un nœud d'un type spécifique avec le fichier sauvegardé dans un fichier qui a été configuré avec CCK. Comme ce sont des fichiers audio, il est important que filefield gère les fichiers, donc des méta-données supplémentaires peuvent être fournies avec le module getid3.Enregistrement de noeuds avec un champ de fichier

Maintenant, j'ai parcouru une partie du code car je n'étais pas capable de trouver une documentation sur l'API, mais je ne sais pas comment gérer cela. Idéalement, je pourrais juste passer le fichier à une fonction et utiliser simplement les données retournées lors de l'enregistrement du nœud, mais je n'ai pas réussi à trouver cette fonction.

Si quelqu'un a de l'expérience avec cela, je voudrais profiter de quelques conseils sur la façon d'aborder cette question.

Répondre

8

J'ai dû faire quelque chose de similaire il y a quelques semaines et j'ai fini par adapter certaines fonctionnalités du Remote File module, en particulier la fonction remote_file_cck_attach_file(). Il utilise la fonction field_file_save_file() du module de fichier, qui pourrait être la fonction que vous recherchez.

Dans mon cas, les fichiers sont récupérés à partir de plusieurs emplacements distants et stockés temporairement en utilisant file_save_data(). de les attacher à un filefield CCK qui se passe sur hook_nodeapi() preSave, en utilisant:

public static function attachAsCCKField(&$node, $filepath, $fieldname, $index=0) { 
    // Grab the filefield definition 
    $field = content_fields($fieldname, $node->type); 
    $validators = array_merge(filefield_widget_upload_validators($field), imagefield_widget_upload_validators($field)); 
    $fieldFileDirectory = filefield_widget_file_path($field); 
    // This path does not necessarily exist already, so make sure it is available 
    self::verifyPath($fieldFileDirectory); 
    $file = field_file_save_file($filepath, $validators, $fieldFileDirectory); 
    // Is the CCK field array already available in the node object? 
    if (!is_array($node->$fieldname)) { 
    // No, add a stub 
    $node->$fieldname=array(); 
    } 
    $node->{$fieldname}[$index] = $file; 
} 

$filepath est le chemin du fichier qui doit être attaché, $fieldname est le nom interne de l'instance filefield à utiliser dans le noeud et $index serait l'index basé sur 0 du fichier joint en cas de plusieurs entrées de champ.

La fonction s'est retrouvée dans une classe d'utilitaires, d'où la syntaxe de classe pour l'appel verifyPath(). L'appel s'assure juste que le répertoire cible est disponible:

public static function verifyPath($path) { 
    if (!file_check_directory($path, FILE_CREATE_DIRECTORY)) { 
    throw new RuntimeException('The path "' . $path . '" is not valid (not creatable, not writeable?).'); 
    } 
} 

Cela a fait pour moi - tout le reste se produit sur l'enregistrement de noeud automatiquement.

Je n'ai pas encore utilisé le module getid3, donc je ne sais pas si cela fonctionnerait de cette façon. En outre, je n'avais pas besoin d'ajouter des informations/attributs supplémentaires au champ de fichier, donc peut-être que vous auriez à mettre plus d'informations dans le tableau de champs que juste le fichier retourné par field_file_save_file(). Quoi qu'il en soit, j'espère que cela aidera et bonne chance.

+1

+1 pour field_file_save_file() qui m'aurait sauvé du temps. –

+0

On dirait très prometteur, si je n'avais pas de date limite, je creuserais et j'essaierais tout de suite. – googletorp

1

J'ai fait quelque chose avec imagefield qui a fonctionné, je pense que la structure doit être correcte sinon ça ne marchera pas. Il a fallu beaucoup d'essais et d'erreurs. C'est ce que j'ai peuplé l'imagefield avec.

$image['data'] =array(
      'title' => $media_reference_attributes->getNamedItem("source")->value, 
      'description' => $description, 
      'alt' => "",); 
$image['width'] = $width; 
$image['height'] = $height; 
$image['mimetype'] = $mime_type 
$image['uid'] = 1; 
$image['status'] = 1; 
$image['fid'] = $fid; 
$image['filesize'] = $file->filesize; 
$image['nid'] = $id; 
$image['filename'] = $url; 
$image['timestamp'] = $file->timestamp; 
$image['filepath'] = $file_path; 

Espérons que cela aide.

1

Vous voudrez peut-être regarder Image FUpload si vous avez besoin d'un coup d'oeil à l'intégration du téléchargement flash.

Pour pousser les fichiers sur un autre serveur tout en les manipulant via Drupal ressemble un peu à l'espace CDN, peut-être regarder le comportement dans les projets CDN ou CDN2?

Si vous trouvez une solution claire s'il vous plaît revenir et l'afficher!

+0

Image FUpload est similaire.La grande différence est cependant que je veux créer un nœud par fichier, donc il semble que je ne peux pas le faire comme ils le font. Je vais regarder de plus près pour voir si cela peut être utile. – googletorp

Questions connexes