Обработка и вывод пользователю сообщений об ошибках. Какая практика?

ivanmara

Новичок
Обработка и вывод пользователю сообщений об ошибках. Какая практика?

Здравствуйте. Подскажите по след вопросу. Существует набор классов занимающийся чисто логикой работы а данные визуализируются в так называемом "шаблоне" если можно так его назвать. В результате вызова из шаблона того или иного метода на выходе я получаю массивы данных которые затем тем или иным способом визуализирую. Но иногда бывают ситуации когда необходимо передать в вызывающий шаблон информацию об ошибке в виде текста. Например при регистрации пользователя должны быть заполенны все поля ... и скажем при вызове: $reg->add($pole1, pole2) метод add должен вернуть описание ошибки на страничку ... первая мысль сделать echo 'Ошибка ляляля' прямо в методе add ... но мне он не очень нравиться ... Как мне это сдеать проще и красиве чтоли ? и вообще какая практика в этом вопросе ? Заранее спасибо.
 

Фанат

oncle terrible
Команда форума
Эх.
Не надо путать сообщения об о ш и б к а х, и совершенно стандартные сообщения, выводимые пользователю.
С точки зрения приложения, вывод сообщения "спасибо за ваш комментарий" и "Вы забыли представиться" - идентичны.

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

-~{}~ 28.05.07 17:28:

по поводу $reg->add.
лучше всего сделать reg->validate
а потом уже $reg->add
 

ivanmara

Новичок
Фанат

По поводу reg->validate действительно логичнее. Спасибо. Но как быть с методами передачи самих текстов информационных сообщений от набора классов в визуализатор ... ?
Появилась мысль создать класс Mesage в поля которого писать собственно само сообщение, тип сообщения (информационное, ошибка и т.д.) скажем при вызове reg->validate ... затем в визуализаторе анализировать эти поля и делать вывод на страничку ... но чёто мне кажется это сложным ... Есть какие нить ещё методы?
 

Фанат

oncle terrible
Команда форума
Вообще-то, сейчас жарко. И я могу плохо соображать.
Но, честно говоря, не очень понимаю, чем передача сообщения о незаполненном поле отличается от передачи текста самого сообщения.

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

ivanmara

Новичок
Сейчас попробую объяснить
Допустим метод $reg->validate возвращает true или false в зависимости от результата проверки. Задача передать текстовое сообщение шаблону об ошибке.

1. Способ (весьма сомнительный):
метод $reg->validate($pole1, $pole2) при неверном одном из параметров делает echo 'Поле А должно быть заполенно'; и возвращает false или true если всё в порядке.
В шаблоне делаем проверку:
PHP:
...
if ($reg->validate($pole1, $pole2))
{
   $reg->add($pole1, $pole2);
   ....
}
else
   $reg->display_reg_form();
...
В результате в случае ошибки выведется 'Поле А должно быть заполенно' и собственно ещё раз форма.

2. Способ
В методе $reg->validate($pole1, $pole2) происходит анализ входных параметров и возрат true или false в зависимости от результатов проверки, при этом если ошибка обнаруживается то $reg->validate пишет в скажем в класс Message::Add($str) сообщения об ошибках которых может быть несколько. Далее в шаблоне:
PHP:
...
if ($reg->validate($pole1, $pole2))
{
   $reg->add($pole1, $pole2);
   ....
}
else
{
   Message::display_last_message();
   $reg->display_reg_form();
}
...
Значит вся логика по визуализаци сообщения пользователю уже зашита в обработчик Message::display_last_message();

3. Способ меня как раз и интересует ... Видимо первый способ не очень хорош. Второй сложноват мне кажеться ... пока больше я не придумал. Поэтому интересны ещё варианты кто как решает задачу вывода сообщений пользователям ?

-~{}~ 01.06.07 18:58:

Вот эта идея похоже неплохая:
http://phpclub.ru/detail/article/2002-10-16
 

dark-demon

d(^-^)b
пока сюда не набежали любители исключений....
я бы сделал так:

