První projekt s nette – pár dotazů

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

Ahoj, chtěl jsem začít s nette, ale mám pár problém/dotazů:

  1. Jelikož PHP vyvíjím v netbeans (7.3 česká verze), tak jsem si chtěl nainstalovat plugin nette, ale instalace nejde spustit – vypsaná následující hláška: „Zásuvný modul PHP Annotation API je požadovaný v provedení verze 201302132200“ – Co s tím?
  2. Používám vertrigoserv, kde jsou všechny projekty uložené ve složce „www“. Ok, stáhl jsem si nette a „nainstaloval“ – Složku nette jsem si dal do složky www – ok, přiložené ukázkové aplikace fungují, jenže teď jsem trochu nepobral následující:
  • když budu teď začínat nový projekt (název např. prj1), tak si ve složce vertrigoserv-www vytvořím složku pro projekt (název složky „prj1“), ale už nevím, co vše z nette tam musím zkopírovat
  • když už ve složce s projektem budu mít nette, tak ještě nevím, kam mám umisťovat vlastní php soubory – nebo to je jedno?

Díky za rady

Edit:

do teď jsem byl zvyklý, mít ve složce s projektem tuto strukturu:

  • složka pages – pro všechny php
  • složka css
  • složka js
  • případně složky pro další knihovny (gen PDF, phpmailer,…)
  • images
  • index.php

Ale teď vůbec nevím, kam co dát…

Edit2:

Nebo stačí pouze v mé složce s projektem vytvořit složku „libs“ a do ní zkopírovat složku nette?
A pak stačí v indexu volat libs/loader.php ?

Editoval n.u.r.v. (7. 6. 2013 15:52)

Oli
Člen | 1215
+
0
-

V podstatě:
v balíčku je sandbox, ten můžeš použít jako kostru. Vidíš tam i strukturu (www/js, www/css, app/presenter, …) Pokud máš napsaný napsaný vlastní php v třídách, tak stačí ty soubory umístit někam kam vidí loader.php (já je dávám do libs/ nebo do app/).

Případně si projdi: píšeme první aplikaci, tam je to všechno ukázáno/vysvětleno

Nejsem si jistej jestli to je tohle netbeansModule, ale myslím, že jsem něco takového stahoval a šlo to. Případně zkus Netbeans 7.4 (už te je celkem stabilní)

n.u.r.v.
Člen | 485
+
0
-

Aha, takže když mám např. soubor „funkce.php“ do kterého si píšu všechny funkce, které moje app. využívá (generování bezp. kodů, vyhodnocení dat, atd…), tak stačí tento soubor hodit do složky app? Ale pak ho asi musím někam zapsat – aby se includoval do každého scriptu – nebo ne?

Filip Procházka
Moderator | 4668
+
0
-

Nette je jedna složka, kterou vložíš do projektu a zavoláš

require_once '/cesta/k/Nette/loader.php';

a používáš. To je celé :)

V typické Nette applikaci pak máš soubory www/index.php, na který jsou směřovány všechny requesty. Tento index načítá app/bootstrap.php. Ten se zase stará o načtení knihoven (tedy načte Nette a zapne robotloader například) a pak „spustí aplikaci“, což probublá k nějakému presenteru a ten se stará o komunikaci s uživatelem.

Všechno si můžeš proklikat ve staženém sandboxu, nebo na githubu

Měl by sis také nastudovat autoloading tříd, který nefunguje na funkce (php to vůbec neumí, musí se to řešit „ručně“).


Takže jaký je závěr? Pokud chceš používat funkce (spíše by jsi se měl začít poohlížet po objektovém programování), stačí ti přidat řádek

require_once __DIR__ . '/functions.php';

za tenhle řádek a všechny funkce které zapíšeš do souboru app/functions.php budou přístupné všude, ve všech modelech a presenterech.

