Notice Undefined index: po znovunačtení stránky se načte bez chyby
- sejmor
- Člen | 63
Zdravím,
Mám oříšek a bude to zase určitě nějaká moje blbost. Mám presenter, dostane 4 parametry. Model mi z DB na základě těchto parametrů vybere vhodné produkty a pošle mi jejich ID. V šabloně si proto vytáhnu nadpis, popis a číslo obrázku ze 3 různých propojených tabulek – nějak takto.
{foreach $produkty as $produktparametr}
<div class="produktpruvodce">
{foreach $produktparametr->produkt->related('produkt_images') as $img}
<img src="{$basePath}/produkty-obrazky/{$img->id}-th.jpg">
{/foreach}
<h2>{$produktparametr->produkt->jmeno}</h2>
<p>{$produktparametr->produkt->perex}</p>
<p><a href="{plink Produkt:default $produktparametr->produkt->id,$produktparametr->produkt->url}">Podrobnosti </a></p>
<div class="reset"></div>
</div>
{/foreach}
Funguje to v podstatě správně, ale zlobí mě ten druhý foreach kde je related. V případě, že promažu temp a výsledkem jsou produkty které mají obrázek tak je vše v pohodě. V případě, že promažu temp a výsledkem jsou produkty který nemají obrázek je vše taky v pohodě. Když však následně zobrazím produkty které mají obrázek hodí mi to hlášku:
Notice – Undefined index: 17
Přičemž 17 je číslo druhého obrázku (produkty se mají zobrazit 2) – pokud dám F5 tak se stránka zobrazí normálně.
Laděnka píše že zásek je na tom řádku s related a problém má s Nette\Database\Table\Selection→ rewind ()
V podstatě mi to dělá i bez promazávání tempu a vždy když se zobrazí sada výsledků bez obrázků a následně s obrázky.
Načutněte mě někdo prosím kde je zakopanej pes :-)
- enumag
- Člen | 2118
Hmm z nějakého důvodu se na ty odkazy stejně nedá klikat – myslel jsem že tomu ty soubory pomůžou a ono ne. :-( To se ale dá obejít přes firebug.
Takhle, mně to k opravě určitě nestačí, na NDB nejsem žádnej expert. @hrachovi by to stačit mohlo, bude-li mít čas se na to podívat. Laděnku jsem od tebe vyžádal protože @hrach ji v podobných případech požaduje tak aby ji měl rovnou. Jestli mu bude stačit už si musí říct on.
EDIT: Kdyžtak ještě dump struktury databáze určitě neuškodí. Taky můžeš zkusit master větev z githubu, ale posledně jsem byl ujištěn že tyhle fixy se backportují i do stable takže to asi nepomůže.
Editoval enumag (26. 2. 2013 17:09)
- sejmor
- Člen | 63
zkusil jsem to ještě uložit jiným způsobem a mohlo by to jít už rozklikávat
https://dl.dropbox.com/…/ladenka.htm
Co se týká toho dumpu tak stačí ty 3 propojený tabulky do kterých se šahá ?
- sejmor
- Člen | 63
Tady ještě přikládám dump těch 3 spojených tabulek:
https://dl.dropbox.com/…390/dump.sql
Nevím jak to zde funguje když se hlásí bug a jak to případně sdělit @hrachovi. Hlavně jestli to není spíš nějaká moje chyba nebo neznalost. Related kontrukci jsem v šabloně používal poprvé. Pokud by jste tam tedy objevili nějakou mojí botu tak se předem omlouvám (donedávna jsem používal klasické SQL). Mám případně i náhradní řešení jak to obejít a docílit toho co potřebuji s tím co znám a mám vyzkoušené, ale na druhou stranu by se mi to takto líbilo a pokud mi někde osvětlí kde je problém tak budu rád :-)
Zatím díky moc
- enumag
- Člen | 2118
Dump těch 3 tabulek by měl stačit, koukám že tam jsou i data takže bych měl být schopen připravit alespoň failující test. @hrach si toho tady na fóru většinou všimne – kdyby náhodou ne, hodím to na github až budu mít ten test, tam si toho všimne určitě.
Tvoje chyba to není skoro určitě. I kdybys něco dělal špatně, mělo by to hodit čitelnější chybu než nicneříkající Undefined index.
Mrknu na to dnes nebo zítra večer.
Editoval enumag (26. 2. 2013 17:35)
- jiri.pudil
- Nette Blogger | 1032
(OT)
sejmor napsal(a):
A ještě by mě případně zajímalo jaký způsobem se tady přikládá komplet výpis laděnky.
@juzna právě k tomuto účelu vytvořil udělátko
- enumag
- Člen | 2118
Teď jsem si vzpomněl, že jsme s @hrachem něco takového řešili asi před měsícem a koukám, že Nette 2.0.8 je starší… Mohl bys tedy přeci jen vyzkoušet dev verzi Nette?
- sejmor
- Člen | 63
Zkouším tu dev verzi, ale hází mi to hned chyby :-( momentálně:
Recoverable Error
Argument 1 passed to Nette\Database\Table\Selection::__construct() must be an instance of Nette\Database\Connection, string given, called in C:\PHP_project\devnette\app\model\Article.php on line 12 and defined
Zkusím se s tím ještě poprat, ale nevím
- sejmor
- Člen | 63
No já na jednoduché dotazy používám továrničku (tak jak to bývalo kdysi v quickstartu) a pro model article mám tedy
use Nette\Database\Connection,
Nette\Database\Table\Selection;
class Article extends Selection
{
public function __construct(\Nette\Database\Connection $connection)
{
parent::__construct('article', $connection);
}
}
To je špatně ? Je fakt, že tímto způsobem téměř všechno řeším v presenteru a moc se mi to nelíbí takže už od toho ustupuju. Ale je to takovej pozůstatek z toho quickstartu
EDIT: Tak jsem tu dev verzi rozchodil a vypadá to, že prvotní chyba se opravdu vyřešila. Díky moc a ještě jeden dotaz. Nechci, až to pustím na ostro používat dev verzi – jak toto řešíte. Github jsem nikdy nepoužíval (asi to budu muset dostudovat). V podstatě bych potřeboval jenom ty změněný knihovny který zalepily daný bug.
Jinak díky moc za ochotu … fakt si toho vážím a chtěl bych do toho taky tak vidět :-)
Editoval sejmor (26. 2. 2013 22:18)
- enumag
- Člen | 2118
A doprčic. Jo je to špatně a to tak že úplně. Selection bys nikdy neměl dědit. V Quickstartu to nějakou dobu bylo, víme o tom, velmi nás to všechny mrzí, byla to chyba. Napáchalo to velkou škodu na začátečnících a tu a tam se stále objevuje někdo další kdo to používá – jako nyní i ty. V každém případě je to špatně, tečka. Ehm… vykřičník. A ne jeden. Pokud je mi známo, šlo o největší dokumentační fail v historii Nette.
Jak z toho ven: Přečti si prosím nový quickstart, případně na CD collection jak se to má řešit správně a aplikaci podle toho refaktoruj – kdyby cokoli nebylo jasné, poradíme, vysvětlíme.
Nejspíše by tě i zajímalo co je na dědění Selection tak špatného. Selection jako takové totiž nepředstavuje tabulku, ale množinu řádků tabulky. V podstatě je to jen takový chytrý iterátor, ale samotná tabulka/repository/dao (říkej tomu jak chceš, správné názvosloví nechme nyní stranou) je něco úplně jiného – nepředstavuje množinu řádků ale tabulku jako celek. Z této tabulky se pomocí metod získávají právě instance Selection – tedy již nějak vyfiltrované řádky. Přímo v Nette\Database žádná třída typu Tabulka není, tyto třídy už si uživatel musí udělat sám, případně použít něco připraveného jako Fabik/Database, NDab nebo YetORM.
Nyní ještě k tomu GitHubu. Používání verzovacího systému je pro dobrého programátora naprosto nezbytná věc. V dnešní době je takovým standardem Git s tím že mnoho opensource projektů zveřejňuje zdrojáky na GitHubu, který poskytuje skvělé zázemí pro týmový vývoj. Takže ano, Git se časem určitě nauč. Já se ho učil poměrně dlouho – v podstatě do té doby než jsem se vykašlal na neúspěšné pokusy o používání Gitu přes příkazovou řádku, se kterou si vůbec netykám. Míst toho jsem zkusil SmartGit, který mi připadá pro začátečníka velmi jednoduchý – na druhou stranu jsem si zvyknul a moje práce s Gitem se omezuje na to co umí SmartGit takže pokud jde o Git jsem stále začátečník (ale vystačím si). Prosím nenásleduj slepě můj příklad, může být naprosto špatný. ;-)
Osobně používám dev verzi klidně i na ostrém webu. V podstatě protože si to „mohu dovolit“ – pokud vyskočí problém té vývojové verze tak ho fixnu, hodím pull request na github a jede se dál. Pro začátečníky je to trochu horší, ale v tuto chvíli je dev verze poměrně blízko od vydání 2.1 final takže se toho myslím nemusíš zas tak bát. Zásadních BC breaků už by moc být nemělo, snad kromě autorizátoru. Problémy v dev verzi nevyskakují zas až tak často – a jak jsi právě zjistil, někdy vyskakují klidně i ve stable takže je to v tomhle ohledu (dle mého soukromého názoru) píchni jak řízni.
EDIT: Pokud se rozhodneš pro dev verzi, dej si bacha na formuláře. Byl tam zásadní BC break ohledně chyb – dříve se všechny zobrazovaly nad formulářem, v dev verzi se zobrazují u jednotlivých prvků. Tato změna se neobešla bez zásadnějších změn v API. Jiná možnost je nechat si stable a zkopírovat si Database z dev verze – myslím že by měla fungovat. Jinak tu chybu jestli jsem to správně pochopil opraví tento řádek, což je další možnost – prostě ten řádek přidat do té stable verze. Vyber si co preferuješ. :-)
EDIT2: Ještě jsem si vzpomněl, že GitHub teď má i nějakou aplikaci pro windows. Když jsem začínal s Gitem tak neexistovala takže jsem ji nikdy nezkusil. Vůbec netuším co to umí nebo neumí.
Editoval enumag (27. 2. 2013 0:57)
- sejmor
- Člen | 63
Díky za vysvětlení. Mě to přišlo v quickstartu divný. Model tam v podstatě nic nedělal. Je fakt že jsem to používal např. u těch článků kde jsem to jenom jednoduše zavolal s konkrétním dotazem a výsledek poslal do šablony. ještě než jsi napsal poslední post tak jsem to u sebe na rychlo opravil … změnil jsem to např. u toho article z
use Nette\Database\Connection,
Nette\Database\Table\Selection;
class Article extends Selection
{
public function __construct(\Nette\Database\Connection $connection)
{
parent::__construct('article', $connection);
}
}
na:
use Nette\Database\Connection,
Nette\Object;
class Article extends Nette\Object {
private $database;
public function __construct(Nette\Database\Connection $database)
{
$this->database = $database;
}
public function getTable()
{
return($this->database->table('article'));
}
}
akorát jsem musel změnit volání z
$this->context->createArticle()->where(....)
na
$this->context->createArticle()->getTable()->where(...)
Upravil jsem to jenom na rychlo aby mi to běželo s tou dev verzí a určitě to není ideální ale už to není snad taková prasárna. Není tam něco do očí bijící ?
A co se týká GITu tak já už to zkoumal, ale spíš jsem přímo pro sebe nenašel zatím dostatečnej důvod – dělám menší až střední věci a hlavně sám. Takže hlavní devizu – práci v týmu – moc nevyužiju. Ale zase si o tom něco přečtu a vyzkouším.
Díky za vydatné info :-)
- enumag
- Člen | 2118
Jediná do očí bijící věc je používání $this->context, řešením jsou inject metody. Context se dneska bere jako víceméně deprecated i když to u něj není uvedeno.
A pár drobností:
- return se píše bez závorek
- Závorka { u class není na novém řádku (u funkcí a starého modelu ji na novém řádku máš)
- Máš tam use Nette\Object ale pak v extends to zbytečně opisuješ, totéž v konstruktoru u Connection
- Většinou chceš aby různé Repository měly společného předka, něco na tento způsob:
namespace Model;
class BaseRepository extends \Nette\Object
{
/** @var string */
protected $table;
//anotace pro lepší napovídání v IDE typu netbeans
//možná by mohlo být i private, na vytváření Seleciton máme metodu createSelection
/** @var \Nette\Database\Connection */
protected $connection;
public function __construct($table, \Nette\Database\Connection $connection)
{
$this->table = $table;
$this->connection = $connection;
}
public funciton findAll()
{
return $this->createSelection();
}
//jak už jsem řekl Selection není tabulka, vhodnější název metody je imho tento
//že to Connection má jako getTable je dle mého názoru chyba
//záměrně protected
protected function createSelection()
{
return $this->connection->getTable($this->table);
}
}
class ArticleRepository extends BaseRepository
{
public function __construct(\Nette\Database\Connection $connection)
{
parent::__construct('article', $connection);
}
}
EDIT: Ještě poznámka k tomu Gitu. Osobně jsem se velmi rychle naučil používat Git vždy a všude v podstatě na sebemenší prkotinu která se skládá z víc jak tří souborů. Bez ohledu na to zda na projektu pracuje ještě někdo další.
EDIT2: To BaseRepository jsem ještě drobně upravil.
Editoval enumag (27. 2. 2013 7:51)
- castamir
- Člen | 629
K tomu Gitu. Git pro Windows je fajn, ale když už, tak doporučuju propojit s Console. Získáš příkazovou řádku s příkazu win i linuxu.
Na začátku si vystačíš s naprostým minimem příkazu:
- git add – vytvoreni souboru / ulozeni zmen v souboru
- git commit – potvrzeni vsech dosavadnich zmen
- git push – nahraje na server vsechny commity
- git pull – stahne ze serveru commity, ktere nemas
- git clone – zkopirovani repozitare na lokal
zbytek si naklikas na GitHubu
- sejmor
- Člen | 63
Díky za nástin řešení. Je fakt, že podobně je to asi řešené v novém quickstartu. Já se přiznám že objekty jsem začal používat až s nette což je zhruba třičtvrtě roku a pořád jsou pro mě některé konstrukce dost abstraktní a zatím je sám takto nevymyslím takže se furt učím. Ale je fakt, že co jsem nette vyzkoušel tak dělám všechny nové věci v něm. Někdy to skřípe, protože to neznám, ale jindy mě to zase nadchne, protože je to mnohem průhlednější a větší věci se mnohem líp upravujou a rozšiřujou.
Ještě k tomu GITu, když jste se mi tak rozepsali. Budu se ptát asi na úplný základy a asi to ani do fóra o nette nepatří, ale zkusím to tak mi to promiňte.
Pokud to dobře chápu tak GIT je verzovací systém. Prostě ty zdrojáky co mám normálně na disku tak přes GIT hodím na nějaký server a tam je mám zazálohované s historií změn. Tak a teď: co je ten „nějaký server“ ? Musí to být nějaký „GIT server“ nebo stačí např. nasdílená složka třeba na NASu. Můžu použít nějaký free účet na GitHubu do kterého budu mít přístup jenom já a moje zdrojáky budou neveřejné ? Je přímá podpora v netbeans ? U projektu mám přímo přes pravé tlačítko „Initialize Git Repository“. V podstatě by mě zajímalo jak to používáš ty, když píšeš, že to využiješ i pro prkotinu se třemi soubory. A teď to hlavní co by mě zajímalo. Jde to nějak inteligentně využít pro nasazování na produkční server ? Jde mi o to, že třeba udělám nějaké změny v různých složkách – např. i ve veřejné (www) a potřebuji to nahrát na ostrý server. Používám pořád normální ftp, ale v poslední době jak projekty rostou už mě to nepřijde ideální. V tomto mi asi git moc nepomůže co ?
Možná bych se i přimluvil za nějaký článek do dokumentace s příkladem správy a publikování celého projektu. Pokud někde nějaký je tak si ho rád přečtu. Je fakt, že dlouhou dobu jsem to nepotřeboval – jsem stará struktura a 10 let jsem si vystačil s jednoduchým php, základy mysql, csskem a ftp v total commanderu. Doba ale pokročila takže se rád přiučím (beztak musím) jak novým technologiím tak postupům.
Díky moc za komentáře a hlavně Váš čas s nimi spojený.
- enumag
- Člen | 2118
Něco málo ti řeknu, ale jinak je o gitu na webu článků dost a navíc i kniha ProGit tuším i s českým překladem.
V každém případě kdžy používáš git, vůbec k tomu nepotřebuješ nějaký server. Máš prostě lokální repozitář, který případně můžeš propojit se vzdáleným(i) máš-li k tomu důvod – tím je typicky spolupráce s dalšími, zálohování… Když dělám prkotinu, lokální repo úplně stačí. Při spolupráci s dalšími chceš mít repozitáře buď public (v tom případě celkem jasně GitHub) nebo private (vlastní server nebo třeba Bitbucket pokud se ti nechce platit).
Pokud jde o deployment tak se dají nastavit hooky které ti při pushi rovnou vše check-outnou do složky s webem. Dokonce to umí i některé české hostingy (nepamatuju si teď které), ale jinak potřebuješ vlastní server a i pokud jej máš tak docela trvá si ten gitosis/gitolite/gitlab zprovoznit aby to běhalo. Navíc to vyžaduje podporu ze strany serveru, obecnější řešení najdeš např na Davidově blogu.
- enumag
- Člen | 2118
@castamir: Díky, vyzkouším. :-)
@sejmor: Brzy bude venku Nette 2.0.9, která obsahuje i ten potřebný fix.