특정 CCK 노드의 입력/수정 Form을 변경하려면

특정 CCK 노드의 입력/수정 Form을 변경하려면 어떻게 하는 게 좋을까.

1. 우선 Tooth라는 노드 타입을 정의해 보자. CCK의 IMPORT 기능을 이용하면 쉽다.
( 관련 글 참고 - "체크박스 형태의 4방향 톱니 관련 CCK 설정 예" )

2. 테마 폴더에 themplate.php 를 생성하고 아래 코드를 넣는다.
이미 있다면 제일 아래에 추가해 넣는다. 주의할 점 :

<?php
--
?>

에서 닫는 ?>는 쓰지말 것.

// we register the form to the theme registry
function box_cleanslate_theme(){
  return array(
    'tooth_node_form' => array(
      'arguments' => array('form' => NULL),
      'template' => 'tooth-node-form',
    ),
  );
}

3. tooth-node-form.php 라는 파일을 만들고 아래 코드를 넣는다.

<div class="tooth-node-form">
<?php // echo "<pre>".print_r( $form, 1 )."</pre>"; ?>
<?php // print drupal_render($form); ?>
<?php print drupal_render($form['title']); ?>
<?php print drupal_render($form['body_field']); ?>
<?php print drupal_render($form['group_check_by_four']); ?>
<?php print drupal_render($form['buttons']); ?>
</div>

이로써 Tooth라는 컨텐츠 타입을 생성/수정할 때마다
tooth-node-form.php 의 영향을 받는 폼이 생성된다.

드루팔 대단하지 않은가? 저런 특수한 폼을 만드는 데
코딩이라고는 단지 위 2개 뿐이다. CCK를 이용한 드루팔 CMS의 위력이다!

본 팁은 아래 글을 참고하였다.
http://drupal.org/node/101092#comment-874839

Your rating: None 평균 : 4.7 (3 votes)

댓글

그리고 폼의

그리고 폼의 세부적인 디자인 속성을 바꾸고 싶다면,
해당 테마의 style.css를 이용, 아래와 같이 클래스로 제어하면 되겠다.

.tooth-node-form {
background: #FF0000;
color: #F2FF2F
border: 1;
}

http://drupal.org/node/341628

http://drupal.org/node/341628
테마 커스터마이징에 관한 좋은 팁들이 있다.

특정 폼 형식을

특정 폼 형식을 template.php 로 커스터마이징하는 방식 대신에,
모듈을 이용해서 폼을 커스터마이징하면 테마를 바꾸더라도 영향이 없겠다.

이와 관련된 몇몇 좋은 글 출처를 소개한다.

00. Forms API Quickstart Guide - 기본이다.
http://api.drupal.org/api/file/developer/topics/forms_api.html/6
http://api.drupal.org/api/drupal/developer--topics--forms_api.html/6

Setting up variables for use in a template (preprocess functions)
http://drupal.org/node/223430

01. Theming CCK content type input form and output display - HD Digitalworks - 아주 좋다.
http://www.hddigitalworks.com/theming-cck-content-type

02. Theming Modules in Drupal 6 - 그림 설명도...
http://www.packtpub.com/article/theming-modules-in-drupal-6

03. Creating a Compound Field Module for CCK in Drupal 6.x, from Poplar ProductivityWare Articles
http://www.poplarware.com/cckfieldmodule.html

04. Modifying Forms in Drupal 5 and 6
http://www.lullabot.com/articles/modifying-forms-5-and-6

* 이것도 저것도 쉽지는 않은 편인데, 가장 확실하게 경험하는 방법은,
fivestar 모듈같이 표시부 커스터마이징이 심한 모듈은 분석하거나,
흉내내 보는 편이 좋다.

이와 비슷한

form-alter에 관한 좋은

form-alter에 관한 좋은 예제를 소개한다. 아래 주소에서 참고했다.
http://robshouse.net/blog-post/altering-forms-without-hook-form-alter

/**
* Take a form element or whole form array, and a callback, and
* recurse through all children elements, passing them to
* the callback function for processing.
*/
function step_form(&$element, $callback) {
    foreach (element_children($element) as $child) {
        step_form($element[$child], $callback);
    }
    $callback($element);
}

/**
* A callback function to change #title elements to the value "foo"
*/
function change_title(&$element) {
    if (isset($element['#title'])) {
        $element['#title'] = 'foo';
    }
}

function change_checkboxes(&$element) {
    drupal_set_message( $element['#type']." = ".$element['#title'] );   
    if (isset($element['#type']) && $element['#type'] == "checkboxes" ) {
        drupal_set_message( "<pre>".var_export($element,1)."</pre>" );
        $element['#title'] = 'foox';
    }
}

/**
* A fictional module's hook_form_alter implementation that sends the form
* to step_form() specifying change_title() as the callback function.
*/
function dent_form_form_alter(&$form, $form_state, $form_id) {
    // step_form($form, 'change_title');
    step_form($form, 'change_checkboxes');
}

확장한 예이다. *

확장한 예이다.
* 나중에 추가 : 아래 예제를 보강한 소스를 첨부파일로 추가했다. 2009/08/25

<?php
// $Id$
/**
* @file
* Module for dynamic display of dent form.
*/
/**
* Implementation of hook_help()
*/