Ovšem kdyby jsi začal používat objekty, budeš to mít řádově jednodušší, protože o ty se stará robotloader a navíc je můžeš registrovat do Systémového DI Container a ten ti je pomůže propojit (například třída na práci s články potřebuje připojení k databázi, tak DIC ti s tím pomůže).


A ještě bych tě za všechny co tady dnem i nocí radí na fóru poprosil, aby jsi si přečetl co nejvíc dokumentace a zkoušel příklady co jsou v ní různě poházené. Přecejenom, to co jsem právě napsal je i v dokumentaci, věděl by jsi to, kdyby sis ji přečetl :)

Začni tedy tady a ptej se až narazíš na něco, co nebude jasné a rádi ti odpovíme, díky! :)

n.u.r.v.
Člen | 485
+
0
-

Ahoj, díky za info…takto jsem to potřeboval…

Dokumentaci jsem četl – (je ale pravda, že ne všechny kapitoly – z časových důvodů = doženu)…Ale zkusil jsem „píšeme první aplikaci“ a z první kapitoly jsem dostal pocit, že když dělám nette, tak musím mít přesně rozvrženou strukturu, jak bylo na tom schématu a skoro se mi zdálo, že si ani nemůžu vytvořit nic vlastního…

Ohledně OOP x funkce: Ano, mám v plánu OOP, ale přeci jen i ze starých projektů používám osvědčené funkce, které např. často potřebuji, ale zdá se mi na ně tvořit třídu, když samotná fce. má jen např 5 řádků…

Filip Procházka
Moderator | 4668
+
0
-

Struktura není vůbec pevně svázaná, je jenom předpřipravená, aby jsi pomocí ní mohl rychle vytvořit projekt, začít programovat a neřešit kam dáš jaký soubor, v tom ti má výchozí struktura pomoci :)

Brzy zjistíš, že Nette samo o sobě obsahuje většinu těchto tvých funkcí :) A ano souhlasím, že je zbytečné psát třídu, když funkce má pět řádků.

Šaman
Člen | 2666
+
0
-

Tak to sorry, ale s tím nesouhlasím. Nejen kvůli robotloaderu, ale i kvůli zamezení kolizí jmen maličko i kvůli dobrému pocitu (i když naznačený use case ho zase trochu zchladí).

Tak si ty funkce napiš do třídy, prostě v tom tvém functions.php přidej pár řádek definujících třídu a funkce dělej statické. Přistupovat k tomu pak budeš Functions::mojeFunkce('foo', 'bar') a nebudeš muset řešit includování, budeš vždy vědět odkud se ti ta funkce vzala (v případě víc souborů/tříd) a nedojde k neočekávanému chování, pokud stejně pojmenovanou funkci budeš mít includovanou vícekrát.

Filip Procházka
Moderator | 4668
+
0
-

Když pomineme autoloading, existuje jediný důvod mít funkce ve třídách, kromě „dobrého pocitu“? Kolize jmen je paranoia :)

Šaman
Člen | 2666
+
0
-

Přehlednost? Zařazení do namespace? Co, až těch funkcí bude víc, budou se dělit do několika souborů, nebo bys je nechal v jednom přerostlém souboru? Pokud se rozdělí, jak jednoduše v kódu zjistíš, kde jsi danou funkci vlastně vzal?
A dobrý návyk do budoucna? Pomalé seznamování se s OOP na nejjednodušším příkladu?

Samozřejmě se dá programovat procedurálně. Dá se to i míchat s OOP, ale když už používám objektový framework, objektovou architekturu, tak by mě spíš zajímalo proč vytvářet neobjektové PHP scripty. Vždyť definice třídy zabere několik řádků a vejde se do ní spousta funkcí.

P.S. Pochopím definici aliasů (zkratek). Sám používám bd() definovanou v bootstrapu. Pro rychlý výpis do panelu. Ale systematicky používat neobjektové php soubory, to se mi nelíbí.

Ondřej Brejla
Člen | 746
+
0
-

