Přechod z Nette 2.0.4 na 2.0.5 a Nette

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

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
+
0
-

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
+
0
-

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
+
0
-

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)

Jan Tvrdík
Nette guru | 2595
+
0
-

Zkus {$book->category->name}.

kedrigern
Člen | 102
+
0
-

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)

vvoody
Člen | 910
+
0
-

Mozem poprosit dump db?

pawouk
Člen | 172
+
0
-

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)

pawouk
Člen | 172
+
0
-

To je divné, napadá mě ještě že by šlo o veliost písmen jak psal Honza Tvrdík. Ale jinak nevím. Nemůžeš někam hodit kus svého funkční aplikace na stžení/otestování?

kedrigern
Člen | 102
+
0
-

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
+
0
-

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
+
0
-

@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
+
0
-

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)

jtousek
Člen | 951
+
0
-

Když jsi mazal cache, smazals i journal?

kedrigern
Člen | 102
+
0
-

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
+
0
-

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)

vvoody
Člen | 910
+
0
-

Skusal si premenovat tie tabulky? Product ⇒ product

Patrik Votoček
Člen | 2221
+
0
-

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)

kedrigern
Člen | 102
+
0
-

Opravdu to začalo fungovat, když jsem použil jména tabulek s malými písmeny na začátku.

Je to možné?

pawouk
Člen | 172
+
0
-

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.

ViPEr*CZ*
Člen | 812
+
0
-

DiscoveredReflexion v nových verzích by to mělo mít ošetřené. Nevidím problém proč bych nemohl používat velká písmena v názvech. Jo používání takové diakritiky a speciálních znaků bych pochopil.

pawouk
Člen | 172
+
0
-

Samozřejmě že je používat můžeš, jen upozorňuji na možné komplikace… viz. celé toto vlákno.

pawouk
Člen | 172
+
0
-

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 :-)

jtousek
Člen | 951
+
0
-

@pawouk: Jak se to dá nastavit? A zajímavější otázka, lze to nastavení detekovat aby se Nette mohlo podle toho zařídit?

kedrigern
Člen | 102
+
0
-

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
+
0
-

@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í.

kedrigern
Člen | 102
+
0
-

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í.

vvoody
Člen | 910
+
0
-

Problem neni so stlpcami ale s nazvom tabulky. A neber to ako featuru, je to proste bug, ktory fixne zrejme tento commit

ViPEr*CZ*
Člen | 812
+
0
-

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

kedrigern
Člen | 102
+
0
-

OK, díky :). No hlavně, že jsem se dozvěděl čím to je :).