드루팔 프로그래밍으로 노드 데이터를 추가하기, Add a node data by Drupal Snippet
드루팔 프로그래밍으로 노드 데이터를 추가하기 예제입니다.
드루팔 모듈 작성 할 때에 자주 사용됩니다.
* Add a node data by Drupal Snippet.
function add_node_one( $title, $body ) {
global $user;
$node = new stdClass();
$node->title = "공통 타이틀 : ".$title;
$node->body = $body;
$node->uid = $user->uid;
$node->status = 1;
$node->promote = 1;
$node->type = "node_one_type";
// node_object_prepare($node);
// node_validate($node, $error);
node_save($node);
}
검색용 단어 : 노드 추가, 모듈 작성, 저장 save
- Drupal Major Version:
- Login to post comments
댓글
메모 - 외부 서비스 컨텐츠를 검색한 결과를 특정
메모 - 외부 서비스 컨텐츠를 검색한 결과를 특정 컨텐츠 타입으로 저장하는 경우.
요건ㄱ - 외부 서비스를 매번 접근/이용하는 것은 부하문제를 유발하므로, 캐슁 가능토록.
요건ㄴ - 특정 컨텐츠 타입을 제목과 연동검색해 동적으로 생성하길 바람.
1. 드루팔에 특정 컨텐츠 타입을 새로이 설정한다.
2. 특정 컨텐츠 타입의 컨템플릿을 수정하기 시작한다.
3. 컨템플릿 - 특정 컨텐츠 타입에 새로운 타이틀로 추가가 발생한 경우.
3. 컨템플릿 - 특정 컨텐츠 타입에 기존의 타이틀로 수정이 발생한 경우.
3. 컨템플릿 - 특정 컨텐츠 타입에 기존의 타이틀로 삭제가 발생한 경우.
를 분리 고려해서 설계한다.
4. 이미 컨텐츠가 존재하는 경우라면, 기간 조건에 의해
기존의 컨텐츠를 수정(업데이트)할 것인지 혹은
그냥 두고 후속처리를 하지 않을 것이지 판단해야 한다.
만일 티져(Teaser)를
만일 티져(Teaser)를 추가/변경하고 싶다면 다음과 같이 하면 된다.
$node->teaser = "Teaser 로 입력하기 원하는 내용";
...
$node_save( $node );
참고 소스)
http://drupal.org/node/355421#comment-1203841
좀 더 실용적인 예를 들자면,
$node->teaser = mb_substr( strip_tags( $node->body ), 0, 200, "UTF-8" ); // Substring 0 ~ 200 characters with UTF-8
이렇게 함으로써 본문 속의 HTML 태그 등에 의한 Teaser 짤림 현상을 막을 수 있겠다.
위 예문은 본문의 상위 200문자까지를 Teaser로 지정하는 예문이다.
나중에 더 개선한다면, 200이라는 숫자를, 드루팔의 기본 티져 길이 설정값을
읽어서 인용하면 좋겠다. 관련 메뉴는 admin/content/node-settings 이다.
node_example.module
node_example.module 이라는 이름으로 노드 조작에 관한 예제들이 모인 곳이 있어 소개한다.
http://api.drupal.org/api/file/developer/examples/node_example.module
그런데 이 곳 대부분의 소스들이 API 대신에 DB를 쿼리로 직접 조작하는 예제가 많은 것 같다.
위 사용법에 관한
위 사용법에 관한 자세한 API는 아래 주소에 있다.
http://api.drupal.org/api/function/node_save/6
참고로 Revision을 사용하는 컨텐츠 타입이라면,
$node->log = "이번 수정 리버전에 관한 로그";
이런 식으로 리비젼에 관한 로그 메시지도 넣을 수 있겠다.
기존 컨텐츠에 대한
기존 컨텐츠에 대한 리비전 저장은, 아래 예제 소스가 제일 정확하다.
용도 : 기존 컨텐츠의 제목이 $title인 노드를 찾아서 새로운 $body 내용으로 리비전 저장하는 것이다.
(제목의 유니크성을 위해 unique field 모듈과,
리비전의 변경내용 확인을 위한 diff 모듈까지 동원하면 금상 첨화겠다.)
function modify_node_detaildata( $title, $body ) {
global $user;
$condition = array(
"title"=>$title,
// "type"=>"some_node_type",
);
// ref. by http://api.drupal.org/api/function/node_load/6
$node = node_load( $condition );
// $node = node_submit( $node ); // to be unnecessary...
// if ( !$node ) { add_node_detaildata( $title, $body ); return; }
$node->body = $body;
$node->status = 1;
$node->promote = 1;
$node->log = "Re-Calc : ".date( 'Y.m.d - H:i:s' ) ;
$node->timestamp = time();
$node->revision = $node->revision + 1; // VERY IMPORANT for REVISION!
// ref. by http://api.drupal.org/api/function/_node_save_revision/6
// function _node_save_revision(&$node, $uid, $update = NULL)
// _node_save_revision( $node, $user->uid, "vid" ); // this function enable to change the revision order.
node_save($node);
}