2010-01-03 4 views
1

일련의 사용자 (직원)가 노드를 만들 수 있지만 현재 사용자 프로필의 uid (사용자 ID)로 바꿀 수있는 상황이 있습니다. 표시됩니다.Drupal 6 : 제출 된 노드의 uid 수정

즉, 콘텐츠 유형에 대한 양식을 호출하는 블록이 있습니다. 직원 (uid = 20)이 클라이언트 페이지 (uid = 105)로 이동하여 양식을 채우는 경우 양식과 관련된 uid를 직원의 것이 아닌 클라이언트 (105)로 지정합니다. 양식이 블록에로드하지만, 제출 된 경우, 여전히 직원의 UID를 보여주고있다

<?php 
function addSR_form_service_request_node_form_alter(&$form, $form_state) { 
     if (arg(0) == 'user' && is_numeric(arg(1))) { 
     $form['#submit'][] = 'addSR_submit_function'; 
    } 
} 

function addSR_submit_function($form, $form_state) { 
    $account = user_load(arg(1)); 
    $form_state['values']['uid'] = $account->uid; 
    $form_state['values']['name'] = $account->name; 
} 

?> 

여기에 내가 무엇을 가지고 ... - I (1) 클라이언트의 UID를 잡기 위해 인수를 사용하고

. 클라이언트가 양식을 직접 채울 수 있기 때문에 hook_form_alter를 사용하고 싶지 않습니다. 양식을 직접 수정하고 싶지는 않습니다.이 경우 양식을 전혀 수정하지 않으려 고합니다.

답변

1

양식을 블록으로 작성하려면 formblock module을 사용할 수 있습니다. 특히 Drupal API를 사용하는 데 익숙하지 않은 경우. 그런 다음 양식에 사용자 고유의 제출 핸들러를 추가해야합니다. 이것은 양식이 제출 될 때 실행되는 코드 조각입니다. hook_form_alter 기능을 사용하여 클라이언트 페이지에서만이 작업을 수행하려고합니다.

/** 
* Hooks are placed in your module and are named modulename_hookname(). 
* So if a made a module that I called pony (the folder would then be called 
* pony and it would need a pony.info and pony.module file I would create this function 
*/ 
function pony_form_service_request_node_form_alter(&$form, $form_state) { 
    // Only affect the form, if it is submitted on the client/id url 
    if (arg(0) == 'client' && is_numeric(arg(1))) { 
     $form['#submit'][] = 'pony_my_own_submit_function'; 
    } 
} 

function pony_my_own_submit_function($form, &$form_state) { 
    $account = user_load(arg(1)); 
    $form_state['values']['uid'] = $account->uid; 
    $form_state['values']['name'] = $account->name; 
} 

이 코드의 배경은 조건이 충족 될 때만 양식이 변경된다는 것입니다.이 양식은 클라이언트 페이지에 제출됩니다. 나는 arg(0)이 클라이언트 일 것이라고 추측했다. 그래서 뭔가 다른 것이라면 당신은 원인을 바꿀 필요가있다. 우리는 폼이 유효성 검사를 통과하면 값을 변경하기 만하면되므로 submit 함수를 추가하면됩니다.

그렇다면 우리의 두 번째 기능이 실행되며, 이는 실제로 값을 변경합니다.

+0

Googletorp에게 감사드립니다. 매우 간결한 답변이었습니다. 폼 블록을 설치하고 addSR (대체 된 조랑말)이라는 모듈을 만들었습니다. formblock 모듈은 양식을 표시하지만 여전히 원래의 uid를 전달합니다. 핸들러가 호출되고 있는지 테스트 할 수있는 방법이 있습니까? --- 업데이트 된 스 니펫을 게시했습니다 ... – tpow

+0

가장 빠른 방법은 drupal_set_message ('some text')를 호출하는 것입니다. 어딘가에. 호출되면 유효성 검사 오류 등이 표시되는 메시지 영역에 텍스트를 인쇄합니다. 심각한 디버깅을 원할 경우 devel 모듈을 살펴 보거나 Firebug의 drupal을 살펴 봐야합니다. firebug addon/drupal 모듈 콤보에도 멋진 디버깅 도구가 있습니다. – googletorp

+0

좋아요, 나는 uid와 name 변수를 사용하여 몇 가지 "drupal_set_message"를 추가했고 모든 것이 올바르게 설정되었지만 (메시지를 호출하는 중이지만) uid는 변경되지 않았습니다.uid가 데이터베이스에 제출되기 바로 전에 uid를 설정 한 후에 양식 처리를 이용할 수있는 방법이 있습니까? – tpow

1
... 나는 또한 블록에서 이러는거야 것을 부끄러워 해요,하지만 난 모듈에 넣고하는 방법을 생각할 수 없게되고 그것에 대한 어떤 제안도 감상 할 수있다

PHP 블록이 잘못되었습니다. 모듈에 넣을 수 있습니다.

function hook_block($op, $delta = 0) { 
    // Fill in $op = 'list'; 
    if ($op == 'view' && $delta = 'whatever') { 
    $account = user_load(arg(1)); 
    $node = array('uid' => $account->uid, 'name' => $account->name, 'type' => 'service_request', 'language' => '', '_service_request_client' => $account->uid); 
    $output = drupal_get_form('service_request_node_form', $node); 
    // Return properly formatted array. 
    } 
} 

또한 form_alter에 값만 적용되기를 원합니다. 못생긴지만 작동합니다.

function hook_form_service_request_node_form_alter(&$form, $form_state) { 
    if (isset($form_state['node']['_service_request_client'])) { 
    $form['buttons']['submit']['#submit'] = array('yourmodule_node_form_submit', 'node_form_submit'); 
    } 
} 

function yourmodule_node_form_submit($form, &$form_state) { 
    $account = user_load($form_state['node']['_service_request_cilent'])l 
    $form_state['values']['uid'] = $account->uid; 
    $form_state['values']['name'] = $account->name; 
} 
+0

나는 맨 아래 부분을 이해하고 모듈에 추가했다. 그러나 "hook_block"함수를 사용한 적이 없습니다. 나는 그것이 모듈에 들어가기로되어 있다고 생각했지만 그것이 어디에서 호출되는지를 보지 못했습니다. 또한 블록에서 drupal_get_form을 호출해야합니까? – tpow

+0

예. Hook_block은 코드의 블록을 정의합니다. 그것은 모듈에 들어갑니다. node_block, user_block, system_block을 참조하십시오. http://api.drupal.org/api/function/hook_block/6 – dmitrig01