n.u.r.v. napsal(a):

  1. Jelikož PHP vyvíjím v netbeans (7.3 česká verze), tak jsem si chtěl nainstalovat plugin nette, ale instalace nejde spustit – vypsaná následující hláška: „Zásuvný modul PHP Annotation API je požadovaný v provedení verze 201302132200“ – Co s tím?

Za pár dní vyjde 7.4 beta, která bude obsahovat nativní Nette support.

n.u.r.v.
Člen | 485
+
0
-

Ahoj, tak jsem si zkoušel tu první aplikaci dle dokumentace a jaksi jsem se zasekl na kapitole „Presentery a šablony“

Dostanu se až sem: obrázek

Ale jakmile kliknu na položku v menu, tak mi to hodí chybu:

„Argument 1 passed to Todo\Repository::findBy() must be an array, string given, called in C:\Program Files (x86)\VertrigoServ\www\pokus_nette\app\presenters\TaskPresenter.php on line 18 and defined“

a označený řádek: „public function findBy(array $by) {“

Co s tím? Zatím kontroluju obsah mých php s tím, co je na githubu, ale zdá se, že mám vše stejné…

EDIT:
Už to funguje-doplnit do Repository.php:

public function find($id) {
        return $this->getTable()->get($id);
}

Editoval n.u.r.v. (10. 6. 2013 11:43)

Filip Procházka
Moderator | 4668
+
0
-

Šaman napsal(a):

Přehlednost? Zařazení do namespace?

Funkce jde zařadit do namespace a nepotřebuješ k tomu třídu.

Co, až těch funkcí bude víc, budou se dělit do několika souborů, nebo bys je nechal v jednom přerostlém souboru?

Jasně, člověka co píše procedurálně tohle stejně trápit nebude.

A dobrý návyk do budoucna? Pomalé seznamování se s OOP na nejjednodušším příkladu?

S OOP? To je vtip? To že naflákáš funkce do tříd nemá s OOP absolutně nic společného.

Samozřejmě se dá programovat procedurálně. Dá se to i míchat s OOP, ale když už používám objektový framework, objektovou architekturu, tak by mě spíš zajímalo proč vytvářet neobjektové PHP scripty. Vždyť definice třídy zabere několik řádků a vejde se do ní spousta funkcí.

Dle mého je daleko efektivnější když zůstane u svých funkcí a postupně se bude učit OOP. Alespoň nepodlehne mylné představě „funkce je ve třídě = dělám OOP“.

n.u.r.v.
Člen | 485
+
0
-

Ok, zkusil jsem použít php ze složky Nette-minified, ale nevím, jak spustit a nastavit laděnku a logování?

Co vše ještě musím zkopírovat?Díky…

n.u.r.v.
Člen | 485
+
0
-

Tak nevím, asi je nette na mě moc…: zkusil jsem si udělat vlastní autentifikátor, ale jaksi se nedokážu připojit k databázi…

V config.neon mám toto:

nette:
		application:
			errorPresenter: Error

		database:
			dsn: 'mysql:host=localhost;dbname=pokus_nette'
			user: uzivatel
			password: heslo

		session:
			expiration: 14 days


	services:
		authenticator:
			class: Authenticator
			arguments: [@database]

		database:
			class: Nette\Database\Connection
			arguments: [localhost, uzivatel, heslo]

Ale co pak? Nepřišel jsem na to, co předat v „new Authenticator()“:

$overeni = new Authenticator();
    $data=array();
    $data["email"] = "email@email.cz";
    $data["heslo"]="1234";
    $overeni->authenticate($data);

Díky…

James_Scott
Člen | 55
+
0
-

n.u.r.v. napsal(a):

Ok, zkusil jsem použít php ze složky Nette-minified, ale nevím, jak spustit a nastavit laděnku a logování?

Co vše ještě musím zkopírovat?Díky…

https://doc.nette.org/cs/quickstart

n.u.r.v.
Člen | 485
+
0
-

jj, to jsem zkoušel…dostal jsem se skoro na konec a pak to přestalo fungovat – i když jsem zkopíroval z githubu všechny zdrojáky…

Stejně jsem z toho „tutorialu“ nepobral jak např. udělat aby se při otevření úvodní stránky zobrazil formulář a hlavně jak pak provést jeho zpracování a přihlášení uživatele…

Budu to tedy dělat postaru a z nette použiji možná to generování formulářů a laděnku…

Glottis
Člen | 129
+
0
-

ja ten start pri zacatcich taky prochazel nekolikrat :) nevzdavej to. a hlavne nepouzivej minified verzi ;)

