Nový Quickstart – diskuze

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

Ahoj, mohu se zeptat jak je to nyní s QS ? Skončil jsem hned na kapitole s presentery kde se mi dokonale zamotaly proměnné a názvy tříd tasksLists, TasksLists, taskLists, taskLists atp. V gitu je uplně něco jiného než tady na stránkách…
Registrujeme službu taskslists:TaskList\TasksLists nebo tasklists : TaskList\TaskLists (podle názvu třídy, která už nese dále název TaskLists když se před tím jmenovala TasksLists a na gitu nese název Tasklists) …
Kdyby aspoň byl někde ke stažení aktuální funkční kod..

Editoval roghill (27. 8. 2012 22:50)

Filip Procházka
Moderator | 4668
+
0
-

Přece vždy na konci každé kapitoly máš dole odkaz! https://github.com/…e-quickstart

hrach
Člen | 1834
+
0
-

HosipLane, ale to je dost trapas, ze si replacnul dokumentaci a nemel si domluveny merge do te oficialni. Ty svoje repo si nech…

Filip Procházka
Moderator | 4668
+
0
-

Uznávám, že to asi nebyl nejlepší nápad. Ale něco se udělat muselo, byl prostředek okurkové sezóny a nikomu se nic nechtělo. Ty dotazy s

$this->context->createTasks()

byly o zdraví. Ale stydím se, že na tohle jsem zapomněl a neotevřel ho dřív.

Editoval HosipLan (28. 8. 2012 13:47)

roghill
Člen | 21
+
0
-

HosipLan napsal(a):

Přece vždy na konci každé kapitoly máš dole odkaz! https://github.com/…e-quickstart

Koukal jsem se na ten prvni zdroj zde na foru,kam mě odkázal QS při nějakých problémech. Jenže tam je git starý 6 měsíců, obsahující chyby, respective je to úplně jinak napsaný QS…
A v záplavě všech chyb mých i těch v tutoriálu jsem přehlíd ty zdroje na konci kapitoly – asi to bude tím, že jsem se na konec ani nedostal (ale ano, díval jsem si i na konec stránky, ale diskuse a QS není moc graficky oddělená, takže jsem přehlíd konec tutoriálu jak jsem se snažil najít řešení v diskuzi, asi…). Možná by to chtělo ty zdroje udávat hned nahoře.
Každopádně děkuji za ně. Nebýt toho, že se Nette **MUSÍM ** naučit, už bych byl asi u Zendu (více srozumitelných zdrojů, přehlednější, návody pro začátečníky bez chyb).

David Grudl
Nette Core | 8107
+
0
-

Mohl bych poprosit o stručné tl;dr? Vývoj quick startu jsem moc nesledoval a potřeboval bych vědět, jaký je stav, abych se do toho mohl nějak zapojit. Díky.

Filip Procházka
Moderator | 4668
+
0
-

Davide, stav je zde. Panda mi právě pushnul změny do ofic repa.

Zbývá vyřešit poslední problém. Strašně rád bych to s 2.0.5 přepsal na inject*() metody (s tím že tam někde samozřejmě napíšu, že do 2.0.5 se používá setContext). Pár lidem se to nelíbí, ale já nesouhlasím. Kdo by vyvíjel novou aplikaci na starším, než aktuálním Nette. A QS je na nové aplikace, pro nováčky v Nette.

Editoval HosipLan (28. 8. 2012 19:31)

Majkl578
Moderator | 1364
+
0
-

HosipLan napsal(a):

Kdo by vyvíjel novou aplikaci na starším, než aktuálním Nette. A QS je na nové aplikace.

Ten, kdo v QS pouze hledá informace.

Filip Procházka
Moderator | 4668
+
0
-

@Majkl578: pro toho tam bude ta poznámka.

Majkl578
Moderator | 1364
+
0
-

s tím že tam někde samozřejmě napíšu, že do 2.0.5 se používá setContext

To je sice hezké, ale takový QS je pro člověka s <=2.0.4 k ničemu, protože obsahově pro něj bude stejně bez větších úprav nepoužitelný. Rozdíl mezi $this->getContext()->someService $this->service automagically injected a viditelně ručně setnuté je velký, ve způsobu, jakým se to provádí (obojí je sice autowiring, ale fungující jinak).


Tyhle diskuze jsou pěkným příkladem toho, proč se mi nelíbí přidávání zásadních featur do x.y.z verzí.

Filip Procházka
Moderator | 4668
+
0
-

Větších úprav?

public function injectTasks(TaskList\Tasks $tasks, TaskList\Users $users)
{
	$this->tasks = $tasks;
	$this->users = $users;
}

vs

