Konfigurácia Doctrine 2 funkcií v Nette 2

- orech
 - Člen | 40
 
Zdravím,
našiel pre funkcie IF pre Doctrine QueryBuilder a teraz by som ju potreboval
niekde „zaregistrovať“.
http://stackoverflow.com/…at-or-anothe
Skúsil som to teda takto:
doctrine:
		connection: %database%
		console: true
		orm:
			dql:
				string_functions:
					IF: \vendor\doctrine\orm\lib\Doctrine\ORM\Query\AST\Functions\IfFunction
Stále ale dostanem chybu:
Doctrine\ORM\Query\QueryException
[Syntax Error] line 0, col 10: Error: Expected known function, got ‚IF‘
Vopred ďakujem za pomoc
EDIT: Odsadenie
Editoval orech (6. 8. 2013 12:33)

- orech
 - Člen | 40
 
Upravil som to tak, ako to je v config.neon. Neviem prečo to tam bolo pod sebou (nevenoval som tomu pozornosť :)).
Každopádne to s tým odsadením nejde. Podarilo sa mi to spraviť tak, že som miesto IF použil CASE WHEN. Ten Doctrine poznal.
Ale aj tak by ma zaujímalo, ako pridať funkcie do Doctrine v Nette. Raz som to už riešil pre DATE_FORMAT, no to som opäť vyriešil inak, cez „raw“ SQL.

- Filip Procházka
 - Moderator | 4668
 
Měl by jsi tam psát pouze namespace, nikoliv složky.
A v samotném Nette asi nijak, ale kdybys použil kdyby/doctrine, tak třeba
IfElse, bys po nainstalování beberlei/DoctrineExtensions
registroval takto
doctrine:
	dql:
		string:
			IfElse: DoctrineExtensions\Query\Mysql\IfElse
				
- orech
 - Člen | 40
 
Používam, resp. sa snažím použiť :), rovnaký balíček rozšírení. Skúsil som to cez config.neon, moc to nešlo. Dopátral som sa k zápisu:
doctrine:
	orm:
		dql:
			string:
				IfElse: DoctrineExtensions\Query\Mysql\IfElse
Ani s ním som však nebol úspečný. Zavolal som ešte v
bootstrap.php inicializáciu:
$classLoader = new \Doctrine\Common\ClassLoader('DoctrineExtensions', LIBS_DIR ."/DoctrineExtension/lib/DoctrineExtensions");
$classLoader->register();
Dotaz cez QueryBuilder, addSelect("IF ..."), mi stále vráti
Error: Expected known function, got ‚IF‘

- Filip Procházka
 - Moderator | 4668
 
Instaluješ to přes composer? Co vypíše
$ composer show --installed? Ukaž tu query. Ten zápis v neonu
máš blbě, je to přesně jak jsem napsal já :)

- orech
 - Člen | 40
 
Neinštalujem. Len som to stiahol a nakopčil.
Skúsil som to pomocou composeru. Mám Xampp na Windowse, takže composer a tie extensions som pozliepal z nasledovných:
http://www.naeemrana.com/…-in-windows/
http://mabraham.de/…2-verwenden/
Keď som dal daný príkaz, teda trochu upravený pre Windows, a dostal som toto:
D:\xampp\htdocs\my-web\libs\beberlei>php D:\xampp\php\composer.phar show --installed
doctrine/annotations v1.1.2 Docblock Annotations Parser
doctrine/cache       v1.3.0 Caching library offering an object-oriented API for many cache backends
doctrine/collections v1.1   Collections Abstraction library
doctrine/common      v2.4.1 Common Library for Doctrine projects
doctrine/dbal        v2.4.1 Database Abstraction Layer
doctrine/inflector   v1.0   Common String Manipulations with regard to casing an d singular/plural rules.
doctrine/lexer       v1.0   Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.
doctrine/orm         v2.4.1 Object-Relational-Mapper for PHP
symfony/console      v2.3.7 Symfony Console Component
Ozaj netuším, či je to, o čo si žiadal. Ak nie, tak potom pardón, je to prvý raz, čo som sa stretol s composerom :)

