Computed Fields를 이용해서 프로그래밍이 가능한 동적 CCK 구현하기

Computed Fields를 이용해서 프로그래밍이 가능한 동적 CCK 구현하기

이 모듈은 쓸모가 많고 중요하다. http://drupal.org/project/computed_field

- PHP와 드루팔의 컨텐츠 필드개념을 잘 모른다면 사용하기 까다로울 수 있다.
- 드루팔 6.x 뿐만 아니라 7.x대로 지원하는 모듈이다. 각각의 사용법이 조금씩 다르다.

------ 7.x 기준의 설명 ------

예를 들어, 한 컨텐츠 타입의 attch2nd라는 필드가 있는데 aliasofattach라는 필드에서는 이를 변형해서 출력하는 예제를 준비해 보았다. (주의 : attach2nd였는데 미스 스펠로 인해 a가 빠짐)

컨텐츠 타입의 aliasofattach 필드 설정에서,
Computed Code (PHP)에는

// debuggging // $entity_field[0]['value'] = $entity->field_attch2nd;
$arrfield_for_another = array_pop( array_pop( $entity->field_attch2nd ) );
$entity_field[0]['value'] = $arrfield_for_another['origname'];

Display Code (PHP)에는

// 랜덤 확인용 // $display_output = 'dis'.rand(100000, 999999);
$display_output = "http://bulabula.net/".$entity_field_item['value'];

* 참고 : http://drupal.org/node/126522
* 참고 : http://drupal.org/node/149234

------- 이하 6.x 기준의 설명 ---------

예를 들어 어떤 신청 폼에서 제출을 받으면 하나씩 남은 여분을 줄이도록 구현된 CCK에서,

사용 예) CCK 설정후 Computed Code: 항목에는,
if ( $node_field[0]['value'] == '' && $node_field[0]['value'] != 0 )
{
   $node_field[0]['value'] = null ;
   /* 초기 한번만 작동하는 부분. only work on insert and not on upates */
}
else {
   drupal_set_message( "잔여수<pre>".var_export($node_field,1)."</pre>" );
}

사용 예) CCK 설정후 Display Format: 항목에는,

if ( $node_field_item['value'] == null ) {
    $display = "신청 가능";
}
else {
    if( $node_field_item['value'] > 6 ) {
        $display = "여분 있음";
    }
    else if ( $node_field_item['value'] == 0 ) {
        $display = "꽉 찼음";
    }
    else {
        $display = "잔여".$node_field_item['value']."건";
    }
}

본 모듈을 활용한 예제들이 모여있다.
http://drupal.org/node/126522

본 모듈에 관한 이해를 돕는 게시물이다.
http://drupal.org/node/251948

첫 제출과 그 이후를 구분하고자 할 때의 예제!!
http://drupal.org/node/232352

또다른 예제를 추가해 본다.

* 이미지 필드를 복수데이터(multiple values)로 보유하고 있는
해당 컨텐트 타입에 대해, 컨텐트의 제목과 동일한 description이 설정된
특정 이미지만 화면에 나오도록 하고 싶은 경우의 코드 예제다.

$strSearch = "No ScreenShot";
$strPrefix = "/".$base_url.file_directory_path()."/imagecache/Screen_160x240/screenshot/";

// DEBUGGING // $nTotal = count($node->field_img_screenshot);

foreach ($node->field_img_screenshot as $nOrder => $imgScreenShot) {
   if ( $imgScreenShot['data']['description'] == $node->title ) {

       // DEBUGGING // $strSearch = var_export($imgScreenShot, 1);
       $strSearch = $strPrefix.$imgScreenShot['filename'];
       break;
   }
}

// DEBUGGING // $node_field[0]['value'] = "<hr/>".$strSearch."<hr/>";
$node_field[0]['value'] = "<img src='".$strSearch."' border=0 />";

* 해당 CCK의 Computed Code: 항목에 넣고, 저장한 후 노드를 살펴보면 된다.

* 주의 : Computed Field 버전 6.x-1.0-beta5로 올린 뒤, 위 예제 소스가 정상 작동하지 않는다. Computed Field 6.x-1.0-beta3 기준으로 작성된 예제이다.

* 버전에 상관없이 잘 움직이는 예제도 준비해 보았다. (만드느라 다소 고생했다)

$strPlaceHolder = "<hr/>[No ScreenShot]<hr/>";
$strPrefix = "/".$base_url.file_directory_path()."/imagecache/Screen_80x120/screenshot/";

// DEBUGGING // $node_field[0]['value'] = "<hr /><pre>".var_export($node->field_img_screenshot[2], 1)."</pre><hr/>";
// DEBUGGING // $node_field[0]['value'] = &$node->title;

$nCount = count( $node->field_img_screenshot );

$strSearch = "";
for ($i=0; $i<$nCount; $i++) {

    $imgfield = $node->field_img_screenshot[$i];
    // DEBUGGING // $node_field[0]['value'] = "<pre>".var_export($imgfield,1)."</pre>";

   if ( strpos( $imgfield['data'], &$node->title ) === FALSE ) {}
   else {
       $imgfile = field_file_load($imgfield['fid']);
       $strSearch = $strPrefix.$imgfile['filename'];
       break;
   }
 
}

// DEBUGGING // $node_field[0]['value'] = "<hr/>".$strSearch."<hr/>";

if ($strSearch == "") {
   $node_field[0]['value'] = $strPlaceHolder;
}
else {
   $node_field[0]['value'] = "<img src='".$strSearch."' border=0 />";
}

반드시 컴퓨티드 필드 모듈의 버전을 확인하고 잘 사용하자.
아래 쪽 예제는 버전과 상관없이 잘 작동하는 것으로 보인다.

Your rating: None 평균 : 3.3 (9 votes)

댓글

computed 필드 모듈의 재계산 문제해결을

computed 필드 모듈의 재계산 문제해결을 도와주는 모듈이 있다.

computed_field_tools ㅣ 컴퓨티드 필드 모듈의 재계산을 자동으로 해 준다.
http://drupal.org/project/computed_field_tools

* 만일 디비값까지 반영할 필요가 없다면, 재계산 모듈은 불필요하다.

표시부분인 Display Code (PHP) 부분만 수정하면 된다.

특히, 뷰 등에서 매번 바뀌는 토큰이나 랜덤문자열을 만들고 싶다면,
Display Code (PHP) 부분에만 소스를 넣으면 된다.
(물론 이 값은 디비에 저장되지 않는 휘발성 데이터이다)

위 모듈과 비슷한 다이나믹 모듈도 있는데, 이 모듈은

위 모듈과 비슷한 다이나믹 모듈도 있는데,
이 모듈은 DB에 값을 저장하지 않고, 단지
참고 데이터로부터 PHP 계산 결과를 표시해 줄 뿐이다.

http://drupal.org/project/dynamicfield

Computed Field 모듈에서 $node를

Computed Field 모듈에서 $node를 디버깅할 때 특정 필드(ex: ImageField or FileField의 파일명 등등)의 값이 제대로 보이지 않는 경우가 있다. (버전에 따라?)

이런 경우, field_file_load($특정field['fid']) 함수를 이용해서 더 상세한 속성정보를 가지고 올 수 있다.

많이 배우고 갑니다!

많이 배우고 갑니다!