무제한 값 필드-노드 편집시 추가 필드를 숨기는 방법


9

새 노드를 만들 때 "새 항목 추가"버튼이있는이 무제한 값 필드가 있습니다.

무제한 값 필드-새 노드

괜찮습니다, 훌륭합니다. 그러나 기존 노드를 편집하면 UNDESIRED 빈 추가 값이 추가됩니다. 무제한 값 필드-노드 편집

내 실제 사례는 복합 필드가 있지만이 작은 필드를 예로 사용하면 이해하기 쉽다고 생각했습니다.

이 "추가"필드가 방해받지 않게 추가되는 것을 막을 방법이 있습니까?


2
명확히하기 위해 편집시 빈 필드가 표시되지 않기를 원하십니까? 다른 필드를 추가하려면 "다른 항목 추가"버튼을 사용해야합니까?
tim.plunkett

예, 당신은 그것을 완벽하게 이해했습니다.
Fidelix

@Fidelix,이 작업을 수행하는 모듈을 찾았습니까?
David Barratt

@DavidBarratt 사용자 정의 코드 만 두려워요.
Fidelix

답변:


10

이것은 모든 노드 편집 양식에서 작동합니다.

/**
 * Implements hook_form_BASE_FORM_ID_alter().
 */
function MYMODULE_form_node_form_alter(&$form, &$form_state, $form_id) {
  $field_name = 'field_YOURFIELD';

  if (empty($form[$field_name])) {
    return;
  }

  $field_language = $form[$field_name]['#language'];
  $max_delta = $form[$field_name][$field_language]['#max_delta'];
  unset($form[$field_name][$field_language][$max_delta]);
}

이 후크에 새로운 빈 필드를 "추가"할 수 있습니까?
Fidelix

이론적으로는 가능합니다. 같은 $form[$field_name][$field_language][$max_delta + 1] = $form[$field_name][$field_language][$max_delta];것이 효과가있을 수 있습니다.
tim.plunkett

이 솔루션에 문제가 있습니다. 값이없고 최대 델타가 0이고 다른 항목 추가를 클릭하면 추가 필드가 추가되지 않습니다. 다른 항목 추가를 다시 클릭하면 추가 필드가 추가됩니다. 이는 노드가 해당 필드에 대해 값이없는 경우 다른 항목을 추가 할 때 두 번 클릭해야 함을 의미합니다.
Ahmad

3

이것은 필드 이름을 지정하지 않아도 모든 노드 편집 양식에서 작동합니다.

/**
 * Implements hook_form_NODE_FORM_alter().
 */
function MY_MODULE_form_node_form_alter(&$form, &$form_state, $form_id) {
  if (isset($form['#node']->nid) && $form['#node']->nid > 0) {
    $form_fields = array_keys($form);

    foreach ($form_fields as $index => $field_name) {
      if (substr($field_name, 0, 6) == "field_") { // Check if the field is a custom field
        $field_language = $form[$field_name]['#language'];
        if (isset($form[$field_name][$field_language]['#cardinality']) && 
            $form[$field_name][$form[$field_name]['#language']]['#cardinality'] == -1) {

          if (empty($form[$field_name])) {
            continue;
          }

          $max_delta = $form[$field_name][$field_language]['#max_delta'];
          unset($form[$field_name][$field_language][$max_delta]);

        }
      }
    }

  }
}

나는 당신이 최고의 답변을 읽고 카디널리티를 확인할 수 있다고 생각하고 있었고 당신이 그것을 보았습니다!
jowan sebastian

필드 입력 만 제거하지 않으려면 (필드가 필요하지 않은 경우) :if ($max_delta > 0) { unset($form[$field_name][$field_language][$max_delta]); }
quotesBro

2

원하지 않는 필드를 제거하기 위해 hook_form_FORM_ID_alter 를 사용하여 고유 한 모듈을 작성할 수 있습니다 . 뭔가 ...

function my_module_form_FORM_ID_alter(&$form, &$form_state, $form_id) {
  // Do checks here to make sure this is an existing node...

  // Get the index of the last input element in this field
  $last_index = $form['field_field_name'][LANGUAGE_NONE]['#max_delta'];
  // Get rid of the last input element
  unset($form['field_field_name'][LANGUAGE_NONE][$last_index]);
  // Move back the last index so that any new elements are added correctly
  $form['field_field_name'][LANGUAGE_NONE]['#max_delta'] = $last_index-1;
}

0

현재 백엔드 관점에서 볼 수 없다면 다음 Jquery가 대안이 될 수 있습니다. 이 코드는 페이지가로드 될 때 첫 번째 대상 만 제거하고 사용자가 파일을 추가 할 때만 대상을 제거하므로 이미 파일이있을 때 문제가 발생하지 않습니다.

<script>
if(!$('div.filefield-file-info').length){
$('table#field_test_file_values tr.even:eq(0)').remove();
}
</script>

( bodypage.tpl.php 의 닫는 태그 앞에 넣기)

내 테스트에 따르면 이미지는 문제없이 업로드되며 노드를 편집하면 모든 파일이 나열됩니다.

참고 :이 예에서 'field_test_file'은 CCK 필드의 이름이므로 cck 필드의 이름에 따라 변경해야합니다.


CSS 솔루션에 대한 나의 의견은 여전히 ​​설명합니다 : PHP로 할 수 있는데 왜 그렇게합니까? 참조 drupal.stackexchange.com/questions/10481/...
tim.plunkett

안녕하십니까, 귀하의 관점을 이해할 수 있으며 경우에 따라 동의합니다. 틀린 것이 아니라면 CCK 파일 필드가 새로운 필드를 표시하기 위해 javascript를 사용하고 있으며 좋은 해결책입니다 (이 기능을 사용하지 않거나 javascript가없는 경우 두 번째 대안과 같이 백엔드 / PHP 방법이 가능합니다). 또한 동일한 요구 사항을 해결할 수있는 대안을 아는 것이 좋습니다.
cigotete
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.