n.u.r.v.
Člen | 485
+
0
-

Ok, zkusil jsem znova „tutorial“…trochu už se v tom začínám orientovat, jen mi nejsou jasné následující dvě věci:

  1. v config.neon je „položka“ „services:“ proč jsem v tutorialu musel pod services vkládat ty repozitáře?
  2. jak se přiřadil k homepagepresenter-u.php soubor default.latte? To jenom stačí, aby default.latte byl ve složce „homepage“, nebo se cesta k latte musí někde nastavit?

Díky

David Matějka
Moderator | 6445
+
0
-

1. do sekce services zapisujes sluzby dostupne v depedency injection containeru. viz https://doc.nette.org/…introduction
sluzba takto definovana je potom pristupna v presenteru, v dalsich sluzbach atd.
pr.
definujes si UserRepository

class UserRepository
{


	public function insert()
	//....
}

v configu ji registrujes jako sluzbu

services:
	userRepository: UserRepository #nazevSluzby: nazevTridy

a kdyz budes chtit v presenteru repository pouzit, staci napsat

class FooPresenter extends BasePresenter
{

	protected $userRepository;

	public function injectUserRepository(UserRepository $userRepository)
	{
		$this->userRepository = $userRepository;
	}

	public function actionDefault()
	{
		$this->userRepository->....;
	}
}

nette vidi metodu zacinajici slovem inject a vidi, ze obsahuje parametr s typehintem UserRepository, koukne do DI containeru a zjisti, ze je tam takto definovana sluzba a injectne ji do presenteru, kde ji muzes pouzivat

stejne tak UserRepository muze mit zavislost napr. na Nette\Database\Connection. treba takovyhle konstruktor:

public function __construct(Nette\Database\Connection $connection)
{
	$this->connection = $connection;
}

a tim, ze UserRepository mas registrovano jako sluzbu a tim, ze Connection je take registrovano jako sluzba (o to se postara nette samo kdyz konfigurujes databazi), tak nette provede tzv. autowiring, tedy doplni pozadovane zavislosti

2. ano, takhle to staci. v presenteru jsou metody formatTemplateFiles(), kterym muzes tuto strukturu zmenit, ale pokud vytvoris sablonu v app/templates/NazevPresenteru/nazevAkce.latte tak to bude fungovat

Editoval matej21 (11. 6. 2013 15:55)

Glottis
Člen | 129
+
0
-

n.u.r.v. napsal(a):

Ok, zkusil jsem znova „tutorial“…trochu už se v tom začínám orientovat, jen mi nejsou jasné následující dvě věci:

  1. v config.neon je „položka“ „services:“ proč jsem v tutorialu musel pod services vkládat ty repozitáře?

protoze tu sluzbu pak pouzivas v presenteru a nete ti ji tam vstrikne (DI) pres construktor, pokud to napises tak jak v tutorialu

<?php
// upravíme konstruktor
public function __construct(Todo\UserRepository $repository)
{
    $this->repository = $repository;
}
?>
  1. jak se přiřadil k homepagepresenter-u.php soubor default.latte? To jenom stačí, aby default.latte byl ve složce „homepage“, nebo se cesta k latte musí někde nastavit?

