Nový Quickstart – diskuze
- roghill
- Člen | 21
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
Přece vždy na konci každé kapitoly máš dole odkaz! https://github.com/…e-quickstart
- Filip Procházka
- Moderator | 4668
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
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 | 8218
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
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
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
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)
- David Grudl
- Nette Core | 8218
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
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
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
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
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
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');
}
}
- mrataja
- Člen | 57
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
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
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
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
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
Tomáš Kolinger napsal(a):
Metodu voláš nad repository
Ukol\ukolyRepository
, nicméně definuješ v presenteru :). Tj. přesuň metodufindIncomplete()
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
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
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)
- perteus
- Člen | 12
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
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
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
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í.