„SQL translate error“ v případě addFile()

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

Vytvořil jsem si překladovou třídu, která podle zadaného indexu vyhledá překlad v DB.

Ale ve chvíli, kdy do formuláře přidám pole pro soubor addFile(), vyhodí dibi po odeslání výjimku se zprávou SQL translate error.
Trace začíná v dibi\libs\DibiConnection.php(255): DibiTranslator->translate(Array).

Vůbec nechápu, co je za problém.

Majkl578
Moderator | 1364
+
0
-

To my taky ne když jsi neuvedl ani řádek kódu.

Lawondyss
Člen | 106
+
0
-

Překladová třída

<?php
class Lang implements ITranslator
{
	/**
	 * Jazyk lokalizace
	 * @var string
	 */
	private static $lang;

	/**
	 * Modul lokalizace
	 * @var string
	 */
	private static $module;

	/**
	 * Pole se vsemi preklady
	 * @param array
	 */
	private static $translations;

	/***************
	 *   SETTERS   *
	 ***************/
	/**
	 * Nastavi jazyk lokalizace
	 * @param string $lang
	 */
	public static function setLang($lang)
	{	self::$lang = $lang;}

	/**
	 * Nastavi modul pro lokalizaci
	 * @param string $module
	 */
	public static function setModule($module)
	{	self::$module = $module;}

	/**
	 * Nastavi prekladSet translations
	 * @param array $translations
	 */
	public static function setTranslations($translations)
	{	self::$translations = $translations;}



	/***************
	 *   GETTERS   *
	 ***************/
	/**
	 * Vrati jazyk lokalizace
	 * @return string
	 */
	public static function getLang()
	{	return self::$lang;}

	/**
	 * Vrati modul lokalizace
	 * @return string
	 */
	public static function getModule()
	{	return self::$module;}

	/**
	 * Vrati preklady
	 * @return array
	 */
	public static function getTranslations()
	{	return self::$translations;}



	/**
	 * Konstruktor
	 * @param string $lang jazyk localizace
	 * @param string $module modul lokalizace
	 */
	public function __construct($lang='cz', $module=NULL)
	{
		self::setLang($lang);
		self::setModule($module);

		self::translateAll();
	}

	/**
	 * Implementovane rozhrani
	 * @param string $message text k prekladu
	 * @param int $count pocet //neimplementovano
	 */
	public function translate($message, $count=NULL)
	{
		return self::trl($message);
	}

	/**
	 * Return translation or ID
	 * @param string $idf
	 * @return string
	 */
	public static function trl($idf)
	{
		if(isset(self::$translations[$idf]))
		{
			return self::$translations[$idf];
		}
		else
		{
			return $idf;
		}
	}

	/**
	 * Load all translations
	 */
	public static function translateAll()
	{
		$sql[] = "
			SELECT [idf], [translate] FROM [translates]
			WHERE [language]=%s
		";
		$sql[] = self::getLang();

		if(self::getModule())
		{
			$sql[] = " AND [module]=%s";
			$sql[] = self::getModule();
		}

		self::$translations = dibi::query($sql)->fetchPairs('idf', 'translate');
	}
}
?>

Formulář a zpracování formuláře

<?php

/**
 * Formular
 */
function formPohovory($id=NULL)
{
	// vychozi hodnoty
	$defaults = array();
	if(isset($id))
	{
		$sql = "
			SELECT * FROM [ucastnici_pohovory]
			WHERE id=%s
			LIMIT 1
		";
		$defaults = dibi::fetch($sql, $id);
	}

	// definice formulare
	$form = new Form('pohovor');
	$form->setAction('#pohovory');

	$form->addHidden('id', $id);
	$form->addHidden('id_ucastnici', ID);
	$form->addHidden('id_user', ID_USER);

	$form->addGroup();
	$form->addSelect('typ_pohovoru', 'Typ pohovoru', $GLOBALS['typ_pohovoru'])
			->skipFirst('-- vyberte --')
			->addRule(Form::FILLED, 'Vyberte Typ pohovoru.');
	$form->addDate('datum', 'Datum')
			->addRule(Form::FILLED, 'Vyplňte Datum.');
	$form->addTextArea('poznamka', 'Poznámka');
	$form->addFile('priloha', 'Příloha');

	$form->addGroupButtons();
	$form->addSave('Uložit', 'img/bt_apply.png');

	$form->onSubmit[] = 'formPohovorySubmitted';

	// nastaveni vychozich hodnot
	if(!$form->isSubmitted())
	{
		$form->setDefaults($defaults);
	}

	$form->fireEvents();

	return $form;
}