Код:
function validate () {
   $err= array();
   if (поле1 не заполнено) $err[]= 'а ну, не ленимся!';
   if (поле2 заполнено неправильно) $err[]='чё, в дурачка играем?';
   if (true) $err[]='чёта мне хряново';
   return $err;
}

ну а дальше:
if ($err=validate())
   foreach ($err) echo $err;
else
   echo 'молодец, чувак! страна тебя не забудет!';
 

ivanmara

Новичок
Я сделал так:
PHP:
class Error
{
	static private $error_msg = array();
	
	static public function reset()
	{
		self::$error_msg = array(); 
	}

	static public function add($msg)
	{
		self::$error_msg[]= $msg;
	}

	static public function display()
	{
		foreach (self::$error_msg as &$msg)
			echo $msg.'<br>';
		self::reset();  	
	}
	
	private function __construct()
	{
	}
}
display() можно расширить для более приятного вывода.
add($msg) аккамулирует сообщения об ошибках, которых может быть несколько.
Класс имеет статичные методы и переменную т.к. на мой взгляд сообщение об ошибке в любой момент имеет смысл только для последней ошибочной ситуации (аналог errno в С системных и библиотечных функциях)

При работе скрипта, допустим обработки формы:

PHP:
if ($reg->validate($pole1, $pole2)) 
{ 
   $reg->add($pole1, $pole2); 
   .... 
} 
else 
{ 
   Error::display();
   $reg->display_reg_form(); 
}
где текстовые сообщения об ошибках формируются в $reg->validate($pole1, $pole2)
 

Фанат

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

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

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

-~{}~ 04.06.07 14:49:

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

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

А словом Error надо называть класс, который занимается оотловом, обработкой, и информарованием программиста о возникающих ошибках в работе приложения!
 

maxru

МИФИст
Снова безумный рецепт:
1) Все функции, которые возвращают какие-либо данные, возвращают их в xml, либо есть методы, позволяющие преобразовать те же данные в xml.
2) Далее используются xsl-темплейты для форматирования xml данных соответствующим образом.
3) в xml данных содержится какая-то информация о конкретном поле и код ошибки.
<formitem id="user_name">
<default>djhfdjfkjf</default>
<error>Привет Незнакомец, не соизволишь ли ты сообщить свое имя?</error>
</formitem>
4) кусок xsl-темплейта
<xsl:template match="formitem">
<input бла-бла />
<xsl:if test="error!=0">
<xsl:value-of disable-output-escaping="yes" select="error" />
</xsl:if>
</xsl:template>
5) Запихиваем все это чудо в xslt-процессор (Саблотрон например) и на выходе получаем кусок формы с сообщением об ошибке, если то, что находится внутри <error></error> отличается от 0.

Если где накосячил в xsl - пардон.
Нод <error> ясен пень добавляется при генерации xml на основе какого-нибудь массива.
 

Фанат

oncle terrible
Команда форума
maxru
Спасибо, что проиллюстрировал мою идею на примере одного из миллионов возможных (и самого кривого) шаблонизатора.
правда, я лелею надежду на то, что до автора топика дойдет и без таких объяснений на пальцах простая идея о том, что для вывода ОБЫЧНОЙ информации в ОБЫЧНЫЙ шаблон никакого специального класса не требуется.
Но, возможно, наглядное пособие ему поможет
 

maxru

МИФИст
Нод <error> опять же отношения к "ошибкам" не имеет. Просто так назван для удобства.

-~{}~ 04.06.07 16:02:

Фанат, а какой не кривой?
Мне кажется, что представление данных в xml с последующей обработкой наиболее удобный способ в случае чего получить полностью переносимую структурированную информацию.
(Про это говорил вице-президент Microsoft Санджай Партасарати на своём выступлении в МИФИ { в моем вольном переводе с английского -) } )

А самый кривой (из нормальных) - это имхо Smarty.
А я за 4 месяца еб... борьбы с XSL шаблонами HostCMS воткнул, что в итоге получается довольно-таки удобно.

Ну да ладно, я уже что-то в оффтоп ушел. Можно в личку рекомендации по выбору шаблонизатора? =)
 
Сверху