public function setContext(TaskList\Tasks $tasks, TaskList\Users $users)
{
	$this->tasks = $tasks;
	$this->users = $users;
}

Jedna metoda, hroznej problém ;) Co metoda, skoro jedno slovo!

Editoval HosipLan (28. 8. 2012 19:32)

Majkl578
Moderator | 1364
+
0
-

V případě, který jsi uvedl, možná. Obecně to ale nemusí být pravda.

David Grudl
Nette Core | 8107
+
0
-

Metoda setContext() je naprosto použitelná a dostačující. Fakt nevím, nad čím naříkáte. Samozřejmě je komplikovanější při dědičnosti, ale jednak se dá quickstart klidně realizovat i bez BasePresenteru (resp. jeho závislostí), hlavně ale předávání závislostí do parent::setContext dává smysl, tj. je nemagické, byť pracné.

Ať už se použije v kódu cokoliv (setContext, inject), stejně tam musí být poznámka, že od/do verze se dá používat to druhé. Takže není co řešit, je to jen dělání z komára velblouda.

roghill
Člen | 21
+
0
-

Chtěl bych upozornit že v tomto „INSERTU“ zde uvedeném na foru jsou špatně hesla. Nevím, proč jsem použil tento a ne z QS.(Murphy – jakmile mám na výběr z více zdrojů, vždycky si zvolím ten co je špatně)
Trvalo mi to několik hodin testování a důkladného pochopení funkce crypt…
Ono totiž v QS je vytvoření tabulek špatně kvůli cizím klíčům, pak je tam sice zdroj, no jak jsem psal výše. Nevím, proč to není opravené v samotném QS.

Možná by bylo ideální po vyřešení/opravení problému v QS zmíněného zde na foru ten post nějak zneaktivnit. Pak totiž nevím, kde je to dobře a když mi něco nefunguje zkouším forum.

Editoval roghill (30. 8. 2012 20:44)

Filip Procházka
Moderator | 4668
+
0
-

Chceš abychom to smazali z fóra ale celý příspěvek znovu cituješ aby tu byl ještě jednou? To je chytré ;)

Co je teď v QS mi funguje. Co je tam konkrétně špatně?

roghill
Člen | 21
+
0
-

Ok, takže uvedený SQL dotaz na vytvoření tabulek nefunguje kvůli cizím klíčům, je to zmíněné v QS i zde na foru. Souboru uvedené níže jsou správně, ale proč v QS nechat tápat lidi a trápit se i cizími chybami, když při vytváření aplikace mi i tak nefunguje plno věcí. Ať už kvůli špatně nastavenému serveru nebo vlatním překlepům.
Pak je tam vytvoření třídy „app/models/TasksLists.php“, ale dále se používá „app/models/TaskLists.php“. To je celkem problém, protože začátečník sleduje každý krok a když jsou tam překlepy v názvech tak – jako například já – se do toho zamotá.
Jinak samozřejmě děkuji za QS a sry jestli moje posty působí nějak špatně.

Editoval roghill (30. 8. 2012 21:15)

Filip Procházka
Moderator | 4668
+
0
-

Ty komentáře jsou pěkně stupidní. Davide, není někdo RSSko všech komentářů?

//edit: Nalezeno https://nette.org/…ial/comments – díky Patriku

@roghill: Tvoje příspěvky nepůsobí nijak blbě. Je tam chyba, je potřeba ji opravit. Stačilo ji nahlásit tak, aby si toho někdo všiml ;)

Ty překlepy jsem opravil.

Editoval HosipLan (30. 8. 2012 22:20)

mrataja
Člen | 57
+
0
-

V kapitole o preseneterech jsme definovali nasledujici metodu:

public function actionDefault($id)
{
    $this->list = $this->taskLists->find($id);
}

ale o chvili pozdeji (pri kontrole platneho id) vypada metoda takto (zrejme postaru)

public function actionDefault($id)
{
    $this->list = $this->context->createTasklists()->get($id);
    if ($this->list === FALSE) {
        $this->setView('notFound');
    }
}
Filip Procházka
Moderator | 4668
+
0
-

@mrataja: díky za upozornění, to mi uniklo. Opravil jsem to.

mrataja
Člen | 57
+
0
-

Při přípravě modelů na stránce „Vytvoření databáze a modelu“ chybí use Nette;. Bez toho dostanu hlášku – Argument 1 passed to TaskList\TaskLists::tasksOf() must be an instance of TaskList\Nette\Database\Table\ActiveRow, instance of Nette\Database\Table\ActiveRow given, called in C:\www\nette.loc\app\presenters\TaskPresenter.php on line 32 and defined. Na githubu je to ok.

Věřím, že to dokáže začátečníkům na pár minut zkomplikovat život.

namespace TaskList;

/**
 * Model starající se o tabulku user
 */
