2012-08-04 4 views
1

J'ai un module dans lequel j'ai défini le type de contenu. Supposons que je n'ai que des champs title et body.Meilleure façon d'utiliser node_form

Lorsque la forme de noeud rend la norme title (textfield) et body (textarea). Je veux envelopper ces deux champs dans fieldset.

Voici comment j'y arrive, mais je ne pense pas que ce soit la meilleure solution.

/** 
* Implements hook_form(). 
*/ 
function hook_form($node, $form_state) { 
    return node_content_form($node, $form_state); 
} 

/** 
* Implements hook_form_FORM_ID_alter(). 
*/ 
function hook_form_node_form_alter(&$form, &$form_state, $form_id) { 
    if ($form_id == 'content_type_name_node_form') { 
    $form['info'] = array(
     '#type' => 'fieldset', 
     '#title' => t('Describe your content') 
    ); 

    $form['info']['title'] = $form['title']; 
    unset($form['title']); 

    $form['info']['body'] = $form['body']; 
    unset($form['body']); 
    } 
} 

Des suggestions pour l'améliorer?

MISE À JOUR

Une autre variante que je pense. C'est à peu près la même chose, juste un peu améliorée.

/** 
* Implements hook_form_FORM_ID_alter(). 
*/ 
function hook_form_node_form_alter(&$form, &$form_state, $form_id) { 
    if ($form_id == 'content_type_name_node_form') { 
    $groups = array(
     'info' => array(
     'title' => t('Describe your content'), 
     'fields' => array('title', 'body') 
    ) 
    ); 

    foreach ($groups as $key => $group) { 
     $form[$key] = array(
     '#type' => 'fieldset', 
     '#title' => $group['title'] 
    ); 
     foreach ($group['fields'] as $field) { 
     $form[$key][$field] = $form[$field]; 
     unset($form[$field]); 
     } 
    } 
    } 
} 

Répondre

3

Vous le faites exactement comme vous le devriez Vlad. C'est la façon dont l'API est destinée à être utilisée, et il n'y a vraiment pas d'autre moyen de le faire via le code.

Vous pouvez également modifier la disposition à l'aide des panneaux, bien que je ne l'ai pas fait moi-même et que je ne puisse pas expliquer le processus, et je ne peux pas dire avec certitude qu'il fera exactement ce que vous faites ici. L'utilisation d'un module personnalisé est probablement la voie la plus directe.

4

Je suis d'accord avec David Fells - je ne vois pas comment vous l'avez fait.

Mais juste pour vous offrir un moyen non-programmation de définir vos champs de titre et de corps dans un fieldset: vous pouvez consulter le Field Group module.

Fieldgroup sera, comme son nom l'indique, le groupe champs ensemble. Toutes les entités de champ auront la possibilité d'ajouter des groupes pour envelopper leurs champs ensemble. Fieldgroup est livré avec des enveloppes par défaut HTML comme les onglets verticaux, onglets horizontaux, accordéons, fieldsets ou div wrappers

Pour être honnête, il est surpuissant probable si tout ce que vous voulez faire est de créer un fieldset pour votre titre et le corps, mais si vous avez d'autres exigences similaires pour le regroupement de champs et les thèmes, il peut être utile d'avoir une interface utilisateur pour le faire pour vous.

+1

Fieldgroup est génial. Je suis d'accord que ce serait exagéré ici, mais cela ferait certainement l'affaire. –

+0

Vraiment être d'accord. Une fois que vous obtenez de grands types de contenu, être capable de grouper ces champs en onglets verticaux et groupes d'accordéon est ftw. – roberthernandez