Submitted by rico3030 on
Bonjour
Je cherche à créer un type de champ CCK double comprenant un textfield + un select.
Comme suggéré dans le post http://drupalfr.org/node/2213,
je me suis appuyé sur le module text.module et observé le code link.module pour voir comment gérer les deux champs de saisie et les valeurs à enregistrer dans la BDD.
Je m'y connais un brin en PHP mais peu en API Drupal. Après pas mal de sueurs et de recherches, j'arrive au résultat suivant:
- Je peux créer et configurer mon champ double dans un nouveau type de contenu. Je voulais que ce champ soit à valeurs multiple, ca marche.
- Je peux saisir le contenu dans le textfield et choisir l'option dans le select, c'est bien enregistré dans la BDD.
Maintenant plusieurs soucis:
- Quand je veux modifier le node créé, les valeurs enregistrées n'apparaissent pas dans mes champs.
La fonction en erreur est celle ci (modifiée sur text.module).
Le probleme vient de "foreach ($items as $data)" :
function motcle_widget($op, &$node, $field, &$node_field) {
switch ($op) {
case 'form':
$form = array();
$form[$field['field_name']] = array(
'#type' => 'fieldset',
'#title' => t($field['widget']['label']),
'#weight' => $field['widget']['weight'],
'#collapsible' => FALSE,
'#collapsed' => FALSE,
'#tree' => TRUE,
);
if ($field['multiple']) {
$form[$field['field_name']]['#type'] = 'fieldset';
$form[$field['field_name']]['#description'] = t($field['widget']['description']);
$delta = 0; print_r($field);
foreach ($items as $data) {
if ($data['motcle']) {
$form[$field['field_name']][$delta]['motcle'] = array(
'#type' => 'textfield',
'#title' => ($delta == 0) ? t($field['widget']['label']) : '',
'#default_value' => $data['motcle'],
'#required' => ($delta == 0) ? $field['required'] : FALSE,
'#maxlength' => $field['max_length'] ? $field['max_length'] : NULL,
'#weight' => $field['widget']['weight'],
);
$form[$field['field_name']][$delta]['typemotcle'] = array(
'#type' => 'select',
'#title' => ($delta == 0) ? t('Type') : '',
'#options' => motcle_allowed_values($field),
'#default_value' => $data['typemotcle'],
'#required' => FALSE,
'#weight' => $field['widget']['weight']+1,
);
$delta++;
}
}
.......
- Quand j'affiche le node, les valeurs de mes champs ne s'affichent pas. Quand je configure l'affichage de ce champs dans "Display Field", je n'ai que le choix "", alors que j'ai conservé les modes "Plain" et "Default".
function motcle_field_formatter_info() {
return array(
'default' => array(
'label' => 'Default',
'field types' => array('text'),
),
'plain' => array(
'label' => 'Plain text',
'field types' => array('text'),
),
);
}
/**
* Prepare an individual item for viewing in a browser.
*/
function motcle_field_formatter($field, $item, $formatter, $node) {
if (!isset($item['motcle'])) {
return '';
}
switch ($formatter) {
case 'plain':
$text = strip_tags($item['motcle']." - ".$item['typemotcle']);
break;
case 'default':
$text = $item['motcle']." - ".$item['typemotcle'];
}
return check_plain($text);
}
dans
Permalien Soumis par yched@drupal.org le 1 Février, 2008 - 17:48
dans motcle_field_formatter_info(), tu déclares des formatters pour des champs de type text. A la place, tu dois mettre quelque chose comme :
'field types' => array('motcle') // le nom du type de champ que ton module implémente, tel que déclaré dans ton hook_field_info().
Et l'erreur dans ton
Permalien Soumis par yched@drupal.org le 1 Février, 2008 - 17:51
Et l'erreur dans ton motcle_widget(), c'est que tu prends le paramètre $node_field, mais que le code de la fonction l'utilise sous le nom $items.
function motcle_widget($op, &$node, $field, &$items) {
devrait mieux marcher.
Effectivement ca marche
Permalien Soumis par rico3030 le 3 Février, 2008 - 16:05
Effectivement ca marche beaucoup mieux avec $items à la place de $node_field!
Voila ce qui arrive quand on copie des bouts de code et qu'on fait pas attention aux arguments des fonctions! :)
Pour le reste, les modifications n'ont fonctionné qu'en effacant le champ existant et en en créant un nouveau.
Merci de ton aide!