无限值字段-如何在节点编辑时隐藏额外的字段


9

创建新节点时,我可以使用“添加新项”按钮添加此无限值字段。

无限值字段-新节点

没关系,太好了。但是,当我编辑现有节点时,会为我添加一个不需要的空的额外值: 无限值字段-编辑节点

我的真实案例是一个大的复合字段,但我认为以这个小字段为例会更容易理解。

我有什么办法防止这种“额外”字段被强行添加?


2
为了澄清,您是否希望在编辑时不显示空白字段?因此,要添加另一个字段,他们将被迫使用“添加另一个项目”按钮吗?
tim.plunkett 2011年

是的,您完全理解。
Fidelix 2011年

@Fidelix,您是否找到了执行此操作的模块,或者此时仅找到自定义代码?
大卫·巴拉特

恐怕@DavidBarratt只有自定义代码。
Fidelix

Answers:


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

从理论上讲,您可以。喜欢的东西$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,则可以使用backend / php方法,就像第二种方法一样)。另外,我认为知道解决相同要求的替代方法也很好。
cigotete 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.