presne tak, stacijen aby tam byl (existuje totiz akce default – metoda renderDefault). tahle konvence svazuje sablonu s akci presenteru. kdyz budes mit metodu/akci renderEdit nette se pokusi nacist edit.latte ve slozce daneho presenteru

Díky

edit: to jsme se krasne zduplikovali :/

Editoval Glottis (11. 6. 2013 15:57)

n.u.r.v.
Člen | 485
+
0
-

Jj, díky…už začínám chápat…

n.u.r.v.
Člen | 485
+
0
-

už se tím prokousávám, jen jsem se zasekl u přihlašování – když jsem dle kapitoly „přihlašování uživatelů – tutorial“ udělal vše až po nadpis „Výpis úkolů uživatele“, tak přestala aplikace fungovat a laděnka vypisuje v BasePresenter chybu:

Fatal Error

Call to a member function findAll() on a non-object:

public function beforeRender() {
            $this->template->lists = $this->listRepository->findAll()->order('title ASC');
        }

co s tím?díky…

edit:

Když ten řádek zakomentuju, tak se přihlašovací form zobrazí, ale při jeho odeslání to hodí další chybu v Authenticator:

Fatal Error

Call to a member function findByName() on a non-object:

public function authenticate(array $credentials) {
           list($username, $password) = $credentials;
           $row = $this->userRepository->findByName($username);
...

Editoval n.u.r.v. (12. 6. 2013 9:50)

jiri.pudil
Nette Blogger | 1032
+
0
-

A jakým způsobem si do těch tříd předáváš ony závislosti? Jinými slovy, kde plníš $this->(list|user)Repository?

n.u.r.v.
Člen | 485
+
0
-

jo, to musím zjistit – dělám to dle postupu v tutorialu – krok za krokem…čekal jsem, že to tam bude správně…

n.u.r.v.
Člen | 485
+
0
-

No v SignPresenter se vygeneruje přihlašovací formulář – to funguje, když zakomentuju v Basepresenter toto:

public function beforeRender() {
        $this->template->lists = $this->listRepository->findAll()->order('title ASC');
    }

Pak je v SignPresenter metoda pro zpracování formuláře:

public function signInFormSubmitted(Form $form) {
try {
            $user = $this->getUser();
            $values = $form->getValues();
            if ($values->persistent) {
                $user->setExpiration('+30 days', FALSE);
            }

            $user->login($values->username, $values->password);
            $this->flashMessage('Přihlášení bylo úspěšné.', 'success');
            $this->redirect('Homepage:');
        } catch (NS\AuthenticationException $e) {
            $form->addError('Neplatné uživatelské jméno nebo heslo.');
        }
}

Takže asi toto:

$user->login($values->username, $values->password);

jen nevím, co dělá toto:

$user = $this->getUser();
ViPEr*CZ*
Člen | 818
+
0
-

Nevíte to nebo si chcete nechat raději poradit.
Logicky co by to mohlo znamenat: $user = $this->getUser();
Co je asi v this… no to by jste měl vědět… bude to instance na nějaký objekt… co takhle objekt, ve kterém to this volám? Super… jdu do dokumentace API a hledám metodu getUser() daného objektu. A ejhle… zjišťuji, že ta metoda vrací instanci Nette\Security\User. Jak prosté.

Editoval ViPEr*CZ* (12. 6. 2013 11:04)

vitkutny
Člen | 73
+
0
-

n.u.r.v. napsal(a):

jo, to musím zjistit – dělám to dle postupu v tutorialu – krok za krokem…čekal jsem, že to tam bude správně…

nejsi sám kdo to čekal, taky jsem s tím měl problémy, ale tak v dokumentaci je toho dost a to nejde jen tak rychle upravovat s každou verzí

Edit: mě pomohlo si prohlížet kód Nette\Quickstart na githubu, třeba ti to taky pomůže

Editoval vitkutny (12. 6. 2013 12:19)

n.u.r.v.
Člen | 485
+
0
-

ViPErCZ napsal(a):

Nevíte to nebo si chcete nechat raději poradit.
Logicky co by to mohlo znamenat: $user = $this->getUser();
Co je asi v this… no to by jste měl vědět… bude to instance na nějaký objekt… co takhle objekt, ve kterém to this volám? Super… jdu do dokumentace API a hledám metodu getUser() daného objektu. A ejhle… zjišťuji, že ta metoda vrací instanci Nette\Security\User. Jak prosté.

JJ, to jsem zjistil pár minut po té, co jsem to sem napsal… :-)

