NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Upload obrázku v továrničke na formulár

Aktivity
Avatar
Dominik Gavrecký:2.2.2017 18:14

Ahojte kolegovia,

pri práci s Nette som natrafil na jeden problém, s ktorým si už druhý deň neviem pomôcť sám. Preto som sa rozhodol že vás skúsim poprosiť o pomoc.

Vytvoril som si formulár ktorý následne predávam do presenteru. Problém nastal v momente keď som sa pokúsil pridať upload a jeho následne spracovanie. Nedokážem nejako predať context do formulára.

<?php
/**
 * Created by PhpStorm.
 * User: Dominik
 * Date: 30.1.2017
 * Time: 21:32
 */

namespace App\Modules\AdminModule\Forms;

use Model\Facades\SectionFacade;
use Nette\Application\UI\Form;
use Nette\Http\Context;
use Nette\Utils\Image;

class SectionFormFactory
{
    const IMAGE_URL = '/project/img/section/';

    /** @var FormFactory */
    private $factory;

    /** @var SectionFacade */
    private $sectionFacade;

    /**
     * SectionFormFactory constructor.
     * @param FormFactory $factory
     * @param SectionFacade $sectionFacade
     */
    public function __construct(FormFactory $factory, SectionFacade $sectionFacade)
    {
        $this->factory = $factory;
        $this->sectionFacade = $sectionFacade;
    }


    /**
     * @param callable $onSuccess
     * @return Form
     */
    public function create(callable $onSuccess)
    {
        $form = $this->factory->create();

        $form->addText('title', 'Titulok:')
            ->setRequired('Prosím vložte titulok.');

        $form->addUpload('image_url')
            ->addCondition(Form::FILLED)
            ->addRule(Form::IMAGE, 'Soubor musí být JPEG, PNG nebo GIF.');

        $form->addSubmit('submit', 'Pridať novú sekciu');

        $form->onSuccess[] = function (Form $form, array $values) use ($onSuccess) {

            if ($values['image_url']->isImage() and $values['image_url']->isOk()) {
                $file = $values['image_url']; //Prehodenie do $file
                $file_name = $file->getSanitizedName();
                $file->move($this->context->parameters['wwwDir'] . $this::IMAGE_URL . $file_name);
                $image = Image::fromFile($this->context->parameters['wwwDir'] . $this::IMAGE_URL . $file_name);
                $image->resize(128, 128, Image::EXACT);
                $image->sharpen();
                $image->save($this->context->parameters['wwwDir'] . $this::IMAGE_URL . $file_name);
                $values['image_url'] = $file_name;
            }

            $onSuccess();
        };
        return $form;
    }


}

Ak to nechám tak ako to je hore chybová hláška : Call to undefined function Nette\Http\fin­fo_file().

Ak pridám závislosť cez konštruktor na use Nette\Http\Context; chybová hláška Service http.context is deprecated.

<?php
/**
 * Created by PhpStorm.
 * User: Dominik
 * Date: 30.1.2017
 * Time: 21:32
 */

namespace App\Modules\AdminModule\Forms;

use Model\Facades\SectionFacade;
use Nette\Application\UI\Form;
use Nette\Http\Context;
use Nette\Utils\Image;

class SectionFormFactory
{
    const IMAGE_URL = '/project/img/section/';

    /** @var FormFactory */
    private $factory;

    /** @var SectionFacade */
    private $sectionFacade;

    /** @var Context */
    private $context;

    /**
     * SectionFormFactory constructor.
     * @param FormFactory $factory
     * @param SectionFacade $sectionFacade
     * @param Context $context
     */
    public function __construct(FormFactory $factory, SectionFacade $sectionFacade, Context $context)
    {
        $this->factory = $factory;
        $this->sectionFacade = $sectionFacade;
        $this->context = $context;
    }


