it-swarm.com.de

Ajax-Übermittlung führt zu => Ein nicht behebbarer Fehler ist aufgetreten. Die hochgeladene Datei hat wahrscheinlich die maximale Dateigröße (2 MB) überschritten, die dieser Server unterstützt

Ich versuche also, ein Formular mit Ajax einzureichen. In meinem Formular habe ich Folgendes:

        $form['actions']['#type'] = 'actions';
        $form['actions']['submit'] = array(
        '#type' => 'submit',
        '#value' => $this->t('OK'),
        '#button_type' => 'primary',
        '#prefix' => '<div class="tc btn_pay relative">',
        '#suffix' => '</div>
                        </div>',
        '#attributes' => array(
            'class' => array('proximabold', 'tc', 'transition', 'no-underline', 'ph3', 'pv2', 'mb2', 'dib', 'white'),
        ),
        '#ajax' => [
            'event' => 'click',
            'callback' => '::updateTable',
            'wrapper' => 'table-wrapper',
            'progress' => [
                'type' => 'throbber',
                'message' => t('Verifying entry...'),
            ],
        ],
    );

und eine einfache updateTable-Funktion:

public function updateTable(array $form, FormStateInterface $form_state) {
    return "Hello World";
}

Wenn ich jedoch auf "Senden" klicke, wird folgende Fehlermeldung angezeigt: Ein nicht behebbarer Fehler ist aufgetreten. Die hochgeladene Datei hat wahrscheinlich die maximale Dateigröße (2 MB) überschritten, die dieser Server unterstützt.

Ich wusste, dass der Fehler serverseitig ist (vielleicht irre ich mich), also ging ich zu php.ini (ich benutze PHP7) und aktualisiere die folgenden Zeilen:

post_max_size = 6144M
memory_limit = 6144M
upload_max_filesize = 6144M
max_file_uploads = 1000

ohne Glück sollte diese Konfiguration jedoch nicht erforderlich sein, da die Anforderungsgröße nur 1,5 KB beträgt

Nach einem umfassenden Debugging habe ich endlich die Lösung gefunden. Als erstes habe ich nach dem Fehler gesucht und er wurde ausgegeben von core/lib/Drupal/Core/Form/EventSubscriber/FormAjaxSubscriber.php :: wihtin finden wir eine Bedingung, die uns interessiert:

if ($exception instanceof BrokenPostRequestException && $request->query->has(FormBuilderInterface::AJAX_FORM_REQUEST)) {
  $this->drupalSetMessage($this->t('An unrecoverable error occurred. The uploaded file likely exceeded the maximum file size (@size) that this server supports.', ['@size' => $this->formatSize($exception->getSize())]), 'error');
  $response = new AjaxResponse();
  $status_messages = ['#type' => 'status_messages'];
  $response->addCommand(new ReplaceCommand(NULL, $status_messages));
  $response->headers->set('X-Status-Code', 200);
  $event->setResponse($response);
  return;
}

Der Fehler wird also ausgelöst, wenn eine von der BrokenPostRequestException-Klasse initiierte Ausnahme aufgetreten ist.

und jetzt, wenn wir zu Core/lib/Drupal/Core/Form/FormBuilder.php gelangen, stellen wir fest, dass diese Ausnahme ausgelöst wird, wenn die Post-Anfrage größer ist als vom Server zugelassen und auch wenn die Anfrage das Formular nicht enthält Ich würde.

if ($ajax_form_request && !$request->request->has('form_id')) {
  throw new BrokenPostRequestException($this->getFileUploadMaxSize());
}

Es wäre besser gewesen, wenn es für diesen Fall eine andere Ausnahme gegeben hätte, als den gleichen Fehler zu erhalten, wenn die Post-Anfrage die konfigurierte zulässige Größe überschreitet (post_max_size).

nun, in meinem Fall ging es nicht um die Anforderung der Postgröße, sondern als ich das Formular in meiner Datei twig) thematisierte, habe ich die Formular-ID nicht angegeben.

Also habe ich die Zeilen hinzugefügt, die unten hervorgehoben sind:

<div class="fr relative filtrehold">
        <div class="filtr_btn  br-pill shadow-2 ttu dark-gray f5 proximabold">Filtres</div>
        <form> //Added this one
            {{ McRefund_build_data.filterform.form_build_id }} //Added this one
            {{ McRefund_build_data.filterform.form_id }} //Added this one
            {{ McRefund_build_data.filterform.RelevesMensuels }}
            {{ McRefund_build_data.filterform.from }}
            {{ McRefund_build_data.filterform.to }}
            {{ McRefund_build_data.filterform.example_select }}
            {{ McRefund_build_data.filterform.actions.submit }}
        </form> //Added this one
</div>
<div class="table_hold bg-white br2">

    <div id="table-wrapper">

        {% for Num_refund,refund in McRefund_build_data.filterform.RefundsContainer['Refunds']['#Refunds_data'] %}
                   ............
                   ............
                   ............
        {% endfor %}
    </div>
</div>

Aufgrund einer identischen Fehlermeldung (" Ein nicht behebbarer Fehler ist aufgetreten. Die hochgeladene Datei hat wahrscheinlich die maximale Dateigröße überschritten, die dieser Server unterstützt ") In einem Projekt, das auf Drupal 8) basiert, habe ich gerade eine dritte Verwendung derselben oben diskutierten Ausnahme entdeckt. In meinem Fall wurde die Ausnahme ausgelöst, indem die Grenze der zulässigen Variablen in erreicht wurde die php.ini Datei.

  1. Öffnen Sie die Datei -> vim /etc/php/7.2/Apache2/php.ini
  2. Suchen Sie die Zeile ->/max_input_vars/n
  3. Kommentieren Sie die Zeile aus und setzen Sie -> max_input_vars = 3000
  4. Starten Sie Apache neu -> Sudo /etc/init.d/Apache2 Neustart

(max_input_vars in php.ini

Meine zwei Cent.

3
davidjguru