class Users extends Table
{
    /** @var string */
    protected $tableName = 'user';
}
Filip Procházka
Moderator | 4668
+
0
-

IMHO je zbytečné psát do ukázek kódu věci, které nejsou zrovna použity. Ale jako prevenci jsem to tam přidal.

Glubo
Člen | 12
+
0
-

Taková malá připomínka k formě: Na https://doc.nette.org/cs/quickstart je dole u navigace „vpřed“ „Zabezpečení před zranitelnostmi“. Čekal bych tam první podčást quickstartu – https://doc.nette.org/cs/quickstart.

perteus
Člen | 12
+
0
-

Jako totální nováček jsem se dokousal ke kapitole Presentery a Šablony a jsem totálně v háji: Upřímně tady je návod pro nováčka, Nette nepolíbeného, hodně nepřehledný. Tak jakou že to mám upraovovat Presenter? Nejdříve se mluví o HomepagePresenter, pak je nějaké nutné vysvětlení a pak, jdeme upravovat kód. Kód čeho? Toho HomepagePresenter? Ok upravím ho a Laděnka:

Nette\MemberAccessException

Call to undefined method Ukol\ukolyRepository::findIncomplete(). search►

Source file ►

Call stack ▼

.../libs/Nette/common/Object.php:81	 source ►  Nette\ObjectMixin::	 call (arguments ►)

.../app/presenters/HomepagePresenter.php:20	 source ►  Nette\Object->	 __call (arguments ►)

10:    protected function startup()
11:    {
12:        parent::startup();
13:        $this->ukolyRepository = $this->context->ukolyRepository;
14:    }
15:
16:    // class HomepagePresenter
17:
18:    public function renderDefault()
19:    {
20:        $this->template->ukoly = $this->ukolyRepository->findIncomplete();
21:    }
22:
23:    }

Můj HomepagePresenter

<?php

class HomepagePresenter extends BasePresenter
{
 // class HomepagePresenter

/** @var Todo\TaskRepository */
private $ukolyRepository;

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

    public function findIncomplete()
    {
    return $this->findBy(array('done' => false))->order('created ASC');
    }

    public function renderDefault()
    {
    $this->template->ukoly = $this->ukolyRepository->findIncomplete();
    }

}

Jel jsem přesně podle návodu. Jelikož tam není nic specifikovaného a jen se mluvilo o HomepagePresenter tak předpokládám, že takhle ta úprava má být. Má se mi zobrazit seznam všech nesplněných úkolů, nezobrazuje se. A já už nevidím nikde, kde jsem mohl udělat chybu. Takže uvítám jakékoliv nasměrování. Díky.

Tomáš Kolinger
Člen | 136
+
0
-

Metodu voláš nad repository Ukol\ukolyRepository, nicméně definuješ v presenteru :). Tj. přesuň metodu findIncomplete() do repository a vyřešíš tvůj problém.

Editoval Tomáš Kolinger (26. 2. 2013 9:25)

perteus
Člen | 12
+
0
-

Tomáš Kolinger napsal(a):

Metodu voláš nad repository Ukol\ukolyRepository, nicméně definuješ v presenteru :). Tj. přesuň metodu findIncomplete() do repository a vyřešíš tvůj problém.

Děkuji: A jen poznámka. V popisu té kapitoli to není uvedeno. Tedy je to napsané trošku zmateně. Jak jsem napsal : Mluví se nejdříve o HomepagePresenter a teď se dovídám, že mám upravovat i repository. Tohle by chtělo trošku lépe formulovat, neb takových tupců jako jsem já :-) se může najít vícero a je škoda, aby je to pak odradilo od používání nette.

perteus
Člen | 12
+
0
-

Tak tohle je už trošku asi moc :-) Postoupil jsem o malý kousek dál a narazil na další probíraný problém.

PDOException

No reference found for $ukoly->uzivatele. search►

Source file ►

Call stack ▼

.../libs/Nette/Database/Reflection/DiscoveredReflection.php:163	 source ►  Nette\Database\Reflection\DiscoveredReflection->	 getBelongsToReference (arguments ►)

.../libs/Nette/Database/Table/ActiveRow.php:292	 source ►  Nette\Database\Reflection\DiscoveredReflection->	 getBelongsToReference (arguments ►)

.../temp/cache/_Nette.FileTemplate/_Homepage.default.latte-2128937e85c0a3a037de85d04a861601.php:29	 source ►  Nette\Database\Table\ActiveRow->	 __get (arguments ►)