Etch
Člen | 403
+
0
-

Ondřej Brejla napsal(a):

Za pár dní vyjde 7.4 beta, která bude obsahovat nativní Nette support.

Minimálně v aktuální DEV verzi NetBeans mě poněkud „štve“, že pokud se v .latte definují nějaké CSS styly

<style type="text/css">
	body { color: #FFF; }
</style>

tak NetBeans okamžitě začne řvát:

Unexpected token WS found
Unexpected token SEMI found
Unexpected token IDENT found

Ne že by to byl až tak velký problém, ale minimálně mě ten „červenej vykřičník“ u těch řádků znervózňuje. :)

Editoval Etch (14. 6. 2013 6:48)

n.u.r.v.
Člen | 485
+
0
-

JJ, taky mi to vadí… Jo a netbeans mi také při každém zakládání projektu s nette (když zaškrtnu možnost „Copy nette Framewor source files to the new project?“) vyhodí chybu: "":http://statistics.netbeans.org/…exception.do?…

Ale projekt lze vytvořit, když to odkliknu…

Ondřej Brejla
Člen | 746
+
0
-

Etch napsal(a):

<style type="text/css">
	body { color: #FFF; }
</style>

Odzkoušeno v dnešním buildu a žádný error nevidím (imho to ani nebylo latte issue…).

Product Version: NetBeans IDE Dev (Build 20130617–2dd7e935b9bb)
Java: 1.7.0_21; Java HotSpot™ Client VM 23.21-b01
Runtime: Java™ SE Runtime Environment 1.7.0_21-b11
System: Linux version 3.8.0–23-generic running on i386; UTF-8; cs_CZ (nb)

n.u.r.v. napsal(a):

To se ke mně ještě nedostalo, kouknu na to. Jinak prosím, reportujte bugy do Bugzilly, NE sem. Zaprvé sem vůbec nepatří a zadruhé nemám tolik času zkoumat všechny posty. Díky.

Etch
Člen | 403
+
0
-

Ondřej Brejla napsal(a):

Odzkoušeno v dnešním buildu a žádný error nevidím (imho to ani nebylo latte issue…).

Dnešní build:

Product Version: NetBeans IDE Dev (Build nbms-and-javadoc-11138-on-20130617)
Java: 1.7.0_21; Java HotSpot™ 64-Bit Server VM 23.21-b01
Runtime: Java™ SE Runtime Environment 1.7.0_21-b11
System: Windows 7 version 6.1 running on amd64; Cp1250; cs_CZ (nb)

csstest

Pro jistotu ti to pošlu i do Bugzilly, ale je nutno říci, že ono se to projevuje dost záhadně.

Editoval Etch (17. 6. 2013 12:08)

Ondřej Brejla
Člen | 746
+
0
-

Fixed…a sem už to fakt nepostujte, ne všichni používají NB. Díky.

n.u.r.v.
Člen | 485
+
0
-

Ahoj, ještě potřebuji nakopnout u tohoto problému:

Mám několik xxxRepository.php a teď jsem chtěl vytvořit repository pro zapisování do DBS do LOGu:

Takže

LogRepository:

<?php

namespace Todo;

use Nette;


class LogRepository extends Repository {

    private $datum;

    protected function startup() {
        parent::startup();
    }

    public function zapis_log($udalost) {
	$this->datum = Date("YmdHis", Time());
	$data = array("Datum" => $this->datum, "Udalost" => $udalost,atd...);
        $zapis = $this->insert("log", $data);

    }

Ale zatím jsem nepřišel na to, jak využívat tuto metodu (zapis_log) v jiných repozitářích. Když jsem chtěl udělat toto:

<?php

namespace Todo;

use Nette;



class PokusRepository extends Repository {

    private $logRepository;

    protected function startup() {
        parent::startup();
        //$this->logRepository = $this->context->logRepository;
    }

    public function nejaka_metoda() {

        ...
	...
	...
        $this->logRepository->zapis_log("xxx");
        ...
    }
}

Tak to hodí chybu „Call to a member function zapis_log() on a non-object“

Pozn: V config.neon mám repository „zaregistrované“ jako „services“ (dle quickstart)

Díky za radu…

P.S.: Jediné, co mě zatím funguje: dát metodu zapis_log() do hlavního Repository.php

Glottis
Člen | 129
+
0
-

ten pokus repo samozrejme o objektu log repo nic nevi. to tam nedostanes ani z kontextu. nejlepe to asi poresit tak ze v config.neon si zadeklarujes sluzbu logu (to uz asi mas) a pak uz v neonu ji injektujes do dalsich sluzeb, jak potrebujes.

Glottis
Člen | 129
+
0
-

podobne jako to je tady

services:
	database:
		class: DibiConnection
		create: dibi::connect(%database%)
		run: true
	addresses: \App\AddressBook\Addresses(@database, 'address_book')
	invoices: \App\Invoice\Invoices(@database, 'invoice')

a ty sluzby (repo) muzou pak mit neco jako

/** @var \DibiConnection */
protected $db;

/** @var \Nette\Utils\Strings */
protected $table;

public function __construct(\DibiConnection $connection, $table) {
    $this->db = $connection;
    $this->table = $table;
}
Etch
Člen | 403
+
0
-

Zhruba nějak takto:

abstract class Repository extends Nette\Object{
	/** @var Nette\Database\Connection */
	protected $connection;

	protected $log;

	public function __construct(Nette\Database\Connection $db, \Todo\LogRepository $log){
		$this->connection = $db;
		$this->log = $log;
	}
}
n.u.r.v.
Člen | 485
+
0
-

Jo, díky – funguje to :-)

n.u.r.v.
Člen | 485
+
0
-

Hups, teď jsem ale zjistil, že se nedostanu na session v LogRepository:

Když dám:

$uzivatel = $this->getSession('uzivatel'); //pristup do session

Tak to hodí chybu „Call to undefined method Todo\LogRepository::getSession()“

Glottis
Člen | 129
+
0
-

a mas tam takovou metodu? nechtel si spis neco jako $this->mojeSession->getSession(‚neco‘); ? jinak tezko radit kdyz nevime co tam mas za kod ted.

n.u.r.v.
Člen | 485
+
0
-

No v Basepresenteru mám vytvořenou session:

$uzivatel = $this->getSession('uzivatel'); //pristup do session

A do ní vkládám nějaká data:

např
$uzivatel->jmeno="něco"

A teď se potřebuji dostat do té session v LogRepository, tak jsem dal:

$uzivatel = $this->getSession('uzivatel');

ale hodilo to chybu

A teď jsem zjistil, že taky nejde např. toto:

$this->getUser()->isLoggedIn()

EDIT:

Už to asi jde, musím dát do konstruktoru Nette\Http\Session $sess…

Editoval n.u.r.v. (20. 6. 2013 14:34)

ViPEr*CZ*
Člen | 818
+
0
-

Zřejmě chcete použít metodu z Presenteru (https://api.nette.org/…esenter.html#…)… alias pro metodu getSection z Nette\Http\Session. No je to opět základ… předejte si tam tu závyslost na Nette\Http\Session.

n.u.r.v. napsal(a):

Hups, teď jsem ale zjistil, že se nedostanu na session v LogRepository:

Když dám:

$uzivatel = $this->getSession('uzivatel'); //pristup do session

Tak to hodí chybu „Call to undefined method Todo\LogRepository::getSession()“

n.u.r.v.
Člen | 485
+
0
-

jj, zjistil jsem to před 15 sekundami… :-)

n.u.r.v.
Člen | 485
+
0
-

Mno, vše funguje, takže se přesunu na další problém:

  1. Mám stránku (presenter), kde může admin vybrat uživatele, kterého chce editovat (formulář se selectem) – to mám
  2. ale teď bych po vybrání a submitu v prvním formuláři potřeboval vykreslit druhý formulář, který bude mít vyplněny data z dbs a to je problém – když dám do toho mého presenteru dvakrát metodu „createComponentFormVyber“ a „createComponentFormUzivatel“, a do latte dám „{control formVyber}“ a „{control formUzivatel}“, tak mi to vykreslí oba formuláře naráz, takže bych se chtěl zeptat, jak se to řeší…

Napadají mě dva způsoby, ale nevím, který je lepší:

  1. Po odeslání formuláře vykreslit druhý v nějakém repositáři (ale nevím co dám do latte)
  2. V presenteru mít výše uvedené metody pro vykreslení obou formulářů a při odeslání prvního formuláře se ten druhý vykreslí v jiném latte, ale nevím, zda to tak jde…
  3. EDIT – ještě mě napadlo, že ten druhý formulář bude velice podobný formuláři, který používám k registraci uživatele, takže možná bych mohl po výběru uživatele v prvním formu přesměrovat na tu registraci a předat parametr, že se jedná o editaci, pak dát u vykreslení formu „if(editace){vyplnit form}“
  4. jiný způsob?

Díky za radu…

Editoval n.u.r.v. (21. 6. 2013 10:01)

ViPEr*CZ*
Člen | 818
+
0
-

Grid s výpisem a link na edit. Např: http://nextras.skrasek.com/…full/default

n.u.r.v.
Člen | 485
+
0
-

Ou, to je hustý – vidím, že mám na víkend co studovat…

Edit, jen jestli to řešit takto, když tam bude jen pár uživatelů (max 4 odhaduji)

Editoval n.u.r.v. (21. 6. 2013 11:31)

ViPEr*CZ*
Člen | 818
+
0
-

Nikdy nevíte kolik jich tam přibude. Nikdy nevíte, jestli se to nepoužije někde jinde, kde bude více uživatelů. Furt to je lepší než selectbox a dva formuláře. ;-)

n.u.r.v. napsal(a):

Ou, to je hustý – vidím, že mám na víkend co studovat…

Edit, jen jestli to řešit takto, když tam bude jen pár uživatelů (max 4 odhaduji)

n.u.r.v.
Člen | 485
+
0
-

jj, pravda…

Jde to kombinovat s twitter bootsrapem, který používám?

Editoval n.u.r.v. (21. 6. 2013 11:42)

Etch
Člen | 403
+
0
-

@n.u.r.v.

Tak na té ukázce gridu, je snad na první dobrou vidět, že využívá twitter bootstrap.

n.u.r.v.
Člen | 485
+
0
-

Ahoj, jsem zase tu – mám problém s přihlášením uživatele:

– ve Firefoxu, v Opeře, v Chrome fungujhe vše bez problémů, ale v IE10 login nejde – když vyplním formulář pro login a odešlu ho, vrátí mě to zpět na přihlašovací form, ale žádná hláška se neukáže – nevíte na co se zaměřit-kde může být problém? Díky

Edit: Když dám do formuláře chybné přihlašovací údaje, tak to chybovou hlášku ukáže…

Editoval n.u.r.v. (24. 6. 2013 14:45)