- Filip Procházka
 - Moderator | 4668
 
Aha, ale to máš pouze čistou doctrine, ta konfigurační sekce začne fungovat, až nainstaluješ i Kdyby/Doctrine

- orech
 - Člen | 40
 
Stiahol som zip z Gitu. Rozbalil som do /libs/kdyby (/libs mám to namiesto
/vendor). Nastavil som v composer.json (moja verzia Nette:
Nette Framework 2.0.8):
"require": {
        "nette/nette": "~2.0",
        "kdyby/doctrine": "~0.10"
    }
Potom som zavolal v priečinku:
D:\xampp\htdocs\my-web\libs\kdyby>php D:\xampp\php\composer.phar require kdyby/doctrine
Opýtalo sa ma to na nejakú verziu, tak som zadal 0.1 (podľa
(Pozn.: řada 0. je pro ~2.0@stable Nette, řada 1.* je pro
~2.1@dev Nette)*) a dostal som fail, že daná verzia neexistuje:
Please provide a version constraint for the kdyby/doctrine requirement: 0.1
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
  Problem 1
    - The requested package kdyby/doctrine 0.1 could not be found.
  Problem 2
    - Installation request for kdyby/doctrine 1.0.x-dev -> satisfiable by kdyby/doctrine[1.0.x-dev].
    - kdyby/doctrine 1.0.x-dev requires kdyby/doctrine 0.1 -> no matching package found.
Potential causes:
 - A typo in the package name
 - The package is not available in a stable-enough version according to your minimum-stability setting
   see <https://groups.google.com/d/topic/composer-dev/_g3ASeIFlrc/discussion> for more details.
Read <http://getcomposer.org/doc/articles/troubleshooting.md> for further common problems.
Installation failed, reverting ./composer.json to its original content.
Skúsil som verziu 1.0:
Please provide a version constraint for the kdyby/doctrine requirement: 1
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
  Problem 1
    - Installation request for kdyby/doctrine 1.0.x-dev -> satisfiable by kdyby/doctrine[1.0.x-dev].
    - Can only install one of: kdyby/doctrine[v1.0.0, 1.0.x-dev].
    - Installation request for kdyby/doctrine 1 -> satisfiable by kdyby/doctrine [v1.0.0].
Installation failed, reverting ./composer.json to its original content.
Zrejme mi niečo uchádza, no neviem čo :( (púšťam to z dobrého priečinka, alebo niečo treba ešte nastaviť…?)

- Filip Procházka
 - Moderator | 4668
 
Sakra ty v tom máš guláš :) Takže popořadě…
- nainstaluješ composer (to už máš)
 - nainstaluješ git
 - vlezeš do projektu a smažeš všechen bordel co sis udělal v
	
libs/nebovendor/, včetně Nette, Doctrine, Kdyby, .. - V 
composer.jsonbudeš mít tyto dvě závislosti 
"require": {
	"nette/nette": "~2.0",
	"kdyby/doctrine": "~0.10"
}
- spustíš 
composer update 
D:\xampp\htdocs\my-web\libs\kdyby>php D:\xampp\php\composer.phar update
tím se zapne instalace, composer sám stáhne všechny závislosti, sám je
rozbalí do libs/ nebo vendor/ a sám k nim
vygeneruje autoloader.
- do 
app/bootstrap.phppřidáš 
require_once __DIR__ . '/../libs/autoload.php';
tím načteš do aplikace autoloader co vygeneroval composer a už tam nemusíš mít řádek s require nette, protože i autoloading Nette řeší nyní Composer.
- profit
 
Možná zvaž ještě návštěvu Nette Jabber místonosti, kde ti poradíme líp, takhle přes fórum s tvojí dvoudenní reakční dobou to není nic moc :)

- orech
 - Člen | 40
 
