Computed Fields를 이용해서 프로그래밍이 가능한 동적 CCK 구현하기
Computed Fields를 이용해서 프로그래밍이 가능한 동적 CCK 구현하기
중요하다. http://drupal.org/project/computed_field
예를 들어 어떤 신청 폼에서 제출을 받으면 하나씩 남은 여분을 줄이도록 구현된 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 />";
}
반드시 컴퓨티드 필드 모듈의 버전을 확인하고 잘 사용하자.
아래 쪽 예제는 버전과 상관없이 잘 작동하는 것으로 보인다.


Comments
3 comments postedcomputed 필드 모듈의 재계산 문제해결을 도와주는 모듈이 있다.
computed_field_tools ㅣ 컴퓨티드 필드 모듈의 재계산을 자동으로 해 준다.
http://drupal.org/project/computed_field_tools
위 모듈과 비슷한 다이나믹 모듈도 있는데,
이 모듈은 DB에 값을 저장하지 않고, 단지
참고 데이터로부터 PHP 계산 결과를 표시해 줄 뿐이다.
http://drupal.org/project/dynamicfield
Computed Field 모듈에서 $node를 디버깅할 때 특정 필드(ex: ImageField or FileField의 파일명 등등)의 값이 제대로 보이지 않는 경우가 있다. (버전에 따라?)
이런 경우, field_file_load($특정field['fid']) 함수를 이용해서 더 상세한 속성정보를 가지고 올 수 있다.