Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision a6ed938f

Von Moritz Bunkus vor fast 8 Jahren hinzugefügt

  • ID a6ed938f30a84e83a62432aa8ecd10f057efe677
  • Vorgänger 69e526ee
  • Nachfolger 7f5edaa6

Dateimanagement: Fehler beim Umbenennen richtig zurückgeben

Ist man z.B. bei den Artikelstammdaten und versucht, eine Datei
umzubenennen, und ändert den Namen nicht, so sollte eine Fehlermeldung
angezeigt werden. Wurde sie aber nicht, weil Folgendes passierte:

• Im ClientJS-Flash wird Fehlermeldung erzeugt und das ClientJS sofort
gerendert, anschließend mit »return« der innerste Block verlassen
• Der innerste Block ist aber ein »eval { … }«, und nicht die Funktion
selber. Daher geht der Kontrollfluss nach dem »eval« weiter. Dabei
werden mehr Sachen auf das ClientJS raufgepusht und aschließend
erneut gerendert.

Dieses zweite Rendern schreibt dann erneut HTTP-Response-Zeilen sowie
ein vollständiges Array von ClientJS-Aktionen.

Der JavaScript-Code auf der Browser-Seite bekommen somit:

• HTTP-Response-Zeilen #1
• ClientJS-Array #1
• HTTP-Response-Zeilen #2
• ClientJS-Array #2

Damit kann er natürlich nicht umgehen, ignoriert die komplette
Antwort, und die Fehlermeldung wird somit nicht angezeigt.

Der Fix ist, nur das Umbenennen innerhalb des »eval« zu machen, und
den Rückgabewert außerhalb des »eval« zu prüfen. Bei einem anderen
Wert als SL::File::RENAME_OK wird das ClientJS dann nur einmal
gerendert und anschließend die Funktion verlassen.

Unterschiede anzeigen:

SL/Controller/File.pm
173 173

  
174 174
  } else {
175 175
    # normal rename
176
    my $res;
177

  
176 178
    eval {
177
      my $res = $file->rename($::form->{to});
179
      $res = $file->rename($::form->{to});
178 180
      $main::lxdebug->message(LXDebug->DEBUG2(), "rename result=".$res);
179
      if ($res > SL::File::RENAME_OK) {
180
        $self->js->flash('error',
181
                         $res == SL::File::RENAME_EXISTS      ? $::locale->text('File still exists !')
182
                       : $res == SL::File::RENAME_SAME        ? $::locale->text('Same Filename !')
183
                       :                                        $::locale->text('File not exists !'))->render;
184
        return 1;
185
      }
186 181
      1;
187 182
    } or do {
188 183
      $self->js->flash(       'error', t8('internal error (see details)'))
189 184
               ->flash_detail('error', $@)->render;
190 185
      return;
186
    };
187

  
188
    if ($res != SL::File::RENAME_OK) {
189
      $self->js->flash('error',
190
                         $res == SL::File::RENAME_EXISTS ? $::locale->text('File still exists !')
191
                       : $res == SL::File::RENAME_SAME   ? $::locale->text('Same Filename !')
192
                       :                                   $::locale->text('File not exists !'))
193
        ->render;
194
      return;
191 195
    }
192 196
  }
193 197
  $self->is_global($::form->{is_global});

Auch abrufbar als: Unified diff