2008-09-17 3 views
6

drupal 4.7의 맞춤 모듈에서 노드 객체를 해킹하여 node_save ($ node)에 전달하여 노드를 생성했습니다. 이 해킹은 드루팔 (Drupal 6)에서 더 이상 작동하지 않는 것으로 보입니다.이 해킹이 수정 될 수 있다고 확신하는 동안 양식없이 노드를 만드는 표준 솔루션이 있다면 궁금합니다. 이 경우 데이터는 다른 웹 사이트의 맞춤 피드에서 가져옵니다.drupal에서 cron 작업으로 노드를 만들려면 어떻게해야합니까?

답변

6

노드를 실용적으로 생성하기위한 표준 API에 대해 알지 못합니다. 그러나 이것은 내가하려는 일을하는 모듈을 만드는 것으로부터 수집 한 것입니다.

  1. 중요한 필드가 설정되어 있는지 확인 : UID는, 이름, 유형, 언어, 제목, 본문, 필터는
  2. 이 $ 노드에 추가 할 수 node_object_prepare() 그래서 다른 모듈을 통해 노드를 통과 (node_add()node_form() 참조) 목적.
11

이렇게하는 가장 좋은 방법은 drupal_execute를 이용하는 것입니다. drupal_execute는 표준 유효성 검증과 기본 노드 조작을 실행하여 시스템이 예상하는대로 작동하도록합니다. drupal_execute는 단순한 node_save보다는 약간 덜 직관적이지만, Drupal 6에서는 다음과 같은 방식으로 drupal_execute를 사용할 수 있습니다. 내가 발견

 

$form_id = 'xxxx_node_form'; // where xxxx is the node type 
$form_state = array(); 
$form_state['values']['type'] = 'xxxx'; // same as above 
$form_state['values']['title'] = 'My Node Title'; 
// ... repeat for all fields that you need to save 
// this is required to get node form submits to work correctly 
$form_state['submit_handlers'] = array('node_form_submit'); 

$node = new stdClass(); 
// I don't believe anything is required here, though 
// fields did seem to be required in D5 

drupal_execute($form_id, $form_state, $node); 
 
+0

실제로 폼과 노드 API가 혼합되어 있기 때문에 drupal_execute가 위험하다고 생각합니다. 결과 중 하나는 노드를 프로그래밍 방식으로 만들 때 종종 필요하지 않은 루프에서 제대로 작동하지 않는다는 것입니다. 일부 contrib 모듈에서는 필수 요소 일 수 있지만 최선의 해결 방법입니다. – FGM

0

또 하나의 대답은 드루팔 코어의 blogapi 모듈에서 the example를 사용하는 것이 었습니다. 그것이 핵심에 있다는 사실은 나에게 앞으로의 버전에서 계속 작동 할 것이라는 확신을 더 해줍니다.

0

위에서 좋은 답변이 있지만 가져온 피드 항목을 노드로 변환하는 구체적인 예에서는 간단한 피드 모듈 (http://wwww.drupal.org/project/simplefeed)을 사용하는 방법을 사용할 수도 있습니다. 이 모듈은 단순한 엔진을 사용하여 피드를 수집하고 각 피드의 개별 항목을 노드로 변환합니다. 나는 이것이 cron으로부터 노드를 생성하는 문제를 구체적으로 다루지는 않는다는 것을 알고 있지만, 전반적으로 문제에 대한 더 쉬운 해결책 일 수 있습니다.

+0

문제는 단순 급지에 대해 단순한 것이없고 뭉툭하고 부 풀리는 것이 가득한 것입니다. – deadprogrammer

+0

많은 contrib 모듈과 같은 문제가있는 것 같습니다. – Rimian

9

node_save()는 Drupal 6에서 여전히 정상적으로 작동합니다. 데이터를 작동 시키려면 몇 가지 특정 데이터 조각이 필요합니다.

$node = new stdClass(); 
$node->type = 'story'; 
$node->title = 'This is a title'; 
$node->body = 'This is the body.'; 
$node->teaser = 'This is the teaser.'; 
$node->uid = 1; 
$node->status = 1; 
$node->promote = 1; 

node_save($node); 

'상태'및 간과하기 쉬운 '홍보'- 당신이 그를 설정하지 않으면, 노드는 게시되지 않은 및 unpromoted 남아있을 것입니다, 당신은 콘텐츠 관리 화면으로 이동하는 경우에만 볼 수 있습니다 .

+0

$ node-> revision도 설정해야한다고 생각합니다. 초기 값으로 설정하고 저장하면 노드 ID로 설정됩니다. 나는 내 마음의 뒤쪽 어딘가에서이 문제가 생기는 것을 기억하는 것 같다. – Rimian

관련 문제