    /**
     * @param callable $onSuccess
     * @return Form
     */
    public function create(callable $onSuccess)
    {
        $form = $this->factory->create();

        $form->addText('title', 'Titulok:')
            ->setRequired('Prosím vložte titulok.');

        $form->addUpload('image_url')
            ->addCondition(Form::FILLED)
            ->addRule(Form::IMAGE, 'Soubor musí být JPEG, PNG nebo GIF.');

        $form->addSubmit('submit', 'Pridať novú sekciu');

        $form->onSuccess[] = function (Form $form, array $values) use ($onSuccess) {

            if ($values['image_url']->isImage() and $values['image_url']->isOk()) {
                $file = $values['image_url']; //Prehodenie do $file
                $file_name = $file->getSanitizedName();
                $file->move($this->context->parameters['wwwDir'] . $this::IMAGE_URL . $file_name);
                $image = Image::fromFile($this->context->parameters['wwwDir'] . $this::IMAGE_URL . $file_name);
                $image->resize(128, 128, Image::EXACT);
                $image->sharpen();
                $image->save($this->context->parameters['wwwDir'] . $this::IMAGE_URL . $file_name);
                $values['image_url'] = $file_name;
            }

            $onSuccess();
        };
        return $form;
    }


}

Veľmi pekne ďakujem za každú radu a príjemný večer.

Odpovědět
2.2.2017 18:14
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Dominik Gavrecký
Jindřich Máca:2.2.2017 18:36

Ahoj, ten kód se mi takhle po prvním rychlém zhlédnutí jeví v pořádku a pokud ta chyba naskočila až po přidání upload pole do formuláře, tak to podle mě s kontextem vůbec nesouvisí. :)

Když člověk vyhledá onu chybu, najde její pravděpodobný původ, což bude nejspíše i Tvůj případ:

Nette od 2.2 závisí pro detekování typu uploadovaných souborů na rozšíření Fileinfo. To je od 5.3 součástí PHP, asi ho tedy jenom nemáš povolené.

Tady je pak oficiální návod na instalaci daného rozšíření - http://php.net/…allation.php ;)

Doporučuji tedy použít to první, zde uvedené řešení, společně s instalací i povolením daného rozšíření a potom dej když tak vědět, jak jsi dopadl. 8-)

 
Nahoru Odpovědět
2.2.2017 18:36
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Dominik Gavrecký
Jindřich Máca:2.2.2017 18:42

Ještě jedna věc mě k tomu napadá. Pokud jsi chceš ověřit, že Tvoje instalace serveru a PHP splňuje všechny požadavky Nette, existuje na to takový hezký nástroj Nette Framework Requirements Checker - https://doc.nette.org/…requirements. :)

Ten právě kontroluje i přítomnost výše uvedeného rozšíření. ;)

P.S.: Pokud používáš starší verzi Nette než je aktuální 2.4, potřebuješ i tenhle nástroj pro příslušnou verzi Nette. :D

 
Nahoru Odpovědět
2.2.2017 18:42
Avatar
Odpovídá na Jindřich Máca
Dominik Gavrecký:3.2.2017 16:39

Ďakujem chyba bola presne tam kde si písal. Len si stále neviem poradiť s DI na context keď to nechám tak ako je prvý kód ktorý som zverejnil hore chyba:
Undefined property: App\Modules\Ad­minModule\For­ms\SectionFor­mFactory::$con­text

Ak pridám závislosť cez konštruktor na use Nette\Http\Context; chybová hláška Service http.context is deprecated.

Nevieš kde by som mal hľadať chybu ?

Nahoru Odpovědět
3.2.2017 16:39
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Dominik Gavrecký
Jindřich Máca:3.2.2017 20:40

Ta první chyba je jasná, protože ten $context z hlediska té tovární třídy není definovaný. :)

Když si ho potom chceš korektně předat pomocí DI, nastává druhá chyba, protože v nové verzi Nette je již třída Nette\Http\Con­text označená jako deprecated. :D

Když se tedy podívám, na co konkrétně ji potřebuješ a jaké je odpovídající alternativní řešení, protože deprecated věci rozhodně používat nechceme, zjišťuji, že ji vlastně využíváš dosti špatně... Takhle by se určitě cesta k www/ adresáři získávat neměla a v souvislosti s konkrétním použitím na ukládání obrázků Tě asi už jenom odkáži sem - https://forum.nette.org/…-nebo-appdir#…. ;)

Zkrátka, udělej si na to vlastní, nejlépe model pro práci přímo s obrázky, který cestu k www/ adresáři dostává rovnou z konfigurace. Potom tenhle model mimo jiné můžeš, pokud bude dobře napsaný, použít univerzálně na více místech aplikace. Také, pokud zkontroluješ, že soubor je v pořádku a je to obrázek, můžeš ho rovnou zkonvertovat do třídy obrázku a nemusíš k tomu vůbec použít mezi-ukládání viz. https://api.nette.org/…eUpload.html#… 8-)

 
Nahoru Odpovědět
3.2.2017 20:40
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.