Neodesílání formulářů v produkci

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
karfi
Člen | 21
+
0
-

Ahoj,
používám Nette 2.4 (bez nejnovějšího updatu), v lokální verzi webu vše funguje perfektně, jedu na PHP 7.0.14. Pro produkci využívám Wedos, PHP 7.0.8 a objevují se tam 2 problémy, které nedokážu trackovat.

Pro úpravu textu na stránce využívám CKEditor. Při vkládání delší tabulky do textu (kopirovani z google docs) se formulář neodešle, ale zřejmě se nedostane ani do stavu Submitted. Chyba se žádná nevypisuje, v logu nic neni, prostě jen problikne stránka a ta vkládaná tabulka z textu zmizí. Na localhostu to funguje bez problémů. Vůbec netušim, kde může být chyba.

Presenter:

public function createComponentEditPageForm ()
{
  $form = new Form ();
  $form->addProtection();
  $form -> addTextArea ( 'editor', 'Obsah stránky' )
      -> setDefaultValue ( $this -> content [ 0 ] [ 'content' ] )
      /*-> setAttribute ( 'class', 'ckeditor' )*/;
  $form -> addSubmit ( 'submit', 'Potvrdit' );
  $form -> onSuccess[] = [$this, 'editPageFormSubmitted'];

  return $form;
}

Sablona:

{block content}
{form editPageForm}
  <div class="form-group">
    <div class="col-sm-12">
      <textarea class="form-control" n:name="editor" placeholder="Vše co chcete o osobě sdělit." rows=20>{$form->getValues()['editor']}</textarea>
    </div>
    <script>
                // Replace the <textarea id="editor1"> with a CKEditor
                // instance, using default configuration.
            CKEDITOR.replace( 'editor',{
            } );
        </script>
  </div>
  <ul class="errors" n:if="$form->hasErrors()">
          <li n:foreach="$form->errors as $error">{$error}</li>
          </ul>
  <div class="form-group">
    <div class="col-sm-10">
      <input type="submit" class="btn btn-success" n:name="submit">
    </div>
  </div>
{/form}
{/block}

Druhý problém je při uploadu souborů. Na localhostu opět bez problémů, na produkci se formulář uploadu neodešle s chybou „An error occurred during file upload.“, z čehož mi není vůbec jasný, co se mohlo stát. Chová se to stejně, i když dám práva na onen adresář na 777.

public function createComponentUploadFileForm ()
    {
      $form = new Form();
      $form->addProtection();
      $form -> addGroup ( 'Nahrát nový soubor' );
      $form -> addText ( 'fileName', 'Zobrazovaný název souboru' )
          -> addRule ( Form::FILLED, 'Musí být vyplněn název souboru.' );
      $form -> addUpload ( 'newFile', 'Nahrát soubor:' )
          ->setRequired(TRUE);
      $form -> addCheckbox( 'resultsFile', 'Toto je výsledkový soubor (po zaškrnutí se bude zobrazovat v kategorii výsledky)');
      $form -> addSubmit ( 'upload', 'Nahrát' );

      $form -> onSuccess[] = [$this, 'uploadFileFormSubmitted'];

      return $form;
    }

    public function uploadFileFormSubmitted ( Form $form )
    {
      //if ( $form -> values -> newFile -> isOk () )
      //{
        if ( $this -> repository -> uploadFile ( $form -> values -> newFile, $form -> values -> fileName, $form -> values -> resultsFile, $this -> getUser () -> getIdentity () -> data [ 'username' ] ) != FALSE )
        {
          $this -> flashMessage ( "Soubor byl úspěšně nahrán.", "success" );
        }
        else
        {
          $this -> flashMessage ( "Soubor se nepodařilo nahrát.", "error" );
        }
      /*}
      else
      {
        $this -> flashMessage ( "Chybí přiložený soubor.", "success" );
      }*/
      $this -> redirect ( "Files:default" );
    }

Neví někdo, jak aspoň detekovat, co přesně se pokazilo? Tracy mi nic nehlásí, na lokální stanici vše v pohodě, requirements checker splňuje vše.

Editoval karfi (9. 1. 2017 23:30)

MW
Člen | 626
+
+1
-

