Sınırsız değerler alanı - düğüm düzenlemesinde ekstra alan nasıl gizlenir


9

Yeni bir düğüm oluştururken, "Yeni öğe ekle" düğmesiyle bu sınırsız değerler alanına sahibim.

Sınırsız Değerler alanı - Yeni Düğüm

Tamam, harika. Ancak mevcut bir düğümü düzenlediğimde, benim için UNDESIRED boş bir ekstra değer ekliyorum : Sınırsız Değerler alanı - Düğümü Düzenle

Gerçek durumum büyük bir bileşik alanla ilgili, ancak bu küçük alanı örnek olarak kullanmanın daha kolay olacağını düşündüm.

Ben bu "ekstra" alan müdahaleci eklenmesini önlemek için herhangi bir yolu var mı?


2
Açıklığa kavuşturmak için, düzenleme sırasında boş bir alan olmamasını mı istiyorsunuz? Başka bir alan eklemek için, "Başka bir öğe ekle" düğmesini kullanmak zorunda kalırlar mı?
tim.plunkett

Evet, mükemmel anladın.
Fidelix

@Fidelix, bunu yapmak için bir modül veya bu noktada yalnızca özel kod buldunuz mu?
David Barratt

@DavidBarratt sadece özel kod, korkarım.
Fidelix

Yanıtlar:


10

Bu, tüm düğüm düzenleme formları için işe yarar:

/**
 * 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]);
}

Bu kancaya yeni bir boş alan eklemek "mümkün" mü?
Fidelix

Teorik olarak, yapabilirsiniz. Gibi bir şey $form[$field_name][$field_language][$max_delta + 1] = $form[$field_name][$field_language][$max_delta];işe yarayabilir.
tim.plunkett

Bu çözümde bir sorun var. Değer yoksa ve maksimum delta 0 ise ve başka bir öğe ekle'yi tıklarsanız, fazladan alan eklemez. daha sonra başka bir öğe eklemek için tekrar tıkladığınızda ekstra alan ekleyecektir. Düğümün bu alana karşı değeri yoksa, başka bir öğe eklemek için çift tıklama gerektiği anlamına gelir.
Ahmad

3

Bu, alan adlarını belirtmeden tüm düğüm düzenleme formları için işe yarar.

/**
 * 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]);

        }
      }
    }

  }
}

Sadece üst cevabı okuyarak kardinaliteyi kontrol edebileceğini düşünüyordum, sonra yaptığını gördüm!
jowan sebastian

Tek alan girişini kaldırmaktan kaçınmak için (alan gerekli değilse):if ($max_delta > 0) { unset($form[$field_name][$field_language][$max_delta]); }
quotesBro

2

İstenmeyen alanı kaldırmak için hook_form_FORM_ID_alter ile kendi modülünüzü yazabilirsiniz . Gibi bir şey...

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

bir arka uç perspektifinden şimdilik mümkün değilse, bir alternatif aşağıdaki Jquery olabilir. Bu kod, sayfa yüklendiğinde yalnızca ilk hedefi kaldıracak ve yalnızca kullanıcı dosya eklediğinde hedefi kaldıracağından, zaten dosyalarınız olduğunda sorun yaşamayacaksınız:

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

( bodysayfanızın kapanış etiketinin önüne koyun . tpl.php)

Testime göre, görüntüler sorunsuz yüklenir ve düğümü düzenlediğinizde tüm dosyalar listelenir.

not: bu örnekte 'field_test_file' CCK alanının adıdır, bu nedenle cck alanınızın adına göre değiştirmeyi unutmayın.


CSS çözümünüz hakkındaki yorumum hala geçerli: PHP ile yapabildiğinizde neden bunu yapıyorsunuz? Bkz. Drupal.stackexchange.com/questions/10481/…
tim.plunkett

Merhaba Tim, bakış açınızı anlayabiliyorum ve bazı durumlarda katılıyorum. Yanlış değilse, CCK dosya alanlarının yeni alanları göstermek için javascript kullandığını ve iyi bir çözüm olduğunu tahmin ediyorum (Bu özelliği devre dışı bırakırsanız veya javascript yoksa, ikinci alternatif gibi arka uç / php yolu mümkündür). Ayrıca, aynı gereksinimi çözmek için alternatifleri bilmek iyi olur.
cigotete
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.