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

- Lawondyss
 - Člen | 106
 
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
 
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.