Feld mit unbegrenzten Werten - Ausblenden eines zusätzlichen Felds bei der Knotenbearbeitung

9

Beim Erstellen eines neuen Knotens habe ich dieses Feld mit unbegrenzten Werten mit der Schaltfläche "Neues Element hinzufügen".

Feld Unbegrenzte Werte - Neuer Knoten

Das ist in Ordnung, wunderbar. Wenn ich jedoch einen vorhandenen Knoten bearbeite, erhalte ich einen unerwünschten leeren zusätzlichen Mehrwert für mich: Feld Unbegrenzte Werte - Knoten bearbeiten

Mein wirklicher Fall ist ein großes zusammengesetztes Feld, aber ich dachte, dieses kleine Feld als Beispiel zu verwenden, wäre leichter zu verstehen.

Gibt es eine Möglichkeit zu verhindern, dass dieses "zusätzliche" Feld aufdringlich hinzugefügt wird?

Fidelix
quelle
2
Zur Verdeutlichung möchten Sie, dass beim Bearbeiten kein leeres Feld angezeigt wird? Um ein weiteres Feld hinzuzufügen, müssten sie die Schaltfläche "Ein weiteres Element hinzufügen" verwenden.
tim.plunkett
Ja, du hast es perfekt verstanden.
Fidelix
@Fidelix, haben Sie ein Modul dafür gefunden oder zu diesem Zeitpunkt nur benutzerdefinierten Code?
David Barratt
@ DavidBarratt nur benutzerdefinierten Code, fürchte ich.
Fidelix

Antworten:

10

Dies würde für alle Knotenbearbeitungsformulare funktionieren:

/**
 * 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]);
}
tim.plunkett
quelle
Ist es möglich, ein neues leeres Feld in diesem Hook "hinzuzufügen"?
Fidelix
Theoretisch könnte man. So etwas $form[$field_name][$field_language][$max_delta + 1] = $form[$field_name][$field_language][$max_delta];könnte funktionieren.
tim.plunkett
Bei dieser Lösung liegt ein Problem vor. Wenn es keinen Wert gibt und das maximale Delta 0 ist und Sie auf ein weiteres Element hinzufügen klicken, wird kein zusätzliches Feld hinzugefügt. Wenn Sie dann erneut auf Ein weiteres Element hinzufügen klicken, wird ein zusätzliches Feld hinzugefügt. Dies bedeutet, dass ein Doppelklick erforderlich ist, um ein weiteres Element hinzuzufügen, wenn der Knoten keinen Wert für dieses Feld hat.
Ahmad
3

Dies würde für alle Knotenbearbeitungsformulare funktionieren, ohne die Feldnamen anzugeben.

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

        }
      }
    }

  }
}
Vikas
quelle
Ich dachte nur, Sie könnten die Kardinalität überprüfen, indem Sie die oberste Antwort lesen und dann sehen, dass Sie es getan haben!
Jowan Sebastian
Um zu vermeiden, dass die einzige if ($max_delta > 0) { unset($form[$field_name][$field_language][$max_delta]); }
Feldeingabe entfernt wird
2

Sie können Ihr eigenes Modul mit einem hook_form_FORM_ID_alter schreiben , um das unerwünschte Feld zu entfernen. Etwas wie...

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;
}
nmc
quelle
0

Wenn dies aus Backend-Sicht derzeit nicht möglich ist, könnte eine Alternative die folgende Jquery sein. Dieser Code entfernt nur das erste Ziel, wenn die Seite geladen wird, und entfernt das Ziel nur, wenn der Benutzer Dateien hinzufügt, sodass Sie keine Probleme haben, wenn Sie bereits Dateien haben:

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

(vor das bodyschließende Tag Ihrer page.tpl.php setzen)

Nach meinem Test werden die Bilder ohne Probleme hochgeladen, und wenn Sie den Knoten bearbeiten, werden alle Dateien aufgelistet.

Hinweis: In diesem Beispiel ist 'field_test_file' der Name des CCK-Felds. Denken Sie also daran, den Namen Ihres cck-Felds zu ändern.

cigotete
quelle
Mein Kommentar zu Ihrer CSS-Lösung lautet weiterhin: Warum tun Sie dies, wenn Sie dies mit PHP tun könnten? Siehe drupal.stackexchange.com/questions/10481/…
tim.plunkett
Hallo Tim, ich kann Ihren Standpunkt verstehen und stimme in einigen Fällen zu. Wenn ich mich nicht irre, denke ich, dass CCK-Dateifelder Javascript verwenden, um neue Felder anzuzeigen, und ist eine gute Lösung (Wenn Sie diese Funktion deaktivieren oder kein Javascript haben, ist der Backend / PHP-Weg wie eine zweite Alternative möglich). Ich denke auch, dass es gut ist, Alternativen zu kennen, um die gleiche Anforderung zu lösen.
Cigotete