2011-12-28 5 views
0

Drupal에서 양식을 만들려고합니다. 하나 이상의 요소를 양식에 추가 할 수 있습니다. 예를 들어, 페이지는 이벤트에 대한 데이터를 포함 할 수 있으며 이벤트에는 여러 날짜가있을 수 있습니다. 'add_another_btn'를 클릭 도착하면Drupal 한 번만 호출되는 AJAX 콜백

/** 
* Implements hook_form_alter(). 
*/ 
function addextra_form_alter(&$form, &$form_state) { 
    if ($form['#form_id'] == 'test_content_node_form') { 
    $form['elements_table'] = array(
     '#theme' => 'table', 
     '#title' => 'Elements already added', 
     '#header' => array('Item', 'Remove'), 
     '#empty' => 'No elements', 
     '#prefix' => '<div id="elements-table">', 
     '#suffix' => '</div>', 
    ); 
    $form['add_elements'] = array(
     '#title' => 'Add another element', 
     '#type' => 'fieldset', 
     '#collapsible' => TRUE, 
     '#collapsed' => FALSE, 
    ); 
    $form['add_elements']['add_content'] = array(
     '#type' => 'textfield', 
     '#description' => t('Add an element to the table'), 
     '#title' => t('Add another item'), 
     '#size' => '12', 
     '#maxlength' => '60', 
     '#prefix' => '<div id="addextra_content">', 
     '#suffix' => '</div>', 
    ); 
    $form['add_elements']['add_another_btn'] = array(
     '#type' => 'button', 
     '#name' => 'add_another', 
     '#button_type' => 'submit', 
     '#executes_submit_callback' => FALSE, 
     '#value' => 'Add another', 
     '#ajax' => array(
      'callback' => 'addextra_element_to_table', 
     ), 
    ); 
    } 
} 

, 그것은 아약스 콜백 'addextra_element_to_table를 실행합니다 : 그래서처럼 보이는 형태를 갖는다.

콜백이라고 :

function addextra_element_to_table(&$form, &$form_state) { 
    $form['elements_table']['#rows'][] = array($form_state['values']['add_content'], l('Remove Item', '#')); 
    drupal_add_js(drupal_get_path('module', 'addextra') . '/addextra.js'); 
    return array(
     '#type' => 'ajax', 
     '#commands' => array(
      ajax_command_replace('#elements-table', render($form['elements_table'])), 

    ), 
); 
} 

라는 JS 파일은 입력 필드에 ''

(function ($) { 
    $('#edit-add-content').val(''); 
})(jQuery); 

의 발을 대체 만이 콜백은 한 번 호출됩니다. 나는 행동이 호출되면 다시 첨부되어야하기 때문에 이것이라고 생각합니다. 내 무지를 유감스럽게 생각합니다 - 어떻게 달성해야할지 모르겠습니다. 누구든지 나를 도울 수 있습니까? 대단히 감사하겠습니다. 미리 감사드립니다.

+0

나는 Drupal 전문가가 아니지만, 이미로드 된 HTML 페이지에 동일한 js 파일을 계속 추가하고 매번 $ (document) .onload() 이벤트를 호출 할 것을 기대하고 있습니까? 이상하게 보입니다. Ajax를 사용하여이를 달성하는 이유는 무엇입니까? (결국) 숨겨진 노드를 '복제'할 수 없습니까? – Stan

+0

js를 제거 할 수 있지만 새 요소에 대한 대체 양식이 작동하지 않습니다.그것은 '#row'데이터를 추가하는 콜백에서 작업을 수행하지 않습니다. – Deshiknaves

+0

drupal_add_js를 옮겼으며 예상대로 작동합니다. add_content에 새 값을 추가 할 때마다 테이블이 실행되고 바뀝니다. 그러나 그것은 '#rows'에 추가하지 않고 테이블에 다른 요소를 추가 한 다음 테이블을 바꾸는 대신 행을 새로운 값으로 바꾸는 것입니다. 어떤 생각이라도 크게 감사 할 것입니다. 이것을 달성 할 수있는 다른 방법이 있다는 것을 알고 있지만, 지금은이 방법을이 방법으로 달성하는 방법을 알아 내서 앞으로이 방법을 사용할 수 있습니다. – Deshiknaves

답변

4

기본적으로 drupal_render()을 호출하는 render()#ajax 요소를 처리하지 않으므로 무시됩니다. 에 전화하기 전에 ajax_pre_render_element()을 통해 요소를 전달하려고 할 수 있습니다.

그렇긴하지만, 개인적으로는 정상적인 호출 순서를 벗어난 상태로 Drupal 기능을 재사용하려고 시도한 경험이별로 없으며, 특히 양식이 아닌 경우가 많습니다. 나는 drupal_get_form과 같은 최고 수준의 기능을 고집하는 것을 선호합니다. 필자는 디버거에서 여러 번 그 기능을 수행했으며 정확한 순서로 많은 작업을 수행합니다. 정확한 순서대로 작업하면 여러 부분을 재사용 할 수 있습니다. $form 인수의 내용을 조정하고 return $form을, 콜백에서

  • :

    , 나는 항상 두 가지 전략 중 하나를 선호하는 AJAX 콜백과 양식을 변경합니다. 이를 위해서는 #ajax['wrapper']을 원래 요소 (사례의 버튼)에있는 양식의 id (CSS에 사용 된 마크 업의 id 속성 값)로 설정해야합니다. 그런 다음 드루팔 (Drupal은 전체 형태로 그 shpiel을 할 수 있고, 브라우저는 모든 것을 대체합니다. Drupal은 이미 입력 된 값을 보존합니다.
  • 또는 콜백에서 DOM에 대한 특정 수정을 수행하는 명령 세트를 반환 할 수 있습니다. 귀하의 경우에는 새로운 행을 만들고 추가하는 명령이 될 것입니다. ajax_command_invoke()을 사용하면 전체 jQuery 병기를 처분 할 수 있습니다.

두 가지 전략에서 나는 보통 두 번째 전략을 선호합니다. 그러나 Drupal의 렌더링을 기반으로하거나 폼에 더 많은 변경 사항이있는 경우에는 첫 번째 폼을 사용해야합니다.

보조 메모로 drupal.stackexchange.com이 있다는 것을 알고 계셨습니까? 드루팔 (Drupal은 아주 특이 할 수 있습니다. 그 사이트에서 자세한 내용을보실 수 있습니다.

+0

나는 똑같은 문제를 안고 "return $ form;" 콜백에서 최상위 레벨 id가 즉시 고정되어 있습니다 ("return $ form [ 'some_element'];"대상 ID). 이것은 내가 지금까지 만들 수 있었던 유일한 해결책이다. 감사! –

+0

+1을 사용하여 drupal.stackexchange.com을 가리 킵니다. –

관련 문제