it-swarm.com.de

Wie kann ich dem Formular zum Hinzufügen von Inhalten für einen einzelnen Inhaltstyp eine Schaltfläche zum Abbrechen hinzufügen?

Ich habe mehrere Inhaltstypen auf einer Website und die meisten davon können vom Benutzer bearbeitet, aber nicht vom Benutzer erstellt werden. Mit einem Inhaltstyp Image können Benutzer jedoch ein Bild hochladen. Manchmal laden Benutzer jedoch das falsche Bild hoch und geraten in Panik, weil sie nicht möchten, dass dieses Bild an die Site gesendet wird.

Natürlich könnten sie immer auf die Schaltfläche zurück des Browsers klicken, aber ich möchte eine Schaltfläche Abbrechen hinzufügen Sicherheit.

Ich fand dieser Thread, der verschiedene Lösungen zum Hinzufügen von Abbruchschaltflächen auf Drupal.org bietet sowie diese Funktionsanforderung zum Hinzufügen einer Abbruchschaltfläche zu D8 . Es gibt jedoch verschiedene allgemeine Ansätze, und ich weiß nicht, wie ich einen auf einen bestimmten Inhaltstyp beschränken soll (in diesem Fall my_image).

4
Patrick Kenny

Ich würde den folgenden Code verwenden.

function mymodule_form_my_image_node_form_alter(&$form, &$form_state) {
  // If the node is being created, redirect the users to the page where
  // they can choose the content type for a new node; otherwise, redirect
  // them to the page showing the node.
  $destination = (!isset($node->nid) || isset($node->is_new)) ? 'node/add' : "node/{$node->nid}";

  $form['actions']['cancel'] = array(
    '#markup' => l(t('Cancel'), $destination),
    '#weight' => 20,
  );
}  

Anmerkungen

  • Markup ist der Standardtyp des Formularelements. Es ist nicht erforderlich, #type = 'markup' zu verwenden.

  • Im Knotenbearbeitungsformular befinden sich alle Schaltflächen in $form['actions']. Die von den Schaltflächen, die das Formular verwendet, verwendeten Gewichte sind 5 (Speichern), 10 (Vorschau) und 15 (Löschen). Ich habe 20 verwendet, um den Link nach diesen Schaltflächen anzuzeigen, aber Sie können sein Gewicht ändern, um ihn an einer anderen Position anzuzeigen.

    // Add the buttons.
    $form['actions'] = array('#type' => 'actions');
    $form['actions']['submit'] = array(
      '#type' => 'submit', 
      '#access' => variable_get('node_preview_' . $node->type, DRUPAL_OPTIONAL) != DRUPAL_REQUIRED || (!form_get_errors() && isset($form_state['node_preview'])), 
      '#value' => t('Save'), 
      '#weight' => 5, 
      '#submit' => array('node_form_submit'),
    );
    $form['actions']['preview'] = array(
      '#access' => variable_get('node_preview_' . $node->type, DRUPAL_OPTIONAL) != DRUPAL_DISABLED, 
      '#type' => 'submit', 
      '#value' => t('Preview'), 
      '#weight' => 10, 
      '#submit' => array('node_form_build_preview'),
    );
    if (!empty($node->nid) && node_access('delete', $node)) {
      $form['actions']['delete'] = array(
        '#type' => 'submit', 
        '#value' => t('Delete'), 
        '#weight' => 15, 
        '#submit' => array('node_form_delete_submit'),
      );
    }
    
  • Es ist nicht erforderlich, arg() zu verwenden, um zu verstehen, ob das Formular zum Bearbeiten eines vorhandenen Knotens oder zum Erstellen eines neuen Knotens dient. Ich habe überprüft, ob !isset($node->nid) || isset($node->is_new)TRUE ist, um zu überprüfen, ob der Knoten erstellt wird. Drupal scheint einfach empty($node->nid) zu überprüfen, obwohl node_object_prepare ()!isset($node->nid) || isset($node->is_new) verwendet.

  • Wenn $_GET['destination'] Gesetzt ist, zeigt der mit l() hinzugefügte Link auf diesen Pfad.

10
kiamlaluno

Jedes Knotenformular hat eine eigene eindeutige ID. Es besteht aus dem Computernamen des Knotentyps, gefolgt von _node_form. Also dein my_image Die Formular-ID des Knotentyps lautet my_image_node_form

Hier ist eine ungetestete Scheinfunktion (D6) zur Veranschaulichung der Implementierung:

function HOOK_form_alter(&$form, &$form_state, $form_id) {
  $types = array(
    'my_image',
  );

  foreach($types as $type) {
    if($type.'_node_form' == $form_id) {
      if(arg(1) == 'add') {
        // If adding node link to node/add screen
        $link = l(t('Cancel'), 'node/add');
      }
      elseif(arg(2) == 'edit') {
        // If editing node, link to node view screen
        $link = l(t('Cancel'), 'node/'.arg(1));
      }
      $form['cancel'] = array(
        '#type' => 'markup',
        '#value' => $link,
        '#weight' => 0,
      );
    }
  }
}

Wenn Sie Drupal 7) verwenden, ändern Sie #value auf dem Array zu #markup.

7
Beebee

Alle diese Lösungen dienen zum Hinzufügen von Abbrechen Link nicht Schaltfläche!

Wenn Sie die Schaltfläche anstelle eines Links hinzufügen möchten, sollten Sie diesen Code für das Modul cancel_button.module Verwenden:

function cancel_button_form_alter(&$form, &$form_state, $form_id) {
    // node types for which Cancel button should be added
    $types = array(
      'biography',
      'faq',
      'draftlaw',
      'vocabulary',
      'draftlaw_page',
      'encyclopedia',
      'user', // if you want to add user's edit form too
    );

    foreach($types as $type) {
        if($type.'_node_form' == $form_id || $type.'_profile_form' == $form_id) {
            $form['actions']['cancel'] = array(
                '#type'   => 'submit',
                '#value'  => t('Cancel'),
                '#access' => TRUE,
                '#weight' => 55,
                '#submit' => array('cancel_button_form_cancel', 'node_form_submit_build_node'),
                '#limit_validation_errors' => array(),
                );
            }
        }
    }

    /**
     * cancel_button callback.
     */
    function cancel_button_form_cancel($form, &$form_state) {
        $link = '';
        $path = 'node';
        if('user_profile_form' == $form['#form_id']){
            $path = 'user';
        }
        if(arg(1) == 'add') {
            // If adding entity link to [user|node]/add screen
            $link = $path . '/add';
        }
        elseif(arg(2) == 'edit') {
            // If editing entity, link to node view screen
            $link = $path . '/' . arg(1);
        }
        $url = $_GET['destination'] ? $_GET['destination'] : $link;
        drupal_goto($url);
    }
7
function mymodule_form_my_image_node_form_alter(&$form, &$form_state) {
  // If the node is being created, redirect the users to the page where
  // they can choose the content type for a new node; otherwise, redirect
  // them to the page showing the node.
  $destination = (!isset($node->nid) || isset($node->is_new)) ? 'node/add' : "node/{$node->nid}";

  $form['actions']['cancel'] = array(
    '#markup' => l(t('Cancel'), $destination),
    '#weight' => 20,
  );
}  
1
Das

Dafür gibt es ein Modul!: http://drupal.org/project/nodeformsettings ... und dieses Modul ist wirklich fantastisch. Ein Besuch lohnt sich.

0
LarS