No to teda mám :(
Composer aj Git mám (aj v env. premennej PATH). Neviem, aký bordel si
myslel, keďže sa mi tam nič nenatiahlo :) Mám tam len štandard, čo bol
v sandboxe. Každopádne, stiahol som čistý sandbox. Do
zložky sandbox/libs/ som vytvoril zložku kdyby, kam
som rozbalil všetko z https://github.com/kdyby/doctrine.
Štruktúra prnscr
Upravil som súbor sandbox/libs/kdyby/composer.json, iba som
zmenil pole/objekt "required" (riadok 18), nič iné som nemazal,
ani neprepisoval.
	...
	"issues": "https://github.com/kdyby/doctrine/issues"
},
"require": {
	"nette/nette": "~2.0",
	"kdyby/doctrine": "~0.10"
},
"require-dev": {
	"nette/tester": "@dev",
	...
Pustil som composer cez cmd.exe:
D:\xampp\htdocs\sandbox\libs\kdyby>php D:\xampp\php\composer.phar update
A dostal som nasledovný error:
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
  Problem 1
    - Conclusion: remove kdyby/doctrine 1.0.0
    - Can only install one of: kdyby/doctrine[v1.0.0, v0.10.0].
    - Can only install one of: kdyby/doctrine[v1.0.0, v0.10.1].
    - Can only install one of: kdyby/doctrine[v1.0.0, v0.10.2].
    - Can only install one of: kdyby/doctrine[v1.0.0, v0.10.3].
    - Installation request for kdyby/doctrine 1.0.0 -> satisfiable by kdyby/doctrine[1.0.0].
    - Installation request for kdyby/doctrine ~0.10 -> satisfiable by kdyby/doctrine[v0.10.0, v0.10.1, v0.10.2, v0.10.3].
Skúsil som to potom tak, že som premazal sandbox/libs/ úplne
a nechal tam len súbory .htaccess a web.config a
priečinok kdyby. Chyba ostala rovnaká.
Pokúsim sa odpisovať rýchlejšie, no toto riešim len keď sa mám chvíľu čas „hrať“ :) Vyslovene to nepotrebujem, no príde mi zaujímavé a hlavne užitočné a chcem to vedieť.

- orech
 - Člen | 40
 
