pgsql + volání dvou a více metod rozbíjí stránku

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

Ahoj,

děje se mi následující věc a popravdě nevím zda je chyba u mě a nebo jde o bug.

Konfigurace:
nette: 2.0.4
databaze: pgsql / Nette\Database

Config:

	services:
		authenticator: Authenticator
		objects: Objects
		relations: Relations

Presenter:

private $relations;
private $objects;
private $auth;

protected function startup()
{
	parent::startup();
	$this->relations = $this->context->relations;
	$this->objects = $this->context->objects;
	$this->auth = $this->context->authenticator;
}

protected function createComponentMap()
{
	return new Map($this->relations->findAll(),$this->objects->findPair('id','name'),$this);
}

Relations model: (objects a jiné modely / tabulky, jsou definovány stejně)

class Relations extends Table
{
	/** @var string */
	protected $tableName = 'relations';
}

A teď k chování.
Za tohoto savu dochází k rozbití šablony, kdy se posouvá body o 24px dolů (jako by byla margin-top: 24px). Pokud se na stránku koukám v IE, tak dojde někde k chybě JS, protože přestane fungovat jQuery a další skripty. V případě Chrome a Firefoxu pouze dochází k posunu body.

Pokud udělám následující změny, vše je ok:

private $relations;
private $objects;
private $auth;

protected function startup()
{
	parent::startup();
	/*
	$this->relations = $this->context->relations;
	$this->objects = $this->context->objects;
	*/
	$this->auth = $this->context->authenticator;
}

protected function createComponentMap()
{
	return new Map($this->context->relations->findAll(),$this->context->objects->findPair('id','name'),$this);
}

A nakonec, pokud jsou ve startup() zakomentovány všechny řádky až na jeden, tak k tomu nedochází, pouze při volání 2 a více modelů.

Fakt už nevím kde je problém. Když jsem používal MySQL, tak se nic podobného nedělo.

Edit:
PS: a laděna mlčí
PPS: tak zatím se mi podařilo zjistit, že modelů může být kolik chce, ale problém nastává u použití modelů s připojením na PostgreSQL. Budu hledat dál.

Editoval heekon (13. 8. 2012 14:01)

jtousek
Člen | 951
+
0
-

To body se neposune jen tak pro nic za nic. Otevři firebug a zjisti co píše JS konzole, jestli v HTML není něco co tam být nemá a co konkrétně způsobilo to posunutí.

heekon
Člen | 28
+
0
-

asi se na to opravdu podívám znovu, ale i když jsem vyhodil veškerý JS a odlinkoval CSS, tak to dělalo pořád, bez ohledu na to, zda jsem byl v produkčním nebo vývojovém módu … možná jsem něco přehlédl, ale rozhodně tam není žádný řádek navíc a vypadá to, že k posunu dochází mezi <body> a prvním výskytem <div>
pokud tam napíšu jakýkoliv text, objeví se v té mezeře, pokud za <body> dám hned <div>, tak stejně se tam posun udělá

pokud napíšu layout naprosto minimalizovaně s tím, že v templatu se nic nepředává, je prázdný

<html><head></head><body><div>test</div></body></html>

tak i když takto vypadá zdroj, výstup je posunutý

ale jak říkám, kouknu na to zítra znovu, jen je mi záhadou vliv modelů, které jsou připojené na PostgreSQL

Editoval heekon (13. 8. 2012 21:54)

jtousek
Člen | 951
+
0
-

Musel bych vidět tu stránku, tohle je moc nejasný.

heekon
Člen | 28
+
0
-

nemožné, je na lokálním serveru

jde v podstatě o sandbox s nastavením připojení na PostgreSQL databázi a žádnou velkou změnou v základním layoutu s tím, že HomepagePresenter vypadá zhruba tak jak jsem zasílal → renderDefault nic nepředává a default.latte nic neobsahuje, tedy věci co by měli mít vliv na zobrazování nejsou nijak ovlivňovány. Když volám metody a dávám do proměných, tak je neposílám do renderu.

Při chybě bych čekal laděnku.

Jak říkám, ještě si to prohlédnu zítra, zda tam není nějaká podivná anomálie. Zkusím udělat zálohu a znovu to samé na čistém sandboxu a případně udělám nějaké screeny a pošlu sem.

heekon
Člen | 28
+
0
-

tak už vidím problém, celý obsah <head> se přesouvá do <body>

