Submitted by antff7 on
Bonjour à tous,
Voilà, cela fait un petit mois que je suis sur drupal et je commence à avoir quelques questions sur le développement de modules.
Alors, je vous explique...
J'ai créé grâce à "l'interface drupal" un nouveau type de contenu "graph" avec plusieurs champs (créés avec CCK): "sommets", "arrêtes","degré"...
La base de données a donc une nouvelle table "content_type_graph" avec comme champs"field_nb_sommets_value","field_nb_arretes_value"... mais également un "vid" et un "nid"
Mais voilà, je veux remplir ces champs automatiquement grâce à un module (que j'essaye d'implémenter)
Ce module doit récupèrer des données d'un fichier .txt et insérer les valeurs dans les champs du type de contenu "graph"
Voici le code pour le moment:
<?php
$fichier=file("/var/www/drupal-6.20/sites/all/modules/remptab/tmp.txt");
$name=$fichier[0];
$nb_sommets=$fichier[1];
$nb_arretes=$fichier[2];
$deg_max=$fichier[5];
$deg_min=$fichier[6];
$deg_moy=$fichier[7];
function tabgraph_insert($node) {
db_query("INSERT INTO {content_type_graph} (nid,vid,field_nb_arretes_value,field_nb_sommets_value,field_deg_moy_value,field_deg_min_value,field_deg_max_value) VALUES (%d, %d, %d,%d,%f,%f,%f)", $node->nid, $node->vid, $nb_arretes, $nb_sommets, $deg_moy, $deg_min, $deg_max);
}
Avec ce code, Drupal affiche page blanche et si j'enlève la ligne function tabgraph_insert($node){ et }
, l'insertion dans la base marche mais les valeurs du vid et nid sont à 0, du coup j'ai une erreur
Est-ce que mon code comprend des erreurs ou faut t-il rajouter des fonctions pour que ce module fonctionne?
Si quelqu'un a une réponse, je suis bien évidemment preneur...
A priori il faudrait utiliser
Permalien Soumis par vincent59 le 2 Mai, 2011 - 17:05
A priori il faudrait utiliser un node_save, qui va déclencher les différents hook.
Voir : http://drupal.org/node/218862, ou encore un exemple de création de contenu à partir d'un fichier CSV : https://gist.github.com/263279
OK, merci Je vais regarder
Permalien Soumis par antff7 le 2 Mai, 2011 - 17:09
OK, merci
Je vais regarder tout ça...
Tu avais tout à fait raison
Permalien Soumis par antff7 le 3 Mai, 2011 - 12:03
Tu avais tout à fait raison vincent...Merci!
Maintenant j'ai un autre soucis, en fait dans ce type de contenu, on peut ajouter 3 fichiers attachés différents, je me suis inspiré du code d'un autre post sur le forum...mais il me reste des erreurs...(voir en fin de msg)
Voici le code: (certes un peu long...)
<?php
//code pour récupérer les infos du fichier.txt (voir dans post precedent)
//permet d'enlever l'extension du name
$pt = ".";
$position = strpos($name, $pt);
$name_sans_extension = substr($name, 0, $position);
//déclaration des 3 fichiers
$file = new stdClass();
$file1 = new stdClass();
$file2 = new stdClass();
$file_drupal_path = "sites/default/files/".$name_sans_extension.".graph";
$file_drupal_path1 = "sites/default/files/".$name_sans_extension.".png";
$file_drupal_path2 = "sites/default/files/".$name_sans_extension.".tar.gz";
$file->filename = basename($file_drupal_path);
$file->filepath = $file_drupal_path;
$file->filemime = 'graph';
$file->uid = $uid;
$file->status = FILE_STATUS_PERMANENT;
$file->timestamp = time();
drupal_write_record('files', $file);
//...pareils pour les 3 (j'ai bien changé les numéros pour file1 et file2)
// le node_save
$node -> type = 'big_structured_graphs';
$node -> title = $name_sans_extension;
$node -> field_nb_sommets_bsg[ 0 ][ 'value' ] = $nb_sommets ;
$node -> field_nb_arretes_bsg [ 0 ][ 'value' ] = $nb_arretes ;
$node -> field_deg_max_bsg [ 0 ][ 'value' ] = $deg_max ;
$node -> field_deg_min_bsg [ 0 ][ 'value' ] = $deg_min ;
$node -> field_deg_moy_bsg [ 0 ][ 'value' ] = $deg_moy ;
$node -> field_file_bsg = array(
array( 'delta' => 0,
'fid' => $file->fid,
'title' => basename($file->filename),
'filename' => $file->filename,
'filepath' => $file->filepath,
'filesize' => $file->filesize,
'mimetype' => $mime,
'data' => array(
'description' => basename($file->filename),
),
'list' => 1,
),
array( 'delta' => 1,
'fid' => $file1->fid,
'title' => basename($file1->filename),
'filename' => $file1->filename,
'filepath' => $file1->filepath,
'filesize' => $file1->filesize,
'mimetype' => $mime1,
'data' => array(
'description' => basename($file1->filename),
),
'list' => 1,
),
array( 'delta' => 2,
'fid' => $file2->fid,
'title' => basename($file2->filename),
'filename' => $file2->filename,
'filepath' => $file2->filepath,
'filesize' => $file2->filesize,
'mimetype' => $mime2,
'data' => array(
'description' => basename($file2->filename),
),
'list' => 1,
),
);
$node = node_submit ( $node );
node_save($node);
content_insert($node);
//fin module
Tout marche bien, les données sont entrées dans la bdd avec des nid et vid valides, mais apparemment ça coince au niveau des fichiers...Voici mon erreur:
* user warning: Duplicate entry '132-0' for key 'PRIMARY' query: INSERT INTO content_field_file_bsg (vid, nid, delta, field_file_bsg_fid, field_file_bsg_list, field_file_bsg_data) VALUES (132, 132, 0, 32, 1, 'a:1:{s:11:\"description\";s:10:\"4elt.graph\";}') in /var/www/drupal-6.20/sites/all/modules/cck/content.module on line 1213.
* user warning: Duplicate entry '132-1' for key 'PRIMARY' query: INSERT INTO content_field_file_bsg (vid, nid, delta, field_file_bsg_fid, field_file_bsg_list, field_file_bsg_data) VALUES (132, 132, 1, 33, 1, 'a:1:{s:11:\"description\";s:8:\"4elt.png\";}') in /var/www/drupal-6.20/sites/all/modules/cck/content.module on line 1213.
* user warning: Duplicate entry '132-2' for key 'PRIMARY' query: INSERT INTO content_field_file_bsg (vid, nid, delta, field_file_bsg_fid, field_file_bsg_list, field_file_bsg_data) VALUES (132, 132, 2, 34, 1, 'a:1:{s:11:\"description\";s:11:\"4elt.tar.gz\";}') in /var/www/drupal-6.20/sites/all/modules/cck/content.module on line 1213.
Si quelqu'un trouve la réponse mon module sera (presque) terminé et j'arrêterai d'écrire des posts de 3 kilomètres de long...^^
Il semblerait (d’après les
Permalien Soumis par vincent59 le 3 Mai, 2011 - 13:16
Il semblerait (d'après les échanges sur http://drupal.org/node/732382) qu'à la place de content_insert() il vaudrait mieux utiliser content_update
Ou encore faire :
<?php
node_save($node);
if ($isNew) {
content_insert($node);
} else {
content_update($node);
}
?>
Nikel ! Plus
Permalien Soumis par antff7 le 3 Mai, 2011 - 14:09
Nikel! Plus d'erreurs...maintenant je cherche à savoir si le fichier existe bien pour ne pas afficher de liens "inutils". Je veux que drupal créé un lien si le fichier existe...
J'ai tenté ça mais drupal n'aime pas -->page blanche:
........
$node -> field_file_bsg = array(
if (file_exists($file)) {
array( 'delta' => 0,
'fid' => $file->fid,
'title' => basename($file->filename),
'filename' => $file->filename,
'filepath' => $file->filepath,
'filesize' => $file->filesize,
'mimetype' => $mime,
'data' => array(
'description' => basename($file->filename),
),
'list' => 1,
),
}
......
Une petite idée???
J’essaye juste avec un ‘if’
Permalien Soumis par antff7 le 5 Mai, 2011 - 09:49
J'essaye juste avec un 'if' pour voir s'il fonctionne...
En faisant le code suivant mes fichiers sont insérés dans la bdd au bon endroit. Le problème c'est que ces fichiers ne n'affichent pas sur le site...
J'ai cherché, essayé de faire autrement mais en vain...
Es ce que vous avez une idée??
//code
if (file_exists($file_drupal_path))
{
$node -> field_file_graph = array(
array( 'delta' => 0,
'fid' => $file->fid,
'title' => basename($file->filename),
'filename' => $file->filename,
'filepath' => $file->filepath,
'filesize' => $file->filesize,
'mimetype' => $mime,
'data' => array(
'description' => basename($file->filename),
),
'list' => 1,
),
array( 'delta' => 1,
'fid' => $file1->fid,
'title' => basename($file1->filename),
'filename' => $file1->filename,
'filepath' => $file1->filepath,
'filesize' => $file1->filesize,
'mimetype' => $mime1,
'data' => array(
'description' => basename($file1->filename),
),
'list' => 1,
),
array( 'delta' => 2,
'fid' => $file2->fid,
'title' => basename($file2->filename),
'filename' => $file2->filename,
'filepath' => $file2->filepath,
'filesize' => $file2->filesize,
'mimetype' => $mime2,
'data' => array(
'description' => basename($file2->filename),
),
'list' => 1,
),
);
}
J’ai toujours pas trouvé de
Permalien Soumis par antff7 le 11 Mai, 2011 - 15:12
J'ai toujours pas trouvé de solution à mon problème...
HELP!
Comment peut-on récupérer les
Permalien Soumis par selinav le 5 Juillet, 2011 - 18:02
Comment peut-on récupérer les infos d'un fichier à partir de son fid?