드루팔 프로그래밍으로 노드 데이터를 추가하기, 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

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

댓글

위 사용법에 관한

위 사용법에 관한 자세한 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);
}

node_example.module

node_example.module 이라는 이름으로 노드 조작에 관한 예제들이 모인 곳이 있어 소개한다.
http://api.drupal.org/api/file/developer/examples/node_example.module
그런데 이 곳 대부분의 소스들이 API 대신에 DB를 쿼리로 직접 조작하는 예제가 많은 것 같다.

만일 티져(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 이다.

메모 - 외부 서비스 컨텐츠를 검색한 결과를 특정

메모 - 외부 서비스 컨텐츠를 검색한 결과를 특정 컨텐츠 타입으로 저장하는 경우.

요건ㄱ - 외부 서비스를 매번 접근/이용하는 것은 부하문제를 유발하므로, 캐슁 가능토록.
요건ㄴ - 특정 컨텐츠 타입을 제목과 연동검색해 동적으로 생성하길 바람.

1. 드루팔에 특정 컨텐츠 타입을 새로이 설정한다.
2. 특정 컨텐츠 타입의 컨템플릿을 수정하기 시작한다.

3. 컨템플릿 - 특정 컨텐츠 타입에 새로운 타이틀로 추가가 발생한 경우.
3. 컨템플릿 - 특정 컨텐츠 타입에 기존의 타이틀로 수정이 발생한 경우.
3. 컨템플릿 - 특정 컨텐츠 타입에 기존의 타이틀로 삭제가 발생한 경우.
를 분리 고려해서 설계한다.

4. 이미 컨텐츠가 존재하는 경우라면, 기간 조건에 의해
기존의 컨텐츠를 수정(업데이트)할 것인지 혹은
그냥 두고 후속처리를 하지 않을 것이지 판단해야 한다.