無制限の値フィールド-ノード編集で余分なフィールドを非表示にする方法


9

新しいノードを作成するとき、「無制限の値」フィールドに「新しい項目の追加」ボタンがあります。

無制限の値フィールド-新しいノード

大丈夫です。しかし、既存のノードを編集すると、UNDESIRED空の追加の値が追加されます。 無制限の値フィールド-ノードの編集

私の本当のケースは大きな複合フィールドの場合ですが、例としてこの小さなフィールドを使用すると理解しやすいと思いました。

この「追加」フィールドが侵入的に追加されるのを防ぐ方法はありますか?


2
明確にするために、編集時に空のフィールドが表示されないようにしますか?別のフィールドを追加するには、「別のアイテムを追加」ボタンを使用する必要がありますか?
tim.plunkett、2011

はい、あなたはそれを完全に理解しました。
Fidelix、2011

@Fidelix、これを行うモジュール、またはこの時点でカスタムコードのみを見つけましたか?
David Barratt

@DavidBarrattはカスタムコードのみです。
Fidelix、2015年

回答:


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、2011

このソリューションには問題があります。値がなく、最大デルタが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 2014年

唯一のフィールド入力の削除を回避するには(フィールドが必要ない場合):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>

bodyあなたのpage.tpl.phpの終了タグの前に置く)

私のテストによると、画像は問題なくアップロードされ、ノードを編集するとすべてのファイルがリストされます。

注:この例では、「field_test_file」はCCKフィールドの名前なので、cckフィールドの名前に応じて変更することを忘れないでください。


CSSソリューションに関する私のコメントはまだ残っています。PHPで実行できるのに、なぜこれを行うのですか?drupal.stackexchange.com/questions/10481/…を
tim.plunkett

こんにちは、ティム。あなたの考えを理解することができ、場合によっては同意します。間違いではない場合、CCKファイルのフィールドは新しいフィールドを表示するためにJavaScriptを使用していると思います。これは良い解決策です(この機能を無効にするか、JavaScriptがない場合は、2番目の代替方法のようにバックエンド/ phpの方法が可能です)。また、同じ要件を解決するための代替案を知ることは良いことだと思います。
cigotete '09
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.