In-Portal Developers Guide

This is a wiki-based Developers Guide for In-Portal Open Source CMS. The purpose of this guide is to provide advanced users, web developers and programmers with documentation on how to expand, customize and improve the functionality and the code the In-Portal software. Please consider contributing to our documentation writing effort.

K4:Ошибки общего применения

From In-Portal Developers Guide

Jump to: navigation, search

Revision as of 14:48, 13 January 2009


Обработка ошибок Обработка ошибок
Статьи в этой категории

Contents

Ошибка при выполнении SQL-запроса

Fatal Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near...

Вызов ошибки

Сообщение вызывается из метода kApplication::handleSQLError. Этот метод привязывается как обработчик ошибок к классу kDBConnection при инициализации класса kDBConnection, и затем вызывается в случае любой SQL-ошибки, полученной в результате запроса, сделанного посредством класса kDBConnection.

function handleSQLError($code, $msg, $sql)
{
	if ( isset($this->Debugger) )
	{
		$errorLevel = constOn('DBG_SQL_FAILURE') && !defined('IS_INSTALL') ? 
			E_USER_ERROR : E_USER_WARNING;
		$this->Debugger->appendTrace();
 
		$error_msg = '<span class="debug_error">'.$msg.' ('.$code.')</span><br>
			<a href="javascript:$Debugger.SetClipboard(\''.htmlspecialchars($sql).'\');">
				<b>SQL</b>
			</a>: '.$this->Debugger->formatSQL($sql);
		$long_id = $this->Debugger->mapLongError($error_msg);
		trigger_error( mb_substr($msg.' ('.$code.') ['.$sql.']',0,1000).' #'.$long_id, $errorLevel);
		return true;
	}
	else
	{
		//$errorLevel = constOn('IS_INSTALL') ? E_USER_WARNING : E_USER_ERROR;
		$errorLevel = E_USER_WARNING;
		trigger_error('<b>SQL Error</b> in sql: '.$sql.', code <b>'.$code.'</b> ('.$msg.')', $errorLevel);
		/*echo '<b>xProcessing SQL</b>: '.$sql.'<br>';
		echo '<b>Error ('.$code.'):</b> '.$msg.'<br>';*/
		return $errorLevel == E_USER_ERROR ? false : true;
	}
}

Метод kApplication::handleSQLError получает в виде параметров код ошибки ($code) и сообщение об ошибке ($msg), возвращённые SQL-сервером, а также сам SQL-запрос ($sql) и передаёт сформированное из них сообщение об ошибке в функцию trigger_error.

Получение ошибки

