Nette 2.0.8 a Dibi 2.0.1 – zprovoznění a použití

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

S Nette začínám a po několika peripetiích s QS jsem dosáhl kýženého výsledku.

Nyní se snažím (již několik dní) marně rozchodit Dibi podle zde umístěných návodů.
Návody https://doc.nette.org/cs/database nefungují a již nevím kam šáhnout.

Mohl by mi, prosím, někdo polopatě podat vysvětlení co vložit do config.neon, co do bootstrap.php, jaké použití v Presenteru a jaké v Modelu.
Dodám, že používám verzi php 5.3.13

Děkuji za reakce.

enumag
Člen | 2118
+
0
-

Spíše ukaž co v configu, bootstrapu a modelu máš teď, řekni co nefunguje a jakou to hází chybu.

Lonanek
Člen | 8
+
0
-

config:

common:
	php:
		date.timezone: Europe/Prague
		# session.save_path: "%tempDir%/sessions"
		zlib.output_compression: yes


	nette:
		session:
			autoStart: smart
		container:
			debugger: true

	parameters:

	services:
		authenticator: Authenticator
		routerFactory: RouterFactory
		router: @routerFactory::createRouter

		hra: Hra(@dibi.connection)

	dibi:
		driver: mysql
		host: localhost
		database: test
		username: root
		password:
		lazy: true

production < common:

development < common:

bootstrap:

<?php

/**
 * My Application bootstrap file.
 */
use Nette\Application\Routers\Route;


// Load Nette Framework
require LIBS_DIR . '/Nette/loader.php';


// Configure application
$configurator = new Nette\Config\Configurator;

// Enable Nette Debugger for error visualisation & logging
//$configurator->setProductionMode($configurator::AUTO);
$configurator->enableDebugger(__DIR__ . '/../log');

// Enable RobotLoader - this will load all classes automatically
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
	->addDirectory(APP_DIR)
	->addDirectory(LIBS_DIR)
	->register();

$configurator->onCompile[] = function ($configurator, $compiler) {
    $compiler->addExtension('dibi', new DibiNetteExtension);
};

// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config/config.neon');
$container = $configurator->createContainer();

// Configure and run the application!
$container->application->run();
?>

Model:

class Hra extends \Nette\Object {

	private $dibi;

	/**
	 * Constructor for the table books.
	 * First argument is name of table.
	 * @param  Nette\Database\Connection
	 */
	public function __construct(\DibiConnection $connection) {
		$this->dibi = $connection;
	}

	// výpis všech záznamů v tabulce HRA
	public function getHraAll() {
		return $this->dibi	->select('*')
							->from('hra')
							->fetch();
	}

	// výpis záznamů z tabulky HRA podle ID
	public function getHraByID($id) {
		return $this->dibi	->select('*')
							->from('hra')
							->where('id=%i', $id)
							->fetch();
	}

}

Hláška: "Ambiguous class IDataSource resolution; "

enumag
Člen | 2118
+
0
-

Ambiguous class IDataSource resolution

To vypadá jako kdybys tam to dibi měl dvakrát nebo jsi jej měl někde a pak přesunul jinam, zkus smazat cache (ve složce temp v tvé aplikaci).

Lonanek
Člen | 8
+
0
-

Vymazáno, pro jistotu jsem znovu zkontroloval lib se sandboxem, nahrál i originální www/index.php

Končím se stejnou chybou v bootstrap na ->register();

enumag
Člen | 2118
+
0
-

Dibi nepoužívám takže nevím. Zkusil bych nějakým dávkovým hledáním (např. PSPad) vyhledat řetězec „interface IDataSource“, měl by najít dva výskyty.

Lonanek
Člen | 8
+
0
-

Ano 2×.
\libs\dibi-2.0.1\API-reference\IDataSource.html
\libs\dibi-2.0.1\dibi\libs\interfaces.php

Jsem z toho na prášky, ale zatím to vzdát nechci. Z gitHubu stažená verze na nižší nette a dibi chodí.

Jen ještě tak trochu mimo toto téma.
Jak obejít cizí klíče? Např. z QS $task->user->name bez použití cizích klíčů.

enumag
Člen | 2118
+
0
-

Aha, tys totiž nakopíroval do libs nejen knihovnu, ale i API dokumentaci. Což je samozřejmě blbost. Struktura má být /libs/dibi/libs/interfaces.php. Cokoli jiného co bylo ve složce dibi-2.0.1 smaž nebo alespoň přesuň mimo libs.

Pozn. kdybys na instalaci používal composer, tak by se to nestalo i když chápu že to jako začátečník nepoužíváš.

EDIT: Jak fungují nebo nefungují cizí klíče v dibi opravdu nevím. V době jsem dibi používal tam nic takového pokud vím nebylo. :-)

Editoval enumag (7. 2. 2013 20:44)

Lonanek
Člen | 8
+
0
-

No někam jsem se hnul, ale stále laděnka řve. Snad si s tím už poradím…

Díky za Váš čas.

EDIT:
Jde mi spíše o to, jak v netteDatabase obejít elegantně cizí klíče.

Editoval Lonanek (7. 2. 2013 21:03)

enumag
Člen | 2118
+
0
-

Moment moment… co sem pleteš Nette\Database když používáš dibi? Ještě jsem neviděl že by někdo v rámci jednoho projektu použil obojí.

V Nette\Database cizí klíče nepotřebuješ pokud použiješ ConventionalReflection a budeš zapisovta názvy tabulek a sloupců dle definovaných konvencí.

Lonanek
Člen | 8
+
0
-

Nepoužívám oboje. Dibi zkouším.

Psal jsem – Jen ještě tak trochu mimo toto téma.
Díky, mrknu zda pochopím. Konvenci se snažím dodržovat vždy.

Hezký večer přeji.

Martin Černý
Člen | 5
+
0
-

Nenechal jsi v té dibi zároveň i minified verzi? Zkus jí smazat a uvidíš, jestli to pujde

xlilien
Člen | 27
+
0
-

Ahoj, zkus se podívat na sandbox nette + dibi na githubu, snad to pomůže

kmaci
Člen | 6
+
0
-

Ahoj,
díky za sandbox. Chtěl jsem se jen zeptat, co je potřeba přidat do nastavení, aby bylo možné psát dotazy ve tvaru dibi::query('SELECT * FROM [table] WHERE [id] = %i', $id); místo $this->db->select("*")->from("table")->where("id=%i", $id)->fetch(); apod.

Díky.

Tabetha
Člen | 140
+
0
-

Takto by si mal predať nastavenia confige

dibi::connect(array(
    'driver'   => 'mysql',
    'host'     => 'localhost',
    'username' => 'root',
    'password' => '***',
));

Naozaj škaredý spôsob…ale funguje …

dibi::connect($this->context->dibi->connection->config);

Editoval Tabetha (27. 2. 2013 14:01)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

kmaci Nejsem si jistý, který rozdíl je pro tebe důležitý :). Z dlouhodobého hlediska je lepší nepoužívat statické dibi::, ale volat vždy metody předávané instance. Metodu query můžeš normálně volat i nestaticky:

$this->db->query('SELECT * FROM [table] WHERE [id] = %i', $id);