function dent_form_form_alter(&$form, $form_state, $form_id) {
    // step_form($form, 'change_title');
    if ( $form_id == "tooth_node_form" ) {
        // step_form($form, 'change_checkboxes');
    }
}

function dent_form_help($path, $arg) {
if ($path == 'admin/help#dent_form') {
        $txt = 'This module displays dent_form in a page. '.
        'It assumes the existence of a content type named "quote".';
        return '<p>'. t($txt) .'</p>';
    }
}

function _dent_form_insert_after_first_element(&$a, $element) {
$first_element = array_shift($a);
array_unshift($a, $first_element, $element);
}

function dent_form_preprocess_tooth_node_form(&$vars) {
// dpm($vars);  // dpm() is from the devel module, install that to get this function
    // drupal_set_message( "<pre>".var_export( $vars, 1 )."</pre>" );    return;

    // $vars['form']['group_check_by_four']['field_four_l1']['value'][4]['#prefix'] = "<span class=\"cbStyled\">";
    // $vars['form']['group_check_by_four']['field_four_l1']['value'][4]['#suffix'] = "</span>";
    // $vars['form']['group_check_by_four']['field_four_l1']['value'][4] = "<span class=\"cbStyled\"> .. </span>";

    $vars['form']['group_check_by_four']['field_four_l1']['value']['#class'] = "vbox";
    drupal_set_message( "<pre>".var_export( $vars['form']['group_check_by_four']['field_four_l1']['value'], 1 )."</pre>" );

    /***** SUCCESS!
    $vars['form']['group_check_by_four']['field_four_l1']['value'][4]['#theme'] = "dent_form_checkbox";
    drupal_set_message( "<pre>".var_export( $vars['form']['group_check_by_four']['field_four_l1']['value'][4], 1 )."</pre>" );
    *****/

    step_form($vars['form'], 'change_checkboxes');

}

function dent_form_theme() {
    // Dent Form Module's Theme Function
return array(
'tooth_node_form' => array(
            'arguments' => array('form' => NULL), 'template' => 'tooth_node_form',
        ),
        'dent_form_checkbox' => array(
            'arguments' => array('element' => NULL),
        ),
        'dent_form_checkboxes' => array(
            'arguments' => array('element' => NULL),
        ),
);
}

function dent_form_theme_registry_alter(&$theme_registry) {
$my_path = drupal_get_path('module', 'dent_form');
$hooks = array('node');  // you can do this to any number of template theme hooks
// insert our module
foreach ($hooks as $h) {
_dent_form_insert_after_first_element($theme_registry[$h]['theme paths'], $my_path);
}
}

// hint by fivestart module.
/**
* Theme the dent_form form element by adding necessary css and javascript.
*/
function theme_dent_form_checkbox($element) {
    // _form_set_class($element, array('form-checkbox'));
    $checkbox = '<span class="cbStyled"><input ';
    $checkbox .= 'type="checkbox" ';
    $checkbox .= 'name="'. $element['#name'] .'" ';
    $checkbox .= 'id="'. $element['#id'] .'" ' ;
    $checkbox .= 'value="'. $element['#return_value'] .'" ';
    $checkbox .= $element['#value'] ? ' checked="checked" ' : ' ';
    $checkbox .= drupal_attributes($element['#attributes']) .'/>';
    $checkbox .= '</span>';

    /***
    if (!is_null($element['#title'])) {
        // $checkbox = '<div class="vbox">'. $checkbox .' '. $element['#title'] .'</div>';
        $checkbox = '<div class="vbox">'. $checkbox .'</div>';
    }
    ****/
    unset($element['#title']);

    // return theme('form_element', $element, $checkbox);
    return $checkbox;
}

function theme_dent_form_checkboxes($element) {
    // _form_set_class($element, array('form-checkboxes'));
    $checkboxes = '<div class="vbox">';
    // $checkboxes .= drupal_attributes($element['#attributes']) .'/>';
    $checkboxes .= '</div>';
    // return theme('form_element', $element, $checkboxes);
    return $checkboxes;
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

/**
* Take a form element or whole form array, and a callback, and
* recurse through all children elements, passing them to
* the callback function for processing.
* http://robshouse.net/blog-post/altering-forms-without-hook-form-alter
*/

function step_form(&$element, $callback) {
    foreach (element_children($element) as $child) {
        step_form($element[$child], $callback);
    }
    $callback($element);
}

/**
* A callback function to change #title elements to the value "foo"
*/
function change_title(&$element) {
    if (isset($element['#title'])) {
        $element['#title'] = 'foo';
    }
}

function change_checkboxes(&$element) {
    // drupal_set_message( $element['#type']." = ".$element['#title'] );   
    if (isset($element['#type']) && $element['#type'] == "checkbox" && $element['#array_parents'][0] == 'group_check_by_four' )
    {
        // $element['#title'] = 'foo_'.$element['#title'];
        $element['#theme'] = "dent_form_checkbox";

        // drupal_set_message( "<pre>".var_export($element,1)."</pre>" );
    }

    /***
    if (isset($element['#type']) && $element['#type'] == "checkboxes" )
    {
        $element['#class'] = "vbox";
        $element['#theme'] = "dent_form_checkboxes";
        // drupal_set_message( "<pre>".var_export($element,1)."</pre>" );
    }
    ***/

}