Aha díky moc obom. Takže zmenil som len "require" hodnoty v
composer.json v roote zložky sandbox. Do libs sa mi
natiahli zložky nette, symphony, doctrine…je tam aj zložka kdyby.
EDIT:
Rovnako (iba zmenou „require“ v roote projektu) som nainštaloval DoctrineExtensions. (Návod: http://mabraham.de/…2-verwenden/)
Pridávam výpis:
D:\xampp\htdocs\vav-efektiv>php D:\xampp\php\composer.phar show --installed
beberlei/DoctrineExtensions v0.1
doctrine/annotations        v1.1.2  Docblock Annotations Parser
doctrine/cache              v1.3.0  Caching library offering an object-oriented API for many cache backends
doctrine/collections        v1.1    Collections Abstraction library
doctrine/common             v2.4.1  Common Library for Doctrine projects
doctrine/dbal               v2.4.1  Database Abstraction Layer
doctrine/inflector          v1.0    Common String Manipulations with regard to casing and singular/plural rules.
doctrine/lexer              v1.0    Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.
doctrine/orm                v2.4.1  Object-Relational-Mapper for PHP
kdyby/annotations           v1.0.1  Doctrine Annotations integration into Nette Framework
kdyby/console               v1.1.5  Symfony Console integration for Kdyby components
kdyby/doctrine              v0.10.3 Doctrine integration into Nette Framework
kdyby/doctrine-cache        v1.1    Doctrine Cache bridge for Nette Framework
kdyby/events                v1.2.4  Events for Nette Framework
nette/nette                 v2.0.13 Nette Framework - innovative framework for fast and easy development of secured web applications in PHP. Write less, have cleaner code and your work will bring you joy.
symfony/console             v2.3.7  Symfony Console Component
EDIT 2:
No chyba z neznámou fciou IF ostáva.
Editoval orech (20. 11. 2013 16:33)

- frosty22
 - Člen | 373
 
Tak Kdyby\Doctrine už máš nainstalované správně, teď otázka máš v NEONu uvedené, to co ti psal HosipLan? A zároveň otázka dvě, nevytváříš někde instanci Doctrine\EntityManageru? a používáš tu službu, kterou ti předá to extension do contajneru, čili Kdyby\Doctrine\EntityManager?

- orech
 - Člen | 40
 
V neone to mám tak, ako mi napísal HospiLan:
doctrine:
	connection: %database%
	console: true
	dql:
		string:
			IfElse: DoctrineExtensions\Query\Mysql\IfElse
Druhej časti moc nerozumiem. Kdyby mám zaregistrované v
app/bootstrap.php. https://github.com/…/en/index.md
Následne v neone:
services:
	database: @doctrine.entityManager
EDIT:
Upravil som neon:
extensions:
	console: Kdyby\Console\DI\ConsoleExtension
	events: Kdyby\Events\DI\EventsExtension
	annotations: Kdyby\Annotations\DI\AnnotationsExtension
	doctrine: Kdyby\Doctrine\DI\OrmExtension
doctrine:
	user: @parameters.database.user
	password: @parameters.database.password
	dbname: @parameters.database.dbname
	metadata:
		App: %appDir%
	#connection: %database%
	console: true
	dql:
		string:
			IfElse: DoctrineExtensions\Query\Mysql\IfElse
A dostanem chybovú hlášku: Found sections ‚extensions‘ in configuration, but corresponding extensions are missing.
Editoval orech (21. 11. 2013 8:39)

- jiri.pudil
 - Nette Blogger | 1034
 
V té dokumentaci
to možná není dost explicitně napsané: sekce extensions je
dostupná až v dev Nette. Ve 2.0 musíš volat statické metody
register.

- Filip Procházka
 - Moderator | 4668
 
Proč definuješ nějakou službu database? To vůbec není potřeba, prostě
si vyžádej Kdyby\Doctrine\EntityManager a nějaké jména služeb
úplně ignoruj.
Tvůj neon teď má vypadat takto:
doctrine:
    user: 'uzivatel'
    password: 'heslo'
    dbname: 'dbnae'
    metadata:
        App: %appDir%
    dql:
        string:
            IfElse: DoctrineExtensions\Query\Mysql\IfElse
Na parameters se vykašli, prostě to tam rovnou napiš. A navíc jsi to
měl stejně špatně, protože parameters se předávají pomocí
%, tak jako je v metadatech složka %appDir%

- orech
 - Člen | 40
 
database ďalej využívajú iné služby:
services:
	database: @doctrine.entityManager
	authenticator: UserModule\Authenticator( @database::getRepository('UserModule\User') )
	mapService: MapModule\Services\MapService( @database )
	#...atd
Tie rozšírenia pre MySQL som nakoniec rozbehal tak, že som pridal do
metódy injectEntityManager v BasePresenter.php:
$em->getConfiguration()->addCustomStringFunction('IF', 'DoctrineExtensions\Query\Mysql\IfElse');
				
- Jiří Nápravník
 - Člen | 710
 
orech napsal(a):
databaseďalej využívajú iné služby:services: database: @doctrine.entityManager authenticator: UserModule\Authenticator( @database::getRepository('UserModule\User') ) mapService: MapModule\Services\MapService( @database ) #...atd
Pokud používáš Kdyby\Doctrine, tak tohle není ideální, protoežý předáváš repository vytahané přes Doctrine EntityManager. V Kdyby bys měl využívat tzv. DAO objekty a pak by tedy měli ten config vypadat takto:
services:
	- UserModule\Authenticator( @doctrine.dao('UserModule\User') )
 	#...atd
předávání toho EntityManager jako máš u té mapservice je naprd. Správně je v neonu jen zapsat službu:
services:
	- MapModule\Services\MapService
a v konstruktoru te MapSerice uděláš konstruktor:
public __construct(\Kdyby\Doctrine\EntityManager $em){
...
}
A budeš tam mít automaticky ten entity manager díky autowire
pojmenovávat services, pokud k tomu nemáš rozumný důvod je zbytečné.

- Filip Procházka
 - Moderator | 4668
 
Pokud jsi repozitáře dědil, tak budeš mít problém, pokud ne, pojede to v pohodě.