Přechod z Nette 2.0.4 na 2.0.5 a Nette
- kedrigern
- Člen | 102
Zdravím,
zkoušel jsem aktualizovat Nette 2.0.4 na 2.0.5 a rozsypala se práce s DB.
Nefungují automatické odkazy (funkce rel ) mezi tabulkama.
Když mám tabulku Task (obsahuje odkaz User_id) a User (Obsahuje sloupec name), tak mi nefunguje $task->user->name. Všechny tabulky jsou InnoDB a odkazy jsou v nich zaneseny (v Admineru jsou proklikávací).
Všiml jsem si, že je přepsán i Quickstart kvůli špatným praktikám, které jsem z něho předtím samozřejmě opsal.
Je někde uceleně sepsán soupis změn a nějaké dobré praktiky pro přechod? Mohu to nechat být a zůstat u 2.0.4, ale to se mi moc nelíbí.
Editoval kedrigern (19. 9. 2012 23:26)
- pawouk
- Člen | 172
Změn se pár stalo, ale to co ukazuješ by určitě mělo normálně fungovat. To jestli jsou to v admineru nastaveny jako cizí klíče je uplně fuk (pokud používáš výchozí ConventionalReflection). Pak se to bere ze sintaxe nikoliv z cizích klíčů. Každopádně mě to normálně funguje, můžeš sem dát kus svého kódu? Nezjednodušil jsi to nějak do fora?
Editoval pawouk (20. 9. 2012 11:02)
- Patrik Votoček
- Člen | 2221
pawouk napsal(a):
… Nette to bere ze sintaxe nikoliv z cizích klíčů (kvůli rychlosti) …
Ououou… Nejdříve si ověříme fakta než začneme něco tvrdit…
Nette\Database\Reflection\ConventionalReflection vs Nette\Database\Reflection\DiscoveredReflection
imho záleží jaký reflection „driver“ používá… (ve víchozím to je právě DiscoveredReflection)
Edit: co se týká praktik pro přechod z 2.0.4 na 2.0.5 v 99.9% případů není potřeba nic. Jedná se o setinkovou verzi která by měla být plně zpětně kompatabilní (tj. mělo by stačit auktualizovat a promazat cache).
- kedrigern
- Člen | 102
Model (dle původního QuickStartu):
<?php
use Nette\Database\Connection,
Nette\Database\Table\Selection;
class Book extends Selection
{
public function __construct(\Nette\Database\Connection $connection)
{
parent::__construct("Product", $connection);
}
}
Což mám zaregistrované v config.neon jako factory.
Presenter:
<?php
class HomepagePresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->books = $this->context->createBook()->where('visible')->where('published_date_formal < CURDATE()');
}
}
Template:
{block content}
{foreach $books as $book}
{$book->name} {$book->Category_id} {*{$book->Category->name}*}
{/foreach}
V Nette 2.0.4 funguje i jméno. V 2.0.5 to funguje jen, když je to takt zakomentované
Chyba v 2.0.5:
`PDOException
No reference found for $product->Category.`
Cache jsem promazával. Opravdu jsem jen nahrál jinou verzi Nette (zkusil jsem to víckrát tam a zpátky, jakmile jsem nahrál 2.0.4, tak to vždy začalo chodit).
Editoval kedrigern (20. 9. 2012 1:28)
- kedrigern
- Člen | 102
Nic.
Zbytek je jen sandbox – tohle jsem do něj dohodil pro zjednodušení.
Ještě mě napadá:
Apache
Server version: Apache/2.2.22 (Ubuntu)
Server built: Feb 13 2012 01:51:50
mysql
mysql Ver 14.14 Distrib 5.5.24, for debian-linux-gnu (x86_64) using
readline 6.2
Editoval kedrigern (20. 9. 2012 9:53)
- pawouk
- Člen | 172
Patrik Votoček napsal(a):
pawouk napsal(a):
… Nette to bere ze sintaxe nikoliv z cizích klíčů (kvůli rychlosti) …
Ououou… Nejdříve si ověříme fakta než začneme něco tvrdit…
Nette\Database\Reflection\ConventionalReflection vs Nette\Database\Reflection\DiscoveredReflection
imho záleží jaký reflection „driver“ používá… (ve víchozím to je právě DiscoveredReflection)
Edit: co se týká praktik pro přechod z 2.0.4 na 2.0.5 v 99.9% případů není potřeba nic. Jedná se o setinkovou verzi která by měla být plně zpětně kompatabilní (tj. mělo by stačit auktualizovat a promazat cache).
Myslím že v defaultu nette používá ConventionalReflection. Takže sintaxe. DiscoveredReflection jsem nezaznamenal. Dříve neexistovala. Takže jsem upravil svou reakci. Díky za upozrnění :-)
Editoval pawouk (20. 9. 2012 11:01)
- kedrigern
- Člen | 102
Teď jsem znovu vytvořil DB (fragment) a stále to samé z 2.0.4 (a např i 2.0.3) funguje. S 2.0.5 ne.
Hodil jsem důležité části (model, presenter, template, config, příkaz pro tvorbu db) na github: https://gist.github.com/3755466
Zbytek je sandbox z Nette 2.0.5.
- pawouk
- Člen | 172
Vše jsem si stáhnul a spustil a normálně mi to naběhlo:
{block content}
{foreach $books as $book}
{$book->name} {$book->Category_id} {$book->Category->name} <br /> <hr />
{/foreach}
výsledek:
Název 1 1 Kategorie 1
-----------------------------
Název 2 2 Kategorie 2
-----------------------------
Takže chyba je někde u tebe :-( jaký máš os, php atd…? Zkus znovu stáhnout nette, třeb to byla jen chyba stahování…
Editoval pawouk (20. 9. 2012 14:42)
- vvoody
- Člen | 910
@Pawouk ked sa pozres do db tak mas nazov tych tabuliek „Product“/„Category“ alebo „product“/„category“? Ja som pouzil dump od kedrigerna cez Adminer a tie nazvy tabuliek mi to vytvorilo s malymi pismenami. Neviem ci je to featura Admineru alebo MySQL ale problem bude urcite v tom. Bude to kvoli tomuto commitu. Od 2.0.5 si DiscoveredFerlection pyta v tomto pripade FK pre tabulku „products“ aj ked kedrigern ma zrejme v db „Products“.
@kedrigern skus zmenit tie nazovy tabuliek a malo by to ist, (neviem ci je to bug alebo featura :D) alebo bez zmeny tych nazvov by malo fungovat:
{$book->ref('Category','Category_id')->name}
Editoval vvoody (20. 9. 2012 14:58)
- kedrigern
- Člen | 102
Hmm to je fakt divné.
Právě teď jsem udělal toto:
wget https://files.nette.org/…5-PHP5.3.zip
unzip NetteFramework-2.0.5-PHP5.3.zip
rm NetteFramework-2.0.5-PHP5.3.zip
cd NetteFramework-2.0.5-PHP5.3/sandbox/app
vim config/config.neon #editace config.neon
vim templates/Homepage/default.latte #editace prezenteru
vim model/Book.php
vim presenters/HomepagePresenter.php
#DB nechvám stejnou: test
chmod -R 775 ../temp/
chown www-data:www-data ../temp
A výsledek je stejný. V Admineru je vše proklikávací,
Teď testuji na Ubuntu 12.04 (localhost). Jak jsem již psal tak:
mysql –version
mysql Ver 14.14 Distrib 5.5.24, for debian-linux-gnu (x86_64) using readline 6.2
apache2 -v
Server version: Apache/2.2.22 (Ubuntu)
Server built: Feb 13 2012 01:51:50
Editoval kedrigern (20. 9. 2012 15:03)
- kedrigern
- Člen | 102
Tak jsem si to i zautomatizoval: https://gist.github.com/3755977 a stále to samé.
Který journal kde? Je to btfj.dat? Tak ten jsem vždy smazal.
Zde je dump DB: https://gist.github.com/3756007
Editoval kedrigern (20. 9. 2012 15:42)
- kedrigern
- Člen | 102
Právě jsem zapnul druhý počítač, který jsem nepoužil skoro měsíc. DB jsem vytvořil z githubu a použil jsem ten skript. To samé! Skutečně nebyla přiležitost tam zavléct něco jiného, než je v tom gistu :(.
Na jakém OS jste to zkoušeli vy?
Ještě verze PHP by se mohla hodit:
php -v
PHP 5.3.10–1ubuntu3.4 with Suhosin-Patch (cli) (built: Sep 12 2012 18:59:41)
Copyright © 1997–2012 The PHP Group
Zend Engine v2.3.0, Copyright © 1998–2012 Zend Technologies
Editoval kedrigern (20. 9. 2012 16:42)
- Patrik Votoček
- Člen | 2221
pawouk napsal(a):
Myslím že v defaultu nette používá ConventionalReflection. Takže sintaxe.
Ty jsi to nečetl že?
(ve víchozím to je právě DiscoveredReflection)
- pawouk
- Člen | 172
To už jsme ti ale radili skoro na začátku :-). Problém mysql je v tom že jestli bude řešit upper case nebo ne se dá nastavit. Což je podle mě pěkná blbost. Nicméně je důležité to vědět. Řešení je snadné: nikdy nedávaj do názvů sloubců velké písmena pokud to uděláš nikdy nemáš jistotu na jaký hosting narazíš a kde ti to přestane fungovat. Možná to začalo někde řašit i nette. To nevím.
- pawouk
- Člen | 172
Patrik Votoček napsal(a):
pawouk napsal(a):
Myslím že v defaultu nette používá ConventionalReflection. Takže sintaxe.
Ty jsi to nečetl že?
(ve víchozím to je právě DiscoveredReflection)
Nojo, nečetl, to tam ale taky neni dlouho :-)
- kedrigern
- Člen | 102
pawouk: Ale hostingem to není. za prvé se mi to stalo na serveru, notebooku i desktopu a za druhé to chodilo s jinými verzemi Nette. Tohle se muselo změnit v Nette, což naráží na můj prvotní dotaz, že by mi stačil soupis takovýchto změn (changelog s upozorněním).
Děkuji moc za rady.
ViPErCZ: Ale viditelně to není ošetřeno.
No zaměním velká písmena v DB za malá a snad bude klid. Viditelně to bude lepší :).
Editoval kedrigern (20. 9. 2012 19:09)
- ViPEr*CZ*
- Člen | 812
@kedrigern: POZOR v 2.0.5 to ještě nefunguje!!! Funguje to na poslední větvi od hracha (asi se to projeví v dalším vydání což bude asi 2.0.6). Jsem toto s ním právě řešil. Na buntu mi běží názvy tabulek i sloupců s velkými písmeny. Běžně používáme například contactID pojmenování.
- ViPEr*CZ*
- Člen | 812
kedrigern napsal(a):
On není problém přímo v název sloupců, ale referencích imho. Jak se ten odkaz jmenuje.
Nicméně je to poněkud netriviální změna na dílčí vydání.
Mrkni ještě sem: https://forum.nette.org/…inux-serveru