<html debug="true">
<head/>
<body class=" js">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="description" content="test"/>
<title>TEST</title>
<link rel="stylesheet" media="screen,projection,tv" href="http://192.168.1.2/nette/css/screen.css" type="text/css"/>
<link rel="stylesheet" media="print" href="http://192.168.1.2/nette/css/print.css" type="text/css"/>
<link rel="shortcut icon" href="http://192.168.1.2/nette/favicon.ico" type="image/x-icon"/>
<script type="text/javascript" src="http://192.168.1.2/nette/js/jquery-1.8.0.min.js"/>
<script type="text/javascript" src="http://192.168.1.2/nette/js/raphael.js"/>
<script type="text/javascript" src="http://192.168.1.2/nette/js/netteForms.js"/>
<script type="text/javascript" src="http://192.168.1.2/nette/js/jquery.nette.js"/>
<style>
<script>
<div id="wrapper">
<script>
<div id="ajax-spinner" style="display: none; "/>
<div id="nette-debug" style="display: block; ">
<div/>

tak a co teď s tim :), tady bych řekl, že jde o bug nette

Konfigurace serveru:
PHP 5.4.5 | Server Apache/2.4.2 (Win32) mod_fcgid/2.3.7 | Nette Framework 2.0.4

Editoval heekon (14. 8. 2012 7:07)

heekon
Člen | 28
+
0
-

Vzorova konfigurace

config\config.neon

common:
	parameters:
		database:
			driver: pgsql
			host: 127.0.0.1
			dbname: postgres
			user: postgres
			password: postgres

	php:
		date.timezone: Europe/Prague
		# zlib.output_compression: yes


	nette:
		application:
			errorPresenter: Error

		session:
			expiration: 14 days

		database:
			default:
				dsn: '%database.driver%:host=%database.host%;dbname=%database.dbname%'
				user: %database.user%
				password: %database.password%
				debugger: true


	services:
		authenticator: Authenticator
		database: @Nette\Database\Connection


	factories:
		objects: Objects
		relations: Relations


production < common:

development < common:

model\Objects.php

<?php

use Nette\Database\Connection,
    Nette\Database\Table\Selection;


class Objects extends Selection
{
    public function __construct(\Nette\Database\Connection $connection)
    {
        parent::__construct('objects', $connection);
    }

}

model\Relations.php

<?php

use Nette\Database\Connection,
    Nette\Database\Table\Selection;


class Relations extends Selection
{
    public function __construct(\Nette\Database\Connection $connection)
    {
        parent::__construct('relations', $connection);
    }

}

HomepagePresenter:

<?php

/**
 * Homepage presenter.
 */
class HomepagePresenter extends BasePresenter
{

	protected function startup()
	{
		parent::startup();
		/**
		* dávám fetch(), aby se provedl dotaz (jen pro testování chyby)
		*/
		$this->context->createRelations()->fetch();
		$this->context->createObjects()->fetch();
	}

	public function renderDefault()
	{
		$this->template->anyVariable = 'any value';
	}

}

bootstrap.php

<?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->setDebugMode($configurator::AUTO);
$configurator->setDebugMode(array('192.168.1.2','192.168.1.3'));
$configurator->addConfig(__DIR__ . '/config/config.neon',
	$configurator->debugMode ? $configurator::PRODUCTION : $configurator::DEVELOPMENT);
$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();

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

// Setup router
$container->router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
$container->router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');


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

index.php

<?php

// uncomment this line if you must temporarily take down your site for maintenance
// require '.maintenance.php';

// absolute filesystem path to this web root
define('WWW_DIR', __DIR__);

// absolute filesystem path to the application root
define('APP_DIR', WWW_DIR . '/app');

// absolute filesystem path to the libraries
define('LIBS_DIR', WWW_DIR . '/libs');

// load bootstrap file
require APP_DIR . '/bootstrap.php';

NETTE_ROOT definuji pro spravne cesty aplikace

za tohoto stavu by to mělo chybu vyvolat

Editoval heekon (14. 8. 2012 8:20)

heekon
Člen | 28
+
0
-

Tak a dost :)

chybu jsem objevil, ale … je to vlastnost Nette a nebo moje chyba? Modely, které definují tabulky na něž se bude provádět select, tak musí být kódovány ne jako UTF-8, ale jako ASCII

Editoval heekon (14. 8. 2012 7:35)

Milo
Nette Core | 1283
+
0
-

Vše může být UTF-8. Nejedná se o BOM?