views:

90

answers:

2

I'm looking for a good, standards friendly way to alter the default comments form, such that there is a disclaimer immediately below the "Reply" header. I only want this disclaimer to appear above the comments form itself, not meerly when viewing comments.

This thread ( http://stackoverflow.com/questions/2644483/drupal-adding-disclaimer-text-above-the-submit-button-in-a-webform ) partially answers what I want but I'm not sure about how to apply the solution specifically to the comments form.

I know that this could be a rank amateur question, but any and all help is appreciated. Thanks.

Edit: I've tried implementing hook_form_alter as suggested and have managed to get the disclaimer to appear within the form just fine. One problem: the first draft of my disclaimer seems to be trapped above the comment form when replying to a comment. Clearing the cache, resetting the theme registry (on every page load, thanks to devel module) all have no effect.

Reply to Comment:
[first version of disclaimer] // won't go away, ever
[comment form]
[current version of disclaimer] // this one is fine
[submit button]

Any help here would again be most appreciated.

Edit (redux): Implemented the template.php centric solution. It was able to work just fine without any of the external effects as described above. Still not sure about a solution to the above problem. Thanks everyone.

+4  A: 

The comment form is a unique animal among Drupal forms in that it's not themeable by default, so the usual methods won't work without a little bit of extra help.

In short, you'll first need to register the form as themeable in your template.php file:

/**
* Implementation of hook_theme().
*/
function mytheme_theme(){
  return array(
    'comment_form' => array(
      'arguments' => array('form' => NULL),
    ),
  );
}

Next, you can add a theme function to drop in some additional elements to the form:

/**
* Theme the output of the comment_form.
*
* @param $form
*   The form that  is to be themed.
*/
function mytheme_comment_form($form) {
  $form['new_element'] = array(
    '#type' => 'markup',
    '#title' => t('Disclaimer'),
    '#value' => '<p>You have been disclaimed, sir!</p>',
    '#weight' => -20 // Lighter elements float to the top of the form
  );
  return drupal_render($form);
}

An understanding of how the Forms API (http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html) works will help you through making these edits. But, if you're just adding some HTML it should be pretty easy.

Of course, be sure to rebuild your theme registry after you've added the theme function.

anschauung
I tried implementing this template.php solution, and it was able to do what I wanted without any strange side effects. I agree that since this is a minor theming upgrade ('display some html here'), creating a new module might not be the simplest solution.
ford
+4  A: 

While what anschauung has posted will work, it's a lot of extra work compared to using hook_form_alter in a custom module. In your case, it would look something like this, using the close related hook_form_FORM_ID_alter:

function module_name_form_comment_form_alter(&$form, &$form_state) {
    $form['disclaimer'] = array(
      '#value' => t('Disclaimer text'),
      '#prefix' => '<div>',
      '#suffix' => '</div>',
      '#weight' => 0,  
    );
}
  • In the above example, you need to replace module_name with the name of the custom module you create.
  • The #weight will determine the placement, the lower it is the heigher up it will be placed. So tweak it until the placement is right.
  • #prefixand #suffix is the markup that is created before and after the element, can be anything.
  • #value the value of the form element, the actual disclaimer text.
  • This form element hasn't a #type, so it uses the default which is markup, which means it's just some custom html.
googletorp
I'd argue that 'create a custom module to accomplish a routine theming exercise because you don't feel like registering mytheme_theme' is a lot more work :)
anschauung
@anschauung I usually have lots of modules lying around to put stuff into already when I make a site.
googletorp
@googletor Oh, me too. But someone who's asking a basic themeing question probably isn't at that point yet :)
anschauung