표가 데이터를 올바르게 게시하지 않거나 올바르게 표시하지 않는 이유는 무엇입니까?


10

관리자에서 양식을 만들었습니다.

$form['things'] = array(
  '#prefix' => '<div id="things">',
  '#suffix' => '</div>',
  '#tree' => TRUE,
  '#theme' => 'table',
  '#header' => array(t('Field Label'), t('Field Name'), t('Location'), t('Stuff')),
  '#rows' => array(),
);

그런 다음 각 행을 다음과 같이 추가하십시오.

foreach ($type_fields as $field_name => $attrs) {
  $stuff = array(
    '#type' => 'textfield',
    '#default_value' => $attrs['stuff'],
  );

$form['things']['#rows'][] = array(
  array('data' => 'label'),
  array('data' => $field_name),
  array('data' => $field_name),
  array('data' => $stuff),
);

}

형태가 좋아 보인다! 그러나 첫 번째 문제는 할당 된 값 #default_value이 양식에 표시되지 않는 것입니다. #value올바른 값으로 변경하면 DOES가 나타납니다. 어떻게해야하는지 궁금합니다. 드루팔 문서는 말한다 #value정확히 내가 함수에 기대하는 방법을 작동하지만 형태로 사용할 수 없습니다.

주요 문제는 텍스트 필드 중 하나에 테스트 데이터를 채우고 제출할 때입니다. _submit함수에 제출 된 값이 표시되지 않습니다 .

텍스트 필드에 입력 한 값 $form$form_state포함 하지도 않습니다 .

렌더링 때문인지 궁금합니다 #theme => "table". 이 문제가 발생한 사람이 있습니까? 양식에 _submit함수 를 게시 할 때 입력 한 값을 볼 수 있도록 변경 사항에 대한 아이디어가 있습니까?

답변:


13

문제는 텍스트 필드 요소가 #rows렌더 배열 의 속성 아래에 있다는 것 입니다.

Drupal #은 속성 / 속성으로 시작하는 모든 배열 키와 재귀 적으로 참석해야하는 요소로 시작하지 않는 배열 키를 확인합니다. 따라서 당신이 가지고있는 아이들 #rows은 양식 작성기에서 무시됩니다.

theme_table렌더 배열에서 실행 되므로 양식 요소 실제로 화면에 렌더링되지만 양식은 기술적으로 양식의 자식이 아니므로 값에 대한 지식이 없습니다.

내 경험상 이런 종류의 작업을 수행하는 가장 좋은 방법은 요소에 특정 테마 기능을 사용하는 것입니다.

function MYMODULE_theme() {
  return array(
    'MYMODULE_textfield_table' => array(
      'render element' => 'element'
    )
  );
}

function theme_MYMODULE_textfield_table($vars) {
  $element = $vars['element'];

  $rows = array();
  foreach (element_children($element) as $key) {
    $rows[] = array(
      array('data' => 'label'),
      array('data' => $element[$key]['#extra_data']['field_name']),
      array('data' => $element[$key]['#extra_data']['field_name']),
      array('data' => render($element[$key]))
    );
  }

  $header = array(t('Field Label'), t('Field Name'), t('Location'), t('Stuff'));
  return theme('table', array('header' => $header, 'rows' => $rows));
}

그런 다음 양식 함수에서 다음과 같은 코드를 사용합니다.

$form['things'] = array(
  '#prefix' => '<div id="things">',
  '#suffix' => '</div>',
  '#tree' => TRUE,
  '#theme' => 'MYMODULE_textfield_table'
);

foreach ($type_fields as $field_name => $attrs) {
  $form['things'][] = array(
    '#type' => 'textfield',
    '#default_value' => $attrs['stuff'],
    '#extra_data' => array('field_name' => $field_name)
  );
}

그런 다음 텍스트 필드를 양식에 등록해야하며 $form_state배열 의 값 을 정상적으로 볼 수 있습니다 .


유용한 답변에 감사드립니다. 1 쿼리 : 단일 페이지의 1000 결과를 페이지 및 다음 페이지의 호출기로 50 결과로 제한하는 방법은 무엇입니까? 이것으로 theme ( 'pager')을 렌더링하는 데 문제가 있습니다.
Himanshu Pathak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.