Porovnal bych nejprve php.ini. (curl, max post a upload).

karfi
Člen | 21
+
+2
-

Nakonec to vypadá, že obě chyby byly způsobené chybějícím adresářem tmp na hostingu..

nettak2
Člen | 19
+
0
-

Dobry vecer,

mam podobny problem, ziadna chyba sa nevypisuje, iba sa preblikne stranka a nekomunikuje s DB a neviem v com by mohol byt problem. Dakujem za vsetky rady!

MODEL:

<?php

namespace App\Model;

use Nette;

/**
 * Users management.
 */
class ReservationModel extends Nette\Object {

    private $db = null;

    public function __construct($db) {
        $this->db = $db;
    }

    public function newReser($values) {
        /*try{
        $this->db->query("INSERT INTO rezervacia ", $values);
        } catch (\PDOException $e) {
            if ($e->getCode() != 23000) { ///vyjimka na SQ [23000]
                throw $e;
            }
        }*/

        $this->db->query("INSERT INTO rezervacia2 ", $values);
    }

}

PRESENTER:

<?php

namespace App\Presenters;

use Nette;
use App\Model;
use Nette\Application\UI;
use Nette\Application\UI\Form as Form;

/**
 * Reservation presenter.
 */
class ReservationPresenter extends BasePresenter {

    private $model = null;
    private $data = null;

    private function getModel() {
        if ($this->model == null) {
            $this->model = new Model\ReservationModel($this->context->getService("database"));
        }
        return $this->model;
    }

    /*public function renderDefault() {
        $this->template->anyVariable = 'any value';
    }*/

    protected function createComponentNewReservationForm() {
        $form = new UI\Form;
        $form->addText("prichod", "Príchod*:")
                ->setRequired("Datum je povinný údaj!")
                ->setAttribute("class", "dtpicker")
                ->setAttribute("placeholder", "dd.mm.rrrr")
                ->addRule($form::PATTERN, "Datum musí byt vo formáte dd.mm.rrrr");

        $form->addText("odchod", "Odchod*:")
                ->setRequired("Datum je povinný údaj!")
                ->setAttribute("class", "dtpicker")
                ->setAttribute("placeholder", "dd.mm.rrrr")
                ->addRule($form::PATTERN, "Datum musi byt vo formáte dd.mm.rrrr");

        $room = array(
            'izbaS' => 'Dvojlôžková izba so sprchou',
            'izbaBez' => 'Dvojlôžková izba bez sprchy',
            'apartman' => 'Apartmán s prísteľkom',
        );
        $form->addRadioList('typ_izby', 'Vyberte si typ izby:', $room)
                ->getSeparatorPrototype()->setName(NULL);

        $form->addText('email', 'E-mail*:')
                ->addCondition(Form::FILLED)
                ->addRule(Form::EMAIL, 'prosím zadejte korektní e-mailovou adresu');

        /*$form->addText('tel', 'Telefon:')
                ->addCondition(Form::FILLED) //pokud je telefon vyplněn
                ->addRule(Form::PATTERN, 'prosím zadejte korektní telefon', '^[+(]{0,2}[0-9 ().-]{9,}'); // pak musí odpovídat regularnímu výrazu
*/
        $form->addText('meno', 'Vaše meno:')
                ->setRequired("Vaše meno je povinný údaj");

        $form->addText('priezvisko', 'Vaše priezvisko:')
                ->setRequired("Vaše priezvisko je povinný údaj");

        $form->addTextArea('odkaz', 'Odkaz pre nás:');

        /*$form->addCheckbox('agree', 'Suhlasím s podmienkami')
                ->setRequired('Je potreba suhlasit s podmienkami');*/
             print_r("dahsjdhka");
        $form->addSubmit('rezervujsa', 'Rezervufdssdj');
        $form->onSuccess[] = array($this, 'newReservationFormSubmitted');
        print_r("hohoh");
        return $form;
    }

    public function newReservationFormSubmitted(UI\Form $form, $values) {
        print_r("dahsjdhka");
        $this->getModel()->newReser($values);
        $this->flashMessage('Rezervácia je úspešná.');
        $this->redirect('Reservation:vyberIzby');
    }
}

