2008-11-14 10 views
1

Je voudrais programmer (en utilisant php) un formulaire drupal existant pour créer un type de contenu qui est inclus dans un module contribué.Drupal - Automatiser une soumission de formulaire de contenu

Détails: Le module est SimpleFeed et le type de contenu est Feed. Je voudrais appeler les fonctions du module pour accomplir ceci. La méthode qui m'intéresse est hook_insert qui semble nécessiter vid et nid dont je ne suis pas sûr.

Toute aide est appréciée.

Répondre

1

pouvez-vous fournir un peu plus d'informations (quels modules?). En général, je suggérerais probablement d'appeler les fonctions des modules pour créer le type de contenu, au lieu d'essayer de le passer à travers un formulaire par programmation. De cette façon, vous n'avez pas à vous inquiéter de la mise en œuvre, et pouvez croire que si le module fonctionne, cela fonctionnera aussi pour votre script :)

Bien sûr, cela lie votre module au leur, donc tout changement dans leur les fonctions pourraient affecter le vôtre. (mais encore une fois, vous courez ce risque si elles mettent à jour leur structure de base de données aussi)

ex.

// your file.php 

function mymodule_do_stuff() { 
    cck_create_field('something'); // as an example, i doubt this 
            // is a real CCK function :) 
} 

modifier: vid et nid sont les ID nœud, vid est l'ID de révision et nid est la clé primaire d'un nœud particulier. parce que c'est un nœud réel, vous devrez peut-être faire deux opérations.

  1. créer programatically un nœud

    vous devrez faire référence à la base de données pour tous les champs exacts (tables node et node_revisions), mais cela devrait vous obtenir un nœud de travail de base:

    $node = (object) array(
        'nid' => '',   // empty nid will force a new node to be created 
        'vid' => '', 
        'type' => 'simplefeed'. // or whatever this node is actually called 
        'title' => 'title of node', 
        'uid' => 1,    // your user id 
        'status' => 1,   // make it active 
        'body' => 'actual content', 
        'format' => 1, 
              // these next 3 fields are the simplefeed ones 
        'url' => 'simplefeed url', 
        'expires' => 'whatever value', 
        'refresh' => 'ditto', 
    ); 
    
    node_save($node); 
    

    maintenant je pense il devrait appeler automatiquement hook_insert() de simplefeed à ce stade. sinon, passez à 2. mais je vérifierai pour voir si cela a déjà fonctionné.

  2. appelez-le vous-même!

    simplefeed_insert($node); 
    

Edit2: drupal_execute() est pas une mauvaise idée non plus, comme vous pouvez récupérer une validation, mais cette façon vous ne devez pas traiter avec l'API de formulaires si vous êtes pas à l'aise avec ça. Je suis assez sûr que node_save() invoque tous les hooks de toute façon, donc vous devriez vraiment seulement faire l'étape 1 sous cette méthode.

1

L'api drupal fournit drupal_execute() pour faire exactement cela. Je vous suggère d'éviter d'appeler les fonctions directement pour créer le nœud (à moins qu'il y ait une raison de performance). En utilisant drupal_execute(), tous les hooks appropriés dans les autres modules seront appelés et votre code sera bien plus susceptible de continuer à fonctionner dans les futures versions de drupal.

Notez qu'un bug classique dans l'utilisation de cette méthode est d'abord appeler quelque chose qui va charger le code de votre formulaire de création de noeud comme

module_load_include('inc', 'node', 'node.pages')

.

L'appel de node_save directement est généralement considéré comme obsolète et pourrait vous laisser avec du code cassé dans les futures versions de drupal.

Il y a un bel exemple à this lullabot post

+0

avez-vous une référence pour cela? node_save est comment drupal construit des noeuds, je n'ai vu aucune indication qu'ils se déplacent vers un modèle différent. – Owen

+0

J'aurais dû être plus clair. Je n'ai pas entendu dire que node_save est déprécié, mais l'utiliser pour résoudre ce type de problème est. J'ai eu plusieurs conversations drupal irc où on m'a dit que node_save était l'ancienne façon de résoudre ce problème et drupal_execute est la nouvelle façon. –

+0

Il ya une bonne discussion de quand utiliser chacun dans les commentaires à http://www.lullabot.com/articles/quick_and_dirty_cck_imports –

Questions connexes