Запрос с ошибкой может получиться либо в результате неправильной конфигурации (например, прописанием несуществующего поля в ListSortings), либо в случае некорректного формирования SQL непосредстенно в коде модуля (например, открытая и не закрытая скобка при вызове функции языка SQL), либо в результате логических ошибок общего характера (например, при попытке вставить вторую запись с уже имеющимся в таблице значением уникального ключа.

Например, если написать тэг с кодом

$this->Application->Query('CREATE NEW USER');

и вставить этот таг в шаблон, то при открытии шаблона получим ошибку:

Fatal Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NEW USER' at line 1 (1064) SQL: CREATE NEW USER in w:\core\kernel\application.php on line 2327

Исправление ошибки

Для того, чтобы избежать такого рода ошибок, рекомендуется в первую очередь тщательно продумывать логику SQL-запросов, а затем тестировать систему во всех режимах с включённым DEBUG_MODE. Поскольку ошибка в DEBUG_MODE имеет уровень Fatal, её легко заметить, найти и исправить.

Также, рекомендуется при случае использовать методы класса kDBConnection, частично берущие на себя формирование SQL-запроса или его элементов - kDBConnection::qstr, kDBConnection::doInsert, kDBConnection::doUpdate.

Ошибка проверки объекта класса kDBItem

Notice: Validation failed in prefix...

Вызов ошибки

Сообщение вызывается из метода kDBItem::Validate в случае если при проверке выявились ошибки.

$error_msg = '	Validation failed in prefix <strong>'.$this->Prefix.'</strong>,	
	FieldErrors follow (look at items with <strong>"pseudo"</strong> key set)<br />	
	You may ignore this notice if submitted data really has a validation error';
trigger_error(trim($error_msg), E_USER_NOTICE);
$this->Application->Debugger->dumpVars($this->FieldErrors);

В функцию trigger_error передаётся префикс проверявшегося объекта. Также, для того чтобы было ясно какие именно ошибки в каких полях обнаружены, дополнительно в дебагере выводится массив FieldErrors проверявшегося объекта.

Получение ошибки

Чтобы такое сообщение получить можно попытаться зарегистрировать нового пользователя не заполнив обязательные для заполнения поля.

Notice: Validation failed in prefix u, FieldErrors follow (look at items with "pseudo" key set) You may ignore this notice if submitted data really has a validation error in w:\core\kernel\db\dbitem.php on line 496

Ошибка может происходить при импорте данных, в случае, если в импортируемых данных отсутствуют значения для обязательных полей, либо какие-то другие поля заданы неправильно.

Эта же ошибка произойдёт если все данные объекта заданы правильно, однако, имеется изъян в алгоритме проверки, из-за которого верные данные признаются негодными.

Исправление ошибки

Посмотреть в дебагере из-за каких полей произошла ошибка. Это те поля, у которых имеется ключ [pseudo]. Проверить, какие значения записаны в этих полях. Если значения негодные - исправить значения в источнике данных. Если значения полей хорошие - найти и исправить ошибку в алгоритме проверки.

Ошибка типа поля

Notice: Invalid field type numeric (in ValidateType method), please use float instead

Вызов ошибки

Сообщение вызывается из метода kDBItem::ValidateType в случае если в конфигурации для какого-нибудь поля задан тип numeric и значение поля не пустое. Ошибка может происходить при попытках создания объекта либо изменения данных объекта.

if ($params['type'] == 'numeric') {
	trigger_error('Invalid field type <strong>'.$params['type'].'</strong> (in ValidateType method),
		please use <strong>float</strong> instead', E_USER_NOTICE);
	$params['type'] = 'float';
}

В функцию trigger_error передаётся по сути всегда одна и та же строка.

Получение ошибки

Чтобы такое сообщение получить можно в конфигурации для какого-нибудь поля поставить 'type'=>'numeric'.

Notice: Invalid field type numeric (in ValidateType method), please use float instead in w:\core\kernel\db\dbitem.php on line 551

Исправление ошибки

Поскольку в сообщении не указано ни в каком объекте, ни какое поле вызвало ошибку, рекомендуется для начала посмотреть каков префикс объекта и как называется поле, проверив эти значения в момент выполнения вышеописанного кода. Затем следует проверить файл конфигурации соответствующего префикса, метод ОnAfterConfigRead обработчика событий соответствующего префикса и Hooks к этому методу на предмет выставления типа соответствкующего поля в 'numeric'. Найденное слово 'numeric' надо поменять на 'float'.

Отсутствие описания ошибки для поля

Warning: No user message is defined for pseudo error...

Вызов ошибки

Сообщение вызывается из метода kDBItem::GetErrorMsg в случае если при проверке объекта в поле выставлена ошибка, однако отсутствует описание для этой ошибки.

$err = getArrayValue($this->FieldErrors[$field], 'pseudo');
if (!$err) return '';
// if special error msg defined in config
if( isset($this->Fields[$field]['error_msgs'][$err]) )
{
	$msg = $this->Fields[$field]['error_msgs'][$err];
}
else //fall back to defaults
{
	if( !isset($this->ErrorMsgs[$err]) ) {
		trigger_error('No user message is defined for pseudo error <b>'.$err.'</b><br>', E_USER_WARNING);
		return $err; //return the pseudo itself
	}
	$msg = $this->ErrorMsgs[$err];
}

В функцию trigger_error передаётся код pseudo ошибки.

Получение ошибки

Такая ошибка получается, если при проверке объекта (например, в методе OnBeforeItemCreate) выставить в поле нестандартный код ошибки и не задать сообщение об ошибке.

$this->SetError('Login','too_long_username');

Warning: No user message is defined for pseudo error too_long_username in w:\core\kernel\db\dbitem.php on line 709

Исправление ошибки

Надо либо найти строку где выставляется ошибка на поле и добавить там описание ошибки.

$this->SetError('Login','too_long_username', 'lu_TooLongUsername');

Либо в конфигурации поля задать описание для такого кода pseudo.

'Login' => Array (
	'type' 			=> 'string', 
	'unique' 		=> Array ('Login'), 
	'default' 		=> null,
	'required'		=> 1, 
	'error_msgs' 		=> Array (
		'unique' 		=> '!lu_user_already_exist!',
		'too_long_username' 	=> '!lu_TooLongUsername!',
	)
)

Вызов метода Query для записи

Fatal Error: Query method is called in class some_class for prefix some_prefix

Вызов ошибки

Сообщение вызывается из метода kDBItem::Query. Как правило, это бывает в случае когда метод kDBItem::Query ошибочно вызывается вместо метода kDBList::Query.

function Query($force = false)
{
	if( $this->Application->isDebugMode() )
	{
		$this->Application->Debugger->appendTrace();
	}
	trigger_error('<b>Query</b> method is called in class <b>'.get_class($this).'</b> 
		for prefix <b>'.$this->getPrefixSpecial().'</b>', E_USER_ERROR);
}

В функцию trigger_error передаётся название класса из которого произошёл вызов метода kDBItem::Query и ещё передаётся префикс, с которым был создан объект этого класса.

Получение ошибки

Такая ошибка получается если на странице надо использовать функциональность списка kDBList, однако первым в шаблоне попадается таг, создающий под тем же префиксом объект класса kDBItem.

<inp2:u_Field name="Login"/>
<inp2:u_PrintList2 render_as="user_block"/>

Fatal Error: Query method is called in class useritem for prefix u in w:\core\kernel\db\dbitem.php on line 1149

Исправление ошибки

Исправить такую ошибку можно, задав в тэгах, использующих функциональность списка, другой Special.

<inp2:u_Field name="Login"/>
<inp2:u.friends_PrintList2 render_as="user_block"/>

Ещё можно исправить, поставив в шаблоне первым такой тэг, который создаёт под префиксом объект класса kDBList. При этом надо убедиться что не нарушилась функциональность тэгов, ранее использовавших kDBItem под этим префиксом.

<inp2:u_InitList/>
<!--Здесь могут располагаться тэги, инициализирующие префикс как kDBItem -->
<inp2:u_PrintList2 render_as="user_block"/>

Вызов устаревшего метода SetWhereClause

Fatal Error: Depricated method kDBList->SetWhereClause. Use kDBList->addFilter instead.

Вызов ошибки

Сообщение вызывается из метода kDBlist::SetWhereClause.

function SetWhereClause($clause)
{
	if( $this->Application->isDebugMode() )
	{
		global $debugger;
		$debugger->appendTrace();
	}
	trigger_error('Depricated method <b>kDBList->SetWhereClause</b>. 
		Use <b>kDBList->addFilter</b> instead.', E_USER_ERROR);
}

В функцию trigger_error передаётся всегда одна и та же строка.

Получение ошибки

Такая ошибка получается если в методе SetCustomQuery, где обычно происходит добавление фильтров к списку, вместо метода kDBList::addFilter вызвать устаревший метод kDBlist::SetWhereClause, актуальный лишь для старых версий платформы.

$object->SetWhereClause('Status = 1');

Fatal Error: Depricated method kDBList->SetWhereClause. Use kDBList->addFilter instead in w:\core\kernel\db\dblist.php on line 551

Исправление ошибки

Исправить такую ошибку можно, вызвав вместо метода kDBlist::SetWhereClause метод kDBList::addFilter.

$object->addFilter('Status = 1');

Попытка установить сортировку по несуществующему полю

Warning: Incorrect sorting defined (field = some_field; direction = some_direction) in config for prefix some_prefix.

Вызов ошибки

Сообщение вызывается из метода kDBlist::AddOrderField. Этот метод вызывается при инициализации списка (установка сортировки по умолчанию), а также при смене сортировки списка пользователем (посредствм события OnSetSorting).

if (!isset($this->Fields[$field]) && $field != 'RAND()' && !$is_expression) {
	trigger_error('<span class="debug_error">Incorrect sorting</span> 
		defined (field = <b>'.$field.'</b>; direction = <b>'.$direction.'</b>) 
		in config for prefix <b>'.$this->Prefix.'</b>', E_USER_WARNING);
}

В функцию trigger_error передаётся название поля, по которому пытались сделать сортировку, направление сортировки, которое хотели задать, и префикс, в объекте которого произошла ошибка.

Получение ошибки

Такая ошибка получается если при сборке шаблона пользовательской части сайта некорректно указать имя поля в компоненте управлетия сортировкой. В примере - LastPostDeit написано вместо LastPostDate.

<select onchange="javascript:resort_grid('bb.topics',this.value);">
	<option <inp2:m_if check="bb.topics_IsOrder" field="LastPostDate">selected</inp2:m_if> 
		value="LastPostDeit"><inp2:m_Phrase name="lu_Last_Updated"/></option>
	<option <inp2:m_if check="bb.topics_IsOrder" field="Posts">selected</inp2:m_if> 
		value="Posts"><inp2:m_Phrase name="lu_MostPosts"/></option>
</select>

Warning: Incorrect sorting defined (field = LastPostDeit; direction = desc) in config for prefix bb.topics. in w:\core\kernel\db\dblist.php on line 636

Исправление ошибки

Для исправления ошибки надо обеспечить передачу в запрос правильного значения поля.

<select onchange="javascript:resort_grid('bb.topics',this.value);">
	<option <inp2:m_if check="bb.topics_IsOrder" field="LastPostDate">selected</inp2:m_if> 
		value="LastPostDate"><inp2:m_Phrase name="lu_Last_Updated"/></option>
	<option <inp2:m_if check="bb.topics_IsOrder" field="Posts">selected</inp2:m_if> 
		value="Posts"><inp2:m_Phrase name="lu_MostPosts"/></option>
</select>

Попытка получить значение несуществующего поля

Warning: Field some_field doesn't exist in prefix some_prefix

Вызов ошибки

Сообщение вызывается из метода kDBlist::GetDBField в случае, если в записи отсутсттвует запрашиваемое поле.

if (defined('DEBUG_MODE') && DEBUG_MODE && $this->Queried && !array_key_exists($name, $row)) {
	if ($this->Application->isDebugMode()) {
		$this->Application->Debugger->appendTrace();
	}
 
	trigger_error('Field "<strong>' . $name . '</strong>" 
		doesn\'t exist in prefix 
		<strong>' . $this->getPrefixSpecial() . '</strong>', E_USER_WARNING);
	return 'NO SUCH FIELD';
}

В функцию trigger_error передаётся название поля, значение которого пытались получить, и префикс, в объекте которого произошла ошибка.

Получение ошибки

Такую ошибку можно получить если при сборке шаблона пользовательской части сайта, в блоке для отображения данных записи некорректно указать название поля, и затем вывести список используя этот блок.

<inp2:m_DefineElement name="user_block">
	<inp2:Field name="Longin"/><br/>
</inp2:m_DefineElement>
<inp2:u_PrintList2 render_as="user_block"/>

Warning: Field "Longin" doesn't exist in prefix u in w:\core\kernel\db\dblist.php on line 711

Исправление ошибки

Для исправления ошибки надо правильно прописать название поля.

<inp2:m_DefineElement name="user_block">
	<inp2:Field name="Login"/><br/>
</inp2:m_DefineElement>
<inp2:u_PrintList2 render_as="user_block"/>

Неудачная попытка подключения к серверу базы данных

Fatal Error: Database connection failed, please check your connection settings

Вызов ошибки

Сообщение вызывается из метода kDBConnection::Connect в случае, если не удалось установить соединение с сервером базы данных.

$this->connectionID = $func($host, $user, $pass, $force_new) 
	or trigger_error("Database connection failed, 
		please check your connection settings", 
		defined('IS_INSTALL') && IS_INSTALL ? E_USER_WARNING : E_USER_ERROR);
}

В функцию trigger_error всегда передаётся одна и та же строка.

Получение ошибки

Такую ошибку можно получить если в файле config.php неправильно указать логин или пароль доступа к базе данных. Например, если файл config.php просто скопировать с одного сервера на другой, не заменив лигин и пароль в соответствии с настройками нового сервера.

DBHost = "localhost"
DBUser = "dev_user"
DBUserPassword = "dev_password"

Fatal Error: Database connection failed, please check your connection settings in w:\core\kernel\db\db_connection.php on line 215

Исправление ошибки

Для исправления ошибки надо правильно прописать имя пользователя и пароль к серверу базы данных.

DBHost = "localhost"
DBUser = "live_user"
DBUserPassword = "live_password"

Отсутствует класс для создания запрошенного объекта

Fatal Error: RealClass not defined for pseudo_class some_pseudo_class

Вызов ошибки

Сообщение вызывается из метода kFactory::getObject (реже - из метода kFactory::getObjectP) при попытке создания неизвестного системе класса.

if (!isset($this->realClasses[$pseudo_class]))
{
	if( $this->Application->isDebugMode() ) $this->Application->Debugger->appendTrace();
	$error_level = $this->Application->isInstalled() ? E_USER_ERROR : E_USER_WARNING;
	trigger_error('RealClass not defined for pseudo_class <b>'.$pseudo_class.'</b>', $error_level);
	$false = false;
	return $false;
}

В функцию trigger_error передаётся название псевдокласса.

Получение ошибки

Такую ошибку можно получить если в шаблоне для какого-нибулдь тэга указать неизвестный системе префикс. Префикс может оказаться неизвестным системе:

  • в результате опечатки при написании префикса в шаблоне
  • из-за отсутствия в системе модуля, в котором определён префикс
  • из-за отсутсявия лицензии на модуль, в котором определён префикс
  • по причине ошибки в конфигурации модуля

Например, префикс может оказаться вовсе не указан, если поля из блока для отображения списка скопированы и используются для отображения одной записи.

<inp2:Field name="Login"/>

Fatal Error: RealClass not defined for pseudo_class _TagProcessor in w:\core\kernel\utility\factory.php on line 91

Исправление ошибки

Для исправления ошибки надо в шаблоне правильно прописать префикс.

<inp2:u_Field name="Login"/>

Если это не помогает - надо выяснить почему в системе оказался не зарегистрирован показанный в сообщеннии об ошибке псевдокласс и, устранив эти причины, обеспечить регистрацию псевдокласса.

Класс не зарегистрирован

Fatal Error: Real Class some_real_class is not registered with the Factory

Вызов ошибки

Сообщение вызывается из метода kFactory::includeClassFile в случае, если класс ещё не объявлен и следует сделать include файла, содержащего объявление класса, однако, имя файла неизвестно, поскольку класс не зарегистрирован в системе должным образом.

if (class_exists($real_class)) return;
if(!isset($this->Files[$real_class])) {
	trigger_error('Real Class <b>'.$real_class.'</b> 
		is not registered with the Factory', E_USER_ERROR);
}

В функцию trigger_error передаётся название класса.

Получение ошибки

Ошибка может получиться если при добавлении в систему нового класса (например, helper), не указать в конфигурации имя файла, содержащего объявление класса.

'RegisterClasses' => Array(
	Array(
		'pseudo' 		=> 'MyFancyHelper', 
		'class' 		=> 'MyFancyHelper', 
		'build_event' 		=> '', 
		'require_classes' 	=> 'kHelper'
	),
)


В таком случае система не знает как добраться до файла с новым классом и при попытке получить объект нового класса

$MyFancyHelper =& $this->Application->recallObject('MyFancyHelper');

возникает ошибка

Fatal Error: RealClass MyFancyHelper is not registered with the Factory in w:\core\kernel\utility\factory.php on line 201

Исправление ошибки

Чтобы исправить ошибку надо вписать имя файла в конфигурацию и затем перестроить кэш конфигурации.

'RegisterClasses' => Array(
	Array(
		'pseudo' 		=> 'MyFancyHelper', 
		'class' 		=> 'MyFancyHelper', 
		'file' 			=> 'my_fancy_helper.php', 
		'build_event' 		=> '', 
		'require_classes' 	=> 'kHelper'
	),
)


Нет файла с объявлением класса

Include file for class some_class (/home/web/custom/units/some_unit/helpers/my_fanct_helper.php) does not exists

Вызов ошибки

Сообщение вызывается из метода kFactory::includeClassFile в случае, если класс ещё не объявлен и следует сделать include файла, содержащего объявление класса, однако такой файл не существует.

if(!file_exists(FULL_PATH.$this->Files[$real_class])) {
	trigger_error('Include file for class <b>'.$real_class.'</b> 
		(<b>'.FULL_PATH.$this->Files[$real_class].'</b>) does not exists', E_USER_ERROR);
}

В функцию trigger_error передаётся название класса и путь по которому должен находиться файл с объявлением класса.

Получение ошибки

Ошибка может получиться если над проектом одновременно работают несколько человек, используя общую базу данных, и один из этих разработчиков добавил в проект новые классы, однако, не поместил их в CVS, либо поместил, но второй разработчик не обновил файлы из CVS. Например, если не добавить в CVS файл my_fancy_helper.php, то у других разработчиков появятся ошибки:

Include file for class MyFancyHelper (/home/web/custom/units/some_unit/helpers/my_fancy_helper.php) does not exists in w:\core\kernel\utility\factory.php on line 204

Исправление ошибки

Чтобы таких ошибок не было рекомендуется сразу же после добавления новых классов в проект, даже если ещё не дописана полностью их функциональность, помещать их в CVS. Если же такая ошибка всё же произошла, надо обновить файлы проекта из CVS.


Ошибка в поле remove_specials

Warning: Incorrect usage of "remove_specials" field (no special found)

Вызов ошибки

Ошибка возникает в фазе инициализации WEB-приложения, при инициализации объекта kHTTPQuery, в случае, если в массиве remove_specials, приходящем в запросе, есть хотябы один элемент без точки.

function Init($prefix, $special)
{
	$this->AddAllVars();
 
	$this->specialsToRemove = $this->Get('remove_specials');
	if ($this->specialsToRemove) {
		foreach ($this->specialsToRemove as $prefix_special => $flag) {
			if ($flag && strpos($prefix_special, '.') === false) {
				unset($this->specialsToRemove[$prefix_special]);
				trigger_error('Incorrect usage of 
					"<strong>remove_specials['.$prefix_special.']</strong>" 
					field (no special found)', E_USER_WARNING);
			}
		}
		$this->_Params = $this->removeSpecials($this->_Params);
	}
	ini_set('magic_quotes_gpc', 0);
}

Функциональность removeSpecials используется для предварительной обработки данных HTTP-запроса, и состоит в замене имён полей HTTP-запроса, имеющих вид Prefix.Special на Prefix. Замена производится только для имён, указанных в массиве remove_specials. Если имя, подлежащее замене не содержит точки, разделяющей Prefix и Special, то замена этого значения не производится и выдаётся предупреждение.

В функцию trigger_error передаются Prefix и Special как они были записаны в некорректном элементе массива remove_specials.

Получение ошибки

Функциональность removeSpecials часто используется для того, чтобы из нескольких списков с разными Special открывать один и тот же шаблон редактирования объектов. Special, характерный для списка убирается, а общий шаблон редактирования делается под вариант когда Special отсутствует.

Соответственно, чтобы получить такую ошибку можно в шаблоне in-commerce/admin_temolates/orders/orders_processed_list.tpl

вместо

set_hidden_field('remove_specials[ord.processed]',1);

написать

set_hidden_field('remove_specials[ord]',1);

Warning: Incorrect usage of "ord" field (no special found) in w:\core\kernel\utility\http_query.php on line 98

Исправление ошибки

Для того, чтобы такого рода ошибки не возникали, надо в массив remove_specials писать только разделённые точкой значения Prefix и Special.

Нет прав для записи в лог запросов

Warning: Requrest Log directory not writable

Вызов ошибки

Ошибка возникает в фазе инициализации WEB-приложения, если надо сделать запись в лог запросов, но не удаётся открыть файл этого лога для записи. Запись в лог запросов делается только когда запрос исходит от залогиненного пользователя и когда определена константа DBG_REQUREST_LOG. В этой константе должно находиться имя лог-файла, записанное по отношению к каталогу сайта - значение этой константы передаётся в качестве параметра $filename в нижеприведенный метод kHTTPQuery::writeRequestLog.

function writeRequestLog($filename)
{
	$folder_path = dirname(FULL_PATH.'/'.$filename);
	if (is_writable($folder_path)) {
		$fp = fopen(FULL_PATH.'/'.$filename, 'a');
		if ($fp) {
			$session =& $this->Application->recallObject('Session');
			$user_id = $session->GetField('PortalUserId');
			$admin_mark = $this->Application->IsAdmin() ? 'ADMIN' : 'FRONT';
 
			$data = '['.date('D M d H:i:s Y').'] '.$admin_mark.'; ip: '.$_SERVER['REMOTE_ADDR'].'; user_id: '.$user_id.'; sid: '.$this->Application->GetSID().'; request: '."\n";
			if ($this->Get) {
				$data .= "_GET:\n".print_r($this->Get, true);
			}
 
			if ($this->Post) {
				$data .= "_POST:\n".print_r($this->Post, true);
			}
 
			if ($this->Cookie) {
				$data .= "_COOKIE:\n".print_r($this->Cookie, true);
			}
			$data .= str_repeat('=', 100)."\n";
 
			fwrite($fp, $data);
			fclose($fp);
		}
		else {
			trigger_error('Requrest Log directory not writable', E_USER_WARNING);
		}
	}
	else {
		trigger_error('Requrest Log directory not writable', E_USER_WARNING);
	}
}

В функцию trigger_error передаётся всегда одна и та же строка.

Получение ошибки

Для получения ошибки надо в файлe debug.php определить константу DBG_REQUREST_LOG, но не указывать в ней файл, в который WEB-сервер имеет право писать.

Warning: Requrest Log directory not writable in w:\core\kernel\utility\http_query.php on line 564

Исправление ошибки

Чтобы исправить такую ошибку надо посмотреть какой каталог и какой файл указаны в константе DBG_REQUREST_LOG, обеспечить чтобы такой каталог и такой файл существовали, и дать WEB-серверу права записи в этот каталог и в этот файл.


Ошибка неизвестного типа

Fatal Error: Unknown error type ...

Вызов ошибки

Ошибка возникает в методе Debugger::saveError в случае если первым параметром в неё передан неизвестный код. Распознавание кодов происходит в методе Debugger::getErrorNameByCode, a сами коды попадают в Debugger::saveError из-за того, что Debugger::saveError прописывается как один из внутренних обработчиков ошибок в свойстве errorHandlers класса kApplication, и при каждой ошибке вызывается из главного обработчика ошибок - kApplication::handleError.

function getErrorNameByCode($error_code)
{
	$error_map = Array(
						'Fatal Error' 	=>	Array(E_USER_ERROR),
						'Warning'		=>	Array(E_WARNING, E_USER_WARNING),
						'Notice'		=>	Array(E_NOTICE, E_USER_NOTICE),
				);
 
	if (defined('E_STRICT')) {
		$error_map['PHP5 Strict'] = Array(E_STRICT);
	}
 
	if (defined('E_RECOVERABLE_ERROR')) {
		$error_map['Fatal Error (recoverable)'] = Array(E_RECOVERABLE_ERROR);
	}
 
	foreach ($error_map as $error_name => $error_codes) {
		if (in_array($error_code, $error_codes)) {
			return $error_name;
		}
	}
 
	return '';
}
function saveError($errno, $errstr, $errfile = '', $errline = '', $errcontext = '')
{
	$this->ProfilerData['error_handling']['begins'] = memory_get_usage();
 
	$errorType = $this->getErrorNameByCode($errno);
	if (!$errorType) {
		trigger_error('Unknown error type ['.$errno.']', E_USER_ERROR);
		return false;
	}
 
	...
}

В функцию trigger_error передаётся код ошибки, которую не удалось распознать.

Получение ошибки

Такая ошибка может получиться если PHP выдаст код ошибки, который не распознаётся методом Debugger::getErrorNameByCode.

Fatal Error: Unknown error type some_error_code in w:\core\kernel\utility\debugger.php on line 1259

Исправление ошибки

В таком случае надо либо поменять версию PHP на сервере, либо переопределить метод Debugger::getErrorNameByCode чтобы он распознавал этот новый код ошибки.

Ошибка при работе с удалённым портом (Socket)

Warning: not connected

Сообщение имеет статус Warning, а его содержание может быть практически любым, поскольку в нём показывается описание ошибки, полученное из удалённой системы.

Вызов ошибки

Ошибка возникает в методе kSocket::raiseError. Этот метод вызывается в случае неудачной попытки подключения к порту, а также при попытках обращения к неподключенному порту.

function raiseError($text, $params = Array())
{
	trigger_error(vsprintf($text, $params), E_USER_WARNING);
	return false;
}
 
function readLine()
{
    if (!is_resource($this->fp)) {
        return $this->raiseError('not connected');
    }
	...

В функцию trigger_error может передаваться текст:

  • not connected - при попытке обращения к неподключённому порту
  • host address cannot be empty - при попытке подключения к удалённому порт без указания адреса
  • любой текст - сообщение удалённой системы в случае отказа в подключении

Получение ошибки

Класс kSocket используется для отправки электронной почты, поэтому для получения ошибки можно указать неверные значения Smtp_Server и Smtp_Port в таблице конфигурации ConfigurationValues.

Warning: autentification required in in w:\core\kernel\utility\socket.php on line 356

Исправление ошибки

В случае сообщения not connected надо убедиться что происходит попытка подкоючения к удалённому порту.

В случае сообщения host address cannot be empty надо задать адрес для подключения к удалённому порту.

В случае других сообщений надо проверять правильность заданных адреса и номера порта, и если они заданы правильно - обратиться к спецификации удалённой системы для выяснения смысла получаемых сообщений об ошибке.


Неправильная строка события

Fatal Error: Invalid event string some_event_string should be prefix[.special]:OnEvent

Вызов ошибки

Ошибка вызывается в конструкторе класса kEvent в случае если первый параметр представлен в виде строки, и эта строка задана неправильно, то есть, из неё не получится извлечь необходимые данные - Prefix, Special и имя события.

elseif ($params && is_string($params)) {
	if (preg_match('/([^.:]*)[.]{0,1}([^:]*):(.*)/', $params, $regs)) {
		$prefix = $regs[1];
		$special = $regs[2];
		if($prefix) $this->Init($prefix,$special);
		$this->Name = $regs[3];
	}
	else {
		trigger_error('Invalid event string '.$params.' should be prefix[.special]:OnEvent ', E_USER_ERROR);
	}
}

В функцию trigger_error передаётся неправильно оформленная строка, из-за которой происходит ошибка.

Получение ошибки

Для получения ошибки можно изменить код orders_event_handler.php:

$affiliate_event = new kEvent('affil->OnOrderApprove');

Fatal Error: Invalid event string affil->OnOrderApprove should be prefix[.special]:OnEvent in in w:\core\kernel\utility\event.php on line 144

Исправление ошибки

Параметр для конструктора события kEvent надо задавать в формате prefix[.special]:OnEvent, то есть, в конкретном случае надо поставить правильный разделитель между Prefix и именем события.

$affiliate_event = new kEvent('affil:OnOrderApprove');

Отсутствует секция прав доступа

Fatal Error: Permission section not specified for prefix top_prefix

Вызов ошибки

Ошибка вызывается в методе kEvent::getSection. Этот метод вызывается когда во время обработки события требуется проверка прав доступа. В случае, если событие вызвано для подчинённого префикса, права доступа проверяются для главного префикса.

Если не определена секция прав доступа, то нет возможности проверить право доступа, поскольку имена прав доступа включают в себя строку из секции прав доступа.

function getSection()
{
	$perm_section = $this->getEventParam('PermSection');
	if ($perm_section) {
		return $perm_section;
	}
 
	// 1. get section by current top_prefix
	$top_prefix = $this->getEventParam('top_prefix');
	if ($top_prefix == false) {
		$top_prefix = $this->Application->GetTopmostPrefix($this->Prefix, true);
		$this->setEventParam('top_prefix', $top_prefix);
	}
	$section = $this->Application->getUnitOption($top_prefix.'.main', 'PermSection');
 
	// 2. check if this section has perm_prefix mapping to other prefix
	$sections_helper =& $this->Application->recallObject('SectionsHelper');
	/* @var $sections_helper kSectionsHelper */
 
	$section_data =& $sections_helper->getSectionData($section);
	if (
		$section_data 
		&& isset($section_data['perm_prefix']) 
		&& $section_data['perm_prefix'] != $top_prefix
	) {
		$this->setEventParam('top_prefix', $section_data['perm_prefix']);
		$section = $this->Application->getUnitOption(
			$section_data['perm_prefix'].'.main', 
			'PermSection'
		);
	}
 
	if (!$section) {
		if ($this->Application->isDebugMode()) {
			$this->Application->Debugger->appendTrace();
		}
		trigger_error('Permission <b>section</b> not specified 
			for prefix <b>'.$top_prefix.'</b>', E_USER_ERROR);
	}
	return $section;
}


В функцию trigger_error передаётся главный префикс, для которого не определена секция прав доступа.

Получение ошибки

Для получения ошибки можно изменить скрипт core/units/categories/categories_config.php - убрать из него код:

'PermSection' => Array (
	'main' => 'CATEGORY:in-portal:categories', 
	'email' => 'in-portal:configuration_email', 
	'custom' => 'in-portal:configuration_custom'
),

Fatal Error: Permission section not specified for prefix c in w:\core\kernel\utility\event.php on line 315

Исправление ошибки

Чтобы такие ошибки не возникали, надо задавать опцию PermSection в тех Unit Configs где проверяются права доступа. Как правило, права доступа проверяются для префиксов, имеющих свою секцию в главном меню административной консоли и достаточно определить секцию прав доступа для Special = 'main'.

'PermSection' => Array (
	'main' => 'in-bulletin:configuration_emoticon', 
),


Ошибка типа поля при форматировании

Notice: Invalid field type numeric (in TypeCast method), please use float instead

Вызов ошибки

Сообщение вызывается из метода kFormatter::TypeCast в случае если в конфигурации для какого-нибудь поля задан тип numeric. Ошибка может происходить при попытках показать значение поля в шаблоне.

if ($field_type == 'numeric') {
	trigger_error('Invalid field type <strong>'.$field_type.'</strong> 
		(in TypeCast method), please use <strong>float</strong> instead', 
		E_USER_NOTICE);
	$field_type = 'float';
}

В функцию trigger_error передаётся по сути всегда одна и та же строка.

Получение ошибки

Чтобы такое сообщение получить можно в конфигурации для какого-нибудь поля поставить 'type'=>'numeric', и потом открыть шаблон где это поле выводится.

Notice: Invalid field type numeric (in ValidateType method), please use float instead in w:\core\kernel\utility\formatters\formatter.php on line 21

Исправление ошибки

Поскольку в сообщении не указано ни в каком объекте, ни какое поле вызвало ошибку, рекомендуется для начала посмотреть каков префикс объекта и как называется поле, проверив эти значения в момент выполнения вышеописанного кода. Возможно, что для выяснения префикса придётся перейти к объекту, из которого вызывались методы класса kFormatter. Затем следует проверить файл конфигурации соответствующего префикса, метод ОnAfterConfigRead обработчика событий соответствующего префикса и Hooks к этому методу на предмет выставления типа соответствкующего поля в 'numeric'. Найденное слово 'numeric' надо поменять на 'float'.

Отсутствие options при использовании kOptionsFormatter

Warning: Options not defined for some_prefix field some_field

Вызов ошибки

Сообщение вызывается из метода kOptionsFormatter::Format в случае если в конфигурации для какого-нибудь поля задан форматтер kOptionsFormatter, но не заданы options. Ошибка может происходить при попытках показать значение поля в шаблоне.

$field_options = $object->GetFieldOptions($field_name);
if (
	!array_key_exists('options', $field_options) 
	|| !is_array($field_options['options'])
) {
	trigger_error('Options not defined for
		<strong>'.$object->Prefix.'</strong> 
		field <strong>'.$field_name.'</strong>', E_USER_WARNING);
	return $value;
}

В функцию trigger_error передаются префикс и название поля.

Получение ошибки

Для получения ошибки можно в users_config.php закомментировать код, задающий options для поля Country.

'Country' => Array (
	'type' 		=> 'string', 
	'formatter' => 'kOptionsFormatter',
//	'options_sql' => 'SELECT %1$s
//		FROM '.TABLE_PREFIX.'StdDestinations
//		LEFT JOIN '.TABLE_PREFIX.'Phrase
//		ON '.TABLE_PREFIX.'Phrase.Phrase =
//			'.TABLE_PREFIX.'StdDestinations.DestName
//		WHERE
//			DestType=1
//			AND	LanguageId = %2$s
//		ORDER BY Translation',
//	'option_key_field' 	=> 'DestAbbr',
//  'option_title_field'=>'Translation',
	'not_null' 	=> '1',
	'default' 	=> ''
)

Тогда при открытии шаблона с данными пользователя в дебагере видна ошибка.

Warning: Options not defined for u field Country in w:\core\kernel\utility\formatters\options_formatter.php on line 13

Исправление ошибки

Чтобы такой ошибки не было, надо задать options. Как правило это делается в конфигурации. В более сложных случаях - в методе OnAfterConfigRead или в hooks к этому методу.

Отсутствие Prefix в файле конфигурации

Fatal Error: Prefix not defined in config file some_filename

Вызов ошибки

Сообщение вызывается из метода kUnitConfigReader::includeConfigFiles в случае если файл конфигурации найден, но в файле конфигурации не задан обязательный ключ массива - Prefix.

Получение ошибки

Для получения ошибки можно в users_config.php закомментировать код, задающий Prefix.

// 'Prefix' =>	'u',

Fatal Error: Prefix not defined in config file /core/units/users/users_config.php in w:\core\kernel\utility\unit_config_reader.php on line 215

Исправление ошибки

Чтобы исправить такую ошибку надо открыть указанный в сообщении об ошибке файл и дописать туда ключ Prefix с правильным значением.

Нежелательный способ конфигурации хука

Notice: Depricated Hook Usage [prefix: some_prefix; do_prefix: another_prefix] use #PARENT# as HookToPrefix value, where HookToPrefix is same as ParentPrefix

Вызов ошибки

Сообщение вызывается из метода kUnitConfigReader::parseConfig если в файле конфигурации задан хук к событию родительского Prefix, и при этом родительский Prefix в определении хука указан явным образом.

Получение ошибки

Для получения ошибки можно в config_search_config.php вместо

'HookToPrefix' => '#PARENT#',

написать

'HookToPrefix' => 'cf',

Notice: Depricated Hook Usage [prefix: cf; do_prefix: confs-cf] use #PARENT# as HookToPrefix value, where HookToPrefix is same as ParentPrefix in w:\core\kernel\utility\unit_config_reader.php on line 403

Исправление ошибки

Чтобы исправить такую ошибку надо вместо явного указания родительского префикса писать #PARENT#. Это особенно необходимо в случае, когда один и тот же Prefix бывает подчинённым сразу у нескольких разных префиксов - каждый раз значение #PARENT# автоматически заменяется на нужный в конкретном случае родительский префикс.

Нежелательный способ конфигурации Aggregate тэга

Notice: Depricated Aggregate Tag Usage [prefix: some_prefix; AggregateTo: another_prefix] use #PARENT# as AggregateTo value, where AggregateTo is same as ParentPrefix

Вызов ошибки

Сообщение вызывается из метода kUnitConfigReader::parseConfig если в файле конфигурации задан Aggregate тэг для родительского Prefix, и при этом родительский Prefix в определении Aggregate тэга указан явным образом.

Получение ошибки

Для получения ошибки можно в images_config.php вместо

'AggregateTo' => '#PARENT#',

написать

'AggregateTo' => 'p',

Notice: Depricated Aggregate Tag Usage [prefix: img; AggregateTo: p] use #PARENT# as AggregateTo value, where AggregateTo is same as ParentPrefix in w:\core\kernel\utility\unit_config_reader.php on line 442

Исправление ошибки

Чтобы исправить такую ошибку надо вместо явного указания родительского префикса писать #PARENT#. Это особенно необходимо в случае, когда один и тот же Prefix бывает подчинённым сразу у нескольких разных префиксов - каждый раз значение #PARENT# автоматически заменяется на нужный в конкретном случае родительский префикс.


Неизвестен файл конфигурации для данного префикса

Fatal Error: Configuration file for prefix some_prefix is unknown

Вызов ошибки

Сообщение вызывается из метода kUnitConfigReader::loadConfig если происходит попытка загрузить конфигурацию для неизвестного системе префикса.

Получение ошибки

Такая ошибка может произойти в результате некорректно написанного вызова kApplication::getUnitOption - если первым параметром указать строку, не представляющую собой известный системе префикс. Например:

$fields = $this->Application->getUnitOption('pp', 'Fields');

Fatal Error: Configuration file for prefix pp is unknown in w:\core\kernel\utility\unit_config_reader.php on line 672

Исправление ошибки

Чтобы исправить такую ошибку надо указать правильный префикс при вызове kApplication::getUnitOption. Например, если надо получить значения конфигурации для модуля продуктов In-Commerce:

$fields = $this->Application->getUnitOption('p', 'Fields');

Хорошая профилактика от таких ошибок - указывать в качестве параметра префикс, предоставляемый системой в свойствах стандартных объектов. Например:

$fields = $this->Application->getUnitOption($event->MasterEvent->Prefix, 'Fields');	
$fields = $this->Application->getUnitOption($event->Prefix, 'Fields');	
$fields = $this->Application->getUnitOption($this->Prefix, 'Fields');

Затёрта секция в главном меню административной консоли

Notice: Section "some_section" declaration (originally defined in "some_prefix") was overwriten from "another_prefix"

Вызов ошибки

Сообщение вызывается из метода kSectionsHelper::_processPrefixSections если в конфигурации двух префиксов прописана одна и та же секция для главного меню административной консоли. При этом данные префикса, обработанного первым, оказываются потеряны и как результат - окажется потеряна соответствующая затёртым данным секция главного меню административной консоли.

Получение ошибки

Tакую ошибку, можно получить, если в конфигурации модуля Custom переписать одну из секций модуля Core

'Sections' => Array (
	'in-portal:admins' => Array (
		'parent'		=>	'custom:users',
		'icon'			=>	'users',
		'label'			=>	'la_title_Administrators',
		'url'			=>	Array ('t' => 'users/admins_list', 'pass' => 'm'),
		'permissions'		=>	Array ('view', 'add', 'edit', 'delete'),
		'perm_prefix'		=>	'u',
		'priority'		=>	2,
		'type'			=>	stTREE,
	),
</sections>

Ошибка в этом случае происходит при перестройке кэша конфигурации.

Notice: Section "in-portal:admins" declaration (originally defined in "core-sections") was overwriten from "custom-sections" in w:\core\units\general\helpers\sections_helper.php on line 193

Исправление ошибки

Если ошибка возникла при создании новой секции, надо придумать для этой секции уникальное название, чтобы оно не конфликтовало с названиями уже имеющихся в системе секций. Если новая секция не нужна, а надо лишь переопределить некоторые параметры существующей секции, то не следует повторно объявлять её под ключом Sections - вместо этого надо использовать ключ SectionAdjustments конфигурации. Например, если секцию надо переместить под другую ветку дерева главного меню административной консоли:

'Sections' => Array (
	'in-portal:admins' => Array (
		'parent' => 'custom:users',
	),
</sections>

Не определены права для события

Fatal Error: Permission mappings not defined for event top_prefix <- event_prefix:event_name

Вызов ошибки

Сообщение вызывается из метода kPermissionsHelper::getPermissionByEvent если требуется проверка прав на вызов события, а отображение (Mapping) прав для данного события не определено.

Получение ошибки

Наиболее часто такого рода ошибки возникают на пользовательской части сайта - каждый раз, когда там пытаются использовать событие, предназначенное только для администраторской части сайта, либо когда создают новое событие не создав для него отображение (Mapping) прав. Это происходит оттого, что наиболее часто используемый обработчик событий - kDBEventHandler, проверяет права на выполнение событий только на пользовательской части сайта. Например:

<input type="submit" name="Add Image" value="events[u][OnAddUserImage]"/>

Fatal Error: Permission mappings not defined for event u <- u:OnAddUserImage in w:\core\units\general\helpers\permissions_helper.php on line 65

Исправление ошибки

Для того, чтобы ошибка не возникала, надо задать отображение (Mapping) прав для события, выданного в сообщении об ошибке. Это делается дописыванием кода в обработчик событий соответствующего префикса.

function mapPermissions()
{
	parent::mapPermissions();
	$permissions = Array(
		'OnAddUserImage' =>	Array('self' => true,'subitem'=>true),
	);
	$this->permMapping = array_merge($this->permMapping, $permissions);
}

Файл не является изображением либо испорчен

Warning: Image some_file_path missing or invalid

Вызов ошибки

Сообщение вызывается из метода ImageHelper::getImageInfo в случае, если переданный в качестве параметра файл существует, но не распознаётся функцией getimagesize. Пи этом сообщение об ошибке содержит путь к проблемному файлу.

Получение ошибки

Ошибка может получиться, если вместо изображения в систему загрузить другой файл, а потом пытаться его обработать как изображение. Например, изменить размеры загруженного в систему изображения методом ImageHelper::ResizeImage.

ResizeImage('w:\system\images\report.pdf', 200, 100);

Warning: Image w:\system\images\report.pdf missing or invalid in w:\core\units\general\helpers\image_helper.php on line 219

Исправление ошибки

Чтобы посторонний файл не принимался системой за изображение, надо проверять данные, вводимые пользователем. В частности, большинство файлов, не являющихся изображениями можно отсечь правильно настроив форматтер kUploadFormatter для соответствующего поля - перечислив в конфигурационной опции allowed_types только типы файлов характерные для изображений:

'ImageFile' =>	Array (
	'type' 		=> 'string', 
	'formatter' 	=> 'kUploadFormatter', 
	'upload_dir' 	=> '/system/images/', 
	'max_size' 	=> 50000000, 
	'default' 	=> '', 
	'allowed_types' => Array ('image/jpeg', 'image/pjpeg', 'image/gif', 'image/png'),
),

Также, причиной порчи изображений может быть некорректное добавление файла в CVS. Изображение в CVS надо добавлять как бинарный файл, то есть с ключом -kb.


Неправильный символ в поле ValueList

Notice: Invalid symbol in ValueList field [field_value ...]

Вызов ошибки

Сообщение вызывается из метода InpCustomFieldsHelper::GetValuesHash. Этот метод переводит строковое значение поля ValueList в ассоциативный массив, и выдаёт предупреждение если обнаруживает несоответствие между количеством пар имя=значение в строке и количеством элементов получившегося ассоциативного массива.

Получение ошибки

Для получения ошибки можно создать Custom Field типа список такой, чтобы в базе данных поле ValueList приняло значение

1=+One||2=+Two||3=+Three

|| - это стандартный разделитель, определяемый константой VALUE_LIST_SEPARATOR.

Теперь, чтобы получить ошибку, можно вместо стандартного разделителя в базу данных вписать запятые:

1=+One,2=+Two,3=+Three

Notice: Invalid symbol in ValueList field [1=+One,2=+Two,3=+Three ...] in w:\core\units\general\custom_fields.php on line 35

Исправление ошибки

Чтобы исправить такую ошибку надо обеспечить правильный формат поля ValueList - в поле должны быть пары имя=значение, между которыми - правильный разделитель.


Ошибка в XML

XML error: some_error at line line_number

Вызов ошибки

Сообщение вызывается из метода kXMLHelper::Parse. Этот метод переводит XML-строку в удобную для использования структуру данных. Если XML-строка не соответствует правилам языка XML, то при попытке её перевода в структуру данных получается сообщение об ошибке.

Получение ошибки

Для получения ошибки достаточно передать в метод kXMLHelper::Parse строку, не соответствующую правилам языка XML. Например, в которой отсутствует закрывающий тэг:

$xmlhelper =& $this->Application->recallObject('kXMLHelper');
/* @var $xmlhelper kXMLHelper */
$elements = $xmlhelper->Parse('<b>bold text<b>');

Warning: XML error: Invalid document end at line 1 in w:\core\units\general\xml_helper.php on line 30

Исправление ошибки

Для исправления ошибки следует привести строку в соответствие с правилами языка XML. В частности - обеспечить наличие закрывающих тэгов.

$xmlhelper =& $this->Application->recallObject('kXMLHelper');
/* @var $xmlhelper kXMLHelper */
$elements = $xmlhelper->Parse('<b>bold text</b>');

Ошибка в CSS

Warning: Error parsing CSS definition, no colon and/or value after property some_property

Вызов ошибки

Сообщение вызывается из метода kPDFStylesheet::ParseDefinitionTokens. Этот метод завершает перевод CSS-текста в удобную для работы структуру данных. По правилам CSS, за названием свойства (property) должно следовать двоеточие (colon), и затем значение этого свойства (value). Сообщение появляется если это правило нарушено, то есть, после названия свойства отсутствует либо двоеточие, либо значение, либо отсутствуют оба этих обязательных элемента.

Получение ошибки

Для получения ошибки можно создать шаблон test.tpl с некорректно заданными стилями:

<span style="font-weight:">bold text</span>

И затем попытаться из этого шаблона построить PDF-документ:

$pdfhelper =& $this->Application->recallObject('kPDFHelper');
/* @var $pdfhelper kPDFHelper */
$pdfhelper->BuildFromTemplate('test');

Warning: Error parsing CSS definition, no colon and/or value after property font-weight in w:\core\units\pdf\pdf_styles.php on line 122

Исправление ошибки

Для исправления ошибки следует исправить описание CSS-стиля в шаблоне test.tpl:

<span style="font-weight:bold">bold text</span>

Нет права записи в файл конфигурации

Fatal Error: Cannot write to full path of config.php file

Вызов ошибки

Сообщение вызывается из метода kInstallToolkit::SaveConfig. Как правило, этот метод в ходе инсталляции системы записывает параметры конфигурации в файл config.php, находящийся в корне сайта. Если сделать запись в файл невозможно, то появляется сообщение.

Получение ошибки

Для получения ошибки надо начать инсталляцию системы, запустив скрипт инсталляции http://your.domain/core/install.php

Затем, на шаге 2 - "Installation Maintenance" - поменять права для файла конфигурации:

chmod +r-w config.php

На последующих шагах, когда настанет время дописать данные в файл config.php, появится сообщение:

Fatal Error: Cannot write to /home/sites/yourdomain/web/config.php in w:\core\install\install_toolkit.php on line 435

Исправление ошибки

Для исправления ошибки достаточно поставить права записи на файл, указанный в сообщении об ошибке:

chmod 777 config.php