19:            <th>Čas vytvoření</th>
20:            <th>Úkol</th>
21:            <th>Přiřazeno</th>
22:        </tr>
23:        </thead>
24:        <tbody>
25:    <?php $iterations = 0; foreach ($ukoly as $ukol): ?>
26:        <tr>
27:            <td><?php echo Nette\Templating\Helpers::escapeHtml($template->date($ukol->created, 'j. n. Y'), ENT_NOQUOTES) ?></td>
28:            <td><?php echo Nette\Templating\Helpers::escapeHtml($ukol->text, ENT_NOQUOTES) ?></td>
29:            <td><?php echo Nette\Templating\Helpers::escapeHtml($ukol->uzivatele->jmeno, ENT_NOQUOTES) ?></td>
30:        </tr>
31:    <?php $iterations++; endforeach ?>
32:        </tbody>
33:    </table>

A celý problém nastal v okamžiku, kdy jsem do své tabulky nahrál nějaká data. Nejdříve se tedy nezobrazilo nic. Protože byla databáze prázdná, tedy tabulky. Po nahrati vyskakuje tato chyba. Problem s cizími klíči? Eliminoval jsem ho tak, že jsem tabulky vytvořil znovu ze sql příkazu, který je dostupný v předchozí kapitole. Při vkládání dat přes phpmyadmin mi dokonce v tabulce ukoly umožní v sloupci id_uzivatel a id_seznam , vybrat správné id . Proč to tedy na mě křičí tuhle chybu?

Tomáš Kolinger
Člen | 136
+
0
-

Uff. No, holt nejde postupovat step-by-step ale je potřeba se nad tím zamyslet, co autor asi zamýšlel :). Já osobně ani QuickStart nedělal. A rovnou se vrhl na programování a čerpal z examples například.

Chybí ti reference – máš databázi v InnoDB a máš nadefinované cizí klíče? Použij adminer a koukni na schéma databáze, tam všechno krásně uvidíš/neuvidíš.

Editoval Tomáš Kolinger (26. 2. 2013 12:39)

Re4DeR
Člen | 71
+
0
-

jojo quickstart je trosku hlavolam, ale uprimne budme radi aspon za neco :-).

doporucuji se ridit spis podle zdrojaku na githubu, trosku se to lisi. Ale je to funkcni = pouzij quickstart na vysvetleni ale kody s prohlizej hlavne na githubu.

perteus
Člen | 12
+
0
-

Upřímně, tohle vše dělám. Jsem sice začátečník, ale nejdříve používám google a vyhledávání tadyhle. Databáze je OK i adminer mi ukazuje relace jak mají být. Jak jsem napsal, použil jsem sql příkaz, který je dostupný na githubu. A když přidávám úkol ručně, tak se mi zobrazují kolonky uzivatele_id a seznam_id tedy vidím tam zatím 1, nebo mám jen jednoho uživatele a jeden seznam.

Problém nastává pak v tomhle. A nebyl jsem jediný. Ono krok za krokem to úplně nedělám, když si i jinak pojmenovávám tabulky a modely, ale nadruhou stranu, nad tím přemýšlím už 3 dny. Každý den se posunu vždy o kousek. No teď jsem tedy na druhém kroku :-). Já nad tím zítra ráno zase sednu a budu do toho čučet a třeba mě něco napadne :-)

vvoody
Člen | 910
+
0
-

perteus: ja myslím že to tam je viac než jasne napísané a dokonca dva krát:

Vytvoříme si tedy metodu na výběr nesplněných úkolů, ve třídě Todo\TaskRepository

// class TaskRepository

public function findIncomplete()
{
    return $this->findBy(array('done' => false))->order('created ASC');
}

Treba sa na to viac sústrediť.

Ta druhá chyba, namiesto

{$ukol->uzivatele->jmeno}

tam zrejme má byť:

{$ukol->uzivatel->jmeno}

alebo presne podla quickstartu ak či si nepomenil názvy v databáze oproti quickstartu.

{$ukol->user->name}

Čo ta viedlo k tomu tam napísať uzivatele?

perteus
Člen | 12
+
0
-

Ok tak moje chyba, ktera pramenila z toho, ze jsem spatne pochopil kod:

{$ukol->uzivatele->jmeno}

takhle je to napsane proto, ze jsem si myslel, ze to oznacuje nazev tabulky a sloupce, jelikoz mam tabulku uzivatele tak jsem tam dal uzivatele .

ve skutečnosti tedy opravdu mělo být

{$ukol->uzivatel->jmeno}

neb mam v tabulce uzivatele uzivatel_id . Takze dekuji za popostrceni.

castamir
Člen | 629
+
0
-

Aktualizoval jsem zdrojáky quickstartu (viz GitHub).

Chtělo by to podle toho i inovovat textovou část, protože už je docela zastaralá. Bohužel nemám práva na úpravu dokumentace a psát skrytě někam na dev je pro mě demotivující.