/**
 * Zpracovani formulare
 */
function formPohovorySubmitted(Form $form)
{
	$values = $form->getValues();

	// INSERT
	if(!$values['id'])
	{
		try
		{
			dibi::query('INSERT INTO [ucastnici_pohovory]', $values);
			$GLOBALS['hlasky'][] = Lang::trl('Pohovor uložen.');

		}
		catch(Exception $e)
		{
			$form->addError(Lang::trl('Pohovor nebyl uložen.'));
			Developer::printDebug($e);
		}
	}
	// UPDATE
	else
	{
		// prelozeni ID
		$id = $values['id'];
		unset($values['id']);

		try
		{
			dibi::query('UPDATE [ucastnici_pohovory] SET', $values, 'WHERE id=%s', $id);
			$GLOBALS['hlasky'][] = Lang::trl('Pohovor uložen.');
		}
		catch(Exception $e)
		{
			$form->addError(Lang::trl('Pohovor nebyl uložen.'));
			Developer::printDebug($e);
		}
	}

	Generate::flashMessages($GLOBALS['hlasky']);

	// pokud je vse v poradku, vymaze formular
	if(!count($form->getErrors()))
	{
		$form->setValues(array(
			'id_ucastnici' => ID,
			'id_user' => ID_USER,
		), TRUE);
	}
}

echo formPohovory(POHOVOR);
?>

Pokud formulář odešlu, debug vyplivne tohle:

SQL translate error

#0 D:\Weby\projekty\EASYPORT\www\e2_2050\lib\dibi\libs\DibiConnection.php(255): DibiTranslator->translate(Array)
#1 D:\Weby\projekty\EASYPORT\www\e2_2050\lib\dibi\dibi.php(281): DibiConnection->query(Array)
#2 D:\Weby\projekty\EASYPORT\www\e2_2050\pages\ucastnici.php(807): dibi::query('INSERT INTO [uc...', Array)
#3 [internal function]: formPohovorySubmitted(Object(Form))
#4 D:\Weby\projekty\EASYPORT\www\e2_2050\lib\Nette\Utils\Callback.php(112): call_user_func_array('formPohovorySub...', Array)
#5 D:\Weby\projekty\EASYPORT\www\e2_2050\lib\Nette\Utils\ObjectMixin.php(56): NCallback->invokeArgs(Array)
#6 D:\Weby\projekty\EASYPORT\www\e2_2050\lib\Nette\Utils\Object.php(90): NObjectMixin::call(Object(Form), 'onSubmit', Array)
#7 [internal function]: NObject->__call('onSubmit', Array)
#8 D:\Weby\projekty\EASYPORT\www\e2_2050\lib\Nette\Forms\Form.php(447): Form->onSubmit(Object(Form))
#9 D:\Weby\projekty\EASYPORT\www\e2_2050\pages\ucastnici.php(790): NForm->fireEvents()
#10 D:\Weby\projekty\EASYPORT\www\e2_2050\pages\ucastnici.php(917): formPohovory(NULL)
#11 D:\Weby\projekty\EASYPORT\www\e2_2050\index.php(249): include('D:\Weby\projekt...')
#12 {main}
Majkl578
Moderator | 1364
+
0
-

Problém IMHO není v tvém překladači, ale na řádku kde ukládáš hodnoty do DB (tj. dibi::query('INSERT INTO [ucastnici_pohovory]', $values);) kde $values['priloha'] není string, ale objekt Nette\Web\HttpUploadedFile, který není konvertovatelný na string.

Lawondyss
Člen | 106
+
0
-

Občas si připadám jako lama.

Aurielle
Člen | 1281
+
0
-

Double posty, promažte to tu někdo prosím…