SABLONA:

{* Latte template *}

{block content}

<div  class="col-sm-offset-4">
    <h1 n:block=title>Rezervácia:</h1>
</div>
<form n:name="newReservationForm" class="form-horizontal">
    <div class="form-group">
        <label class="col-sm-4 control-label">Príchod:</label>
        <div class="col-sm-4">
            <input type="date" n:name="prichod" class="form-control" placeholder="dd.mm.rrrr">
        </div>
    </div>
    <div class="form-group">
        <label class="col-sm-4 control-label">Odchod:</label>
        <div class="col-sm-4">
            <input type="date" n:name="odchod" class="form-control" placeholder="dd.mm.rrrr">
        </div>
    </div>

    <div class="form-group">
        <label n:name="typ_izby" class="col-sm-4 control-label">Vyberte si typ izby:</label>

        {foreach $form[typ_izby]->items as $room => $label}
            <div class="col-sm-1">
                <label n:name="typ_izby:$room">
                    <div class="col-sm-4">
                        <input n:name="typ_izby:$room"> {$label}
                    </div>
                </label>
            </div>
        {/foreach}
    </div>
    <div class="form-group">
        <label class="col-sm-4 control-label">Email:</label>
        <div class="col-sm-4">
            <input type="email" n:name="email" class="form-control" placeholder="Email">
        </div>
    </div>
    <div class="form-group">
        <label class="col-sm-4 control-label">Meno:</label>
        <div class="col-sm-4">
            <input type="text" n:name="meno" class="form-control" placeholder="Meno">
        </div>
    </div>
    <div class="form-group">
        <label class="col-sm-4 control-label">Priezvisko:</label>
        <div class="col-sm-4">
            <input type="text" n:name="priezvisko" class="form-control" placeholder="Priezvisko">
        </div>
    </div>
    <div class="form-group">
        <label class="col-sm-4 control-label">Odkaz pre nás:</label>
        <div class="col-sm-4">
            <textarea n:name="odkaz" class="form-control" placeholder="Správa"></textarea>
        </div>
    </div>
    <div class="col-sm-offset-4 col-sm-4">
        <button type="submit" n:name='rezervujsa' class="btn btn-primary">Rezerfffvovať</button>
    </div>
</form>
CZechBoY
Člen | 3608
+
0
-

@nettak2 vypiš si errory

btw. používej dependency injection (tzn. vyvaruj se používání $this->context v presenteru)

nettak2
Člen | 19
+
0
-

@CZechBoY Diky za odpisanie, ale mozem vediet konkretny problem ? Preco mi to nefunguje normalne a registracia mi ide cize DB by mala byt pripojena. Sorry, ale som zaciatocnik.

CZechBoY
Člen | 3608
+
0
-

Do tvorby formulare pridej (pred return $form) vypis erroru treba takhle

$form->onError[] = function() use ($form) {
    dump($form->getErrors());
};
nettak2
Člen | 19
+
0
-

@CZechBoY diky uz som nasiel chybu.. robilo mi to neplechu s

->addRule($form::PATTERN, "Datum musi byt vo formáte dd.mm.rrrr");

type=„date“ mi robil iny format ako som pozadoval.

GEpic
Člen | 566
+
0
-

nettak2 napsal(a):

@CZechBoY diky uz som nasiel chybu.. robilo mi to neplechu s

->addRule($form::PATTERN, "Datum musi byt vo formáte dd.mm.rrrr");

type=„date“ mi robil iny format ako som pozadoval.

type=„date“ nepoužívat – používat stále type=„text“ na všechno a hlídat si vstupy – důvod – Firefox ani IE to nepodporují

PS:

->addRule($form::PATTERN, "Datum musi byt vo formáte dd.mm.rrrr");

… ti nemohlo fungovat, protože ti chybí třetí parametr, a to ten Pattern, viz. dokumentace

A doporučení na závěr, pokud už používáte bootstrap, a jde vám o user experience, používejte nějaký datepicker – je pravidlem že lidé neumí formuláře vyplňovat… PRAVIDLEM :) … setup je easy – bootstrap datepicker

Editoval GEpic (17. 1. 2017 3:38)