Эффект lightbox для галерей, скрипт увеличения изображений для галерей лендингов

На системах управления сайтом, так званых CMS, той же WordPress можно установить плагин, но на самописных страницах так не сделать. Поэтому данная библиотека вам может помочь. Вся библиотека это 2 файла, сам скрипт и стили CSS. Все это - baguetteBox, Страница baguetteBox на GitHub

Чтобы применить такой эффект лайтбокса для своих нужно сделать несколько шагов. Для начала убедиться, подключена ли к вашей странице библиотека jQuery. Если нет, то это нужно сделать.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>

Далее, сразу после библиотеки подключаем скрипт нашего lightbox для галерей. Он есть в архиве, который вы скачали, это файл - baguette.js. Его подключить можете тоже по инструкции из статьи упомянутой выше.

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

//В ЯВА СРЕДУ
baguetteBox.run('.gallery');
 
//В HTML СРЕДУ
<script>
jQuery(function($){
baguetteBox.run('.gallery');
});
</script>

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

<ul class="gallery">
<li><a href="images/11.jpg"><img alt="Галерея" src="images/1.jpg"></a></li>
<li><a href="images/22.jpg"><img alt="Галерея" src="images/2.jpg"></a></li>
<li><a href="images/33.jpg"><img alt="Галерея" src="images/3.jpg"></a></li>
</ul>

Внутри списка размещаете ссылки внутри которых изображения. Задумка такая: изображение в теге img - это миниатюра, маленькая картинка, а уже в самой ссылке указан путь к большому изображению. То бишь в нашем примере изображение 1.jpg - это миниатюра, а 11.jpg это полное.

Ну и чтобы все это работало, остался последний шаг - подключение стилей нашей библиотеки лайтбокса. В скачанном вами архиве - это файл baguette.css. Подключите его к своему сайту или скопируйте стили и перенесите в свой файл стилей. Пример подключения:

<link href="baguette.css" type="text/css" rel="stylesheet">

Не забудьте указать свой путь к файлу, если он лежит не в корне, а в какой-то папке


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

Если решили задавать опции, то инициализация будет немного другой, ее код уже таков

baguetteBox.run('.gallery', {
    //СЮДА ОПЦИИ
});

У скрипта есть следующие опции, укажу основные, ознакомится всеми можно на странице самого скрипта на GitHub (Ссылка указана в начале статьи).

buttons: false, - По умолчанию true. Этот параметр отключает показ кнопок для перелистывания изображений, например, если вы хотите, чтобы показывались только по одному.
fullScreen: true, - По умолчанию false. Этот параметр включает показ галереи в полно экранном режиме. Поверх браузера.
noScrollbars: true, - По умолчанию false. Этот параметр отключает показ скролбара, полосы прокрутки на сайте, во время просмотра изображений.
animation: 'fadeIn', - По умолчанию slideIn. Этот параметр задает вид анимации перелистывании изображений.
async: true, - По умолчанию false. Этот параметр включает асинхронную подгрузку файлов.
Если их применять, то инициализация будет такой. Разделите параметры запятой, не забудьте!

baguetteBox.run('.gallery', {
animation: 'fadeIn',
noScrollbars: true,
buttons: false,
});

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

Добавлено: 16 Мая 2021 10:20:41 Добавил: Андрей Ковальчук

Ярлыки

Пользовательский интерфейс трудно представить без ярлычков с оперативной подсказкой (Hints). Если задержать курсор, например, над кнопкой или компонентом палитры самой среды Delphi, появляется маленький прямоугольник яркого цвета (окно подсказки), в котором одной строкой сказано о названии этого элемента или связанном с ним действии. Delphi поддерживает механизмы создания и отображения таких ярлычков в создаваемых программах.

Свойство, определяющее активность системы подсказки у элемента управления:


property ShowHint: Boolean;
Если свойство ShowHint установлено в True, и во время выполнения курсор задержался над компонентом на некоторое время, в окне подсказки высвечивается текстовая строка с подсказкой, которая задана свойством:


property Hint: string;  

Подсказка компонента может быть пустой строкой — в этом случае система ищет в цепочке первый родительский компонент с непустой подсказкой.

Если в строке Hint встречается специальный символ-разделитель "Г, то часть строки до него ("короткая") передается в окно подсказки, а после ("длинная") — присваивается свойству Hint объекта Application. Ее можно использовать, например, в строке состояния внизу главной формы приложения (см. пример ниже).

Система оперативных подсказок имеет свойства и методы, общие для всех форм в приложении. Не удивительно, что они сосредоточены в Application — глобальном объекте, соответствующем работающему приложению. Все описанные ниже в этом разделе свойства относятся не к компоненту, показывающему подсказку, а именно к Application.

Фоновый цвет окна подсказки можно изменить посредством свойства


property HintColor: TColor;  

У объекта Application значение свойства showHint нужно устанавливать во время выполнения, например, в обработчике OnCreate главной формы приложения. Оно является главенствующим для всей системы подсказок: если оно установлено в значение False, ярлычки не возникают.

Есть еще один способ получения подсказки. При смене текущего элемента управления (т. е. при смене текста в свойстве Hint) в объекте Application возникает событие


property OnHint: TNotifyEvent;   

Пример:


procedure TForml.AppHint(Sender: TObject);  
begin  
Panell.Caption:= Application.Hint;:  
end;  
procedure TForml.FormCreate(Sender: TObject);  
begin  
Application.OnHint := AppHint;  
end;  

В этом примере текст подсказки будет отображаться в строке состояния Panell независимо от значения showHint у любого объекта — лишь бы этот текст был в наличии. Для этого разделяйте подсказку у элементов управления вашего приложения на две части при помощи символа " |" — краткая информация появится рядом с элементом, а более полная — в строке состояния.


function GetLongHint(const Hint: string): string; function GetShortHint(const Hint: string): string;

У других компонентов свойство ShowHint интерпретируется системой так: когда курсор мыши останавливается над элементом управления или пунктом меню, и приложение не занято обработкой сообщения, происходит проверка, и если свойство showHint у элемента или у одного из его родительских элементов в иерархии равно True, то начинается ожидание.

Если в данный момент другие ярлычки не показываются, то интервал времени задается свойством HintPause:


property HintPause: Integer;  

Интервал времени по умолчанию равен 500 мс. Если в данный момент уже виден ярлычок другого компонента, то интервал времени ожидания задается свойством:


property HintShortPause: Integer;  

По истечении этого времени, если мышь осталась над тем же элементом управления, наступает момент инициализации окна подсказки. При этом программист может получить управление, предусмотрев обработчик события объекта Application:


property OnShowHint: TShowHintEvent;  
TShowHintEvent = procedure (var HintStr: string;  
var CanShow: Boolean;  
var Hintlnfo: THintlnfo) of object;  

Рассмотрим параметры обработчика события OnShowHint:

Hintstr — отображаемый текст;
CanShow — необходимость (возможность) появления подсказки. Если в переменной CanShow обработчик вернет значение False, то окно подсказки высвечиваться не будет;
Hintinfo — структура, несущая всю информацию о том, какой элемент управления, где и как собирается показать подсказку. Ее описание:

THintlnfo = record  
HintControl: TControl;  
HintPos: TPoint;  
HintMaxWidth: Integer;  
HintColor: TColor;  
CursorRect: TRect;  
CursorPos: TPoint;  
end;  

Для показа окна подсказки необходимо еще, чтобы у элемента управления или у его предков в цепочке строка Hint была непустой. Впрочем, это можно исправить в обработчике OnShowHint:


procedure TForml.AppShowHint(var HintStr: string;  
var CanShow: Boolean;var Hintlnfo: THintlnfo);  
begin if HintStr='' then  
begin  
HintStr := Hintlnfo.HintControl.Name; Hintlnfo.HintColor := clRed; CanShow := True;  
end;  
end;  

Присвоив этот метод обработчику Application.OnShowHint, установив Form.showHint:=True и очистив все строки Hint, получим в качестве подсказки имя каждого элемента.

Длительность показа ярлычка задается свойством


property HintHidePause: Integer;  

По умолчанию его значение равно 2500 мс.

Свойство


property HintShortCuts: Boolean;  

отвечает за показ вместе с текстом ярлычка описания "горячих" клавиш данного элемента управления.

Наконец, можно вручную "зажечь" и "потушить" ярлычок. При помощи метода


procedure ActivateHint(CursorPos: TPoint);  

ярлычок показывается в точке CursorPos (система координат — экранная). "Спрятать" окно подсказки можно с помощью метода:


procedure CancelHint;  

Без повторного перемещения мыши на текущий элемент оно более не возникнет.

Добавлено: 07 Августа 2018 21:16:14 Добавил: Андрей Ковальчук

Яндекс-like поиск своими руками

PHP

Редкий веб-программист не сталкивался с задачей написания поиска для своего сайта. Независимо от того – делалось ли это для собственной CMS или для первого сайта, сделанного фирме двоюродного дяди топориком на коленке в 10 классе.

Зачастую, задача поиска по сайту решается использованием простого SQL-запроса вида where `content` like ‘%семенович%’, при котором искомая фраза разбивается на слова и каждое ищется средствами SQL среди строк в БД. Несмотря на простоту этого решения, качество результатов такого поиска оставляет желать лучшего. Ответственные разработчики используют индексацию, учитывают релевантность и даже морфологию. Однако ещё ни на одном сайте я не видел такого красивого поиска, как на Яндексе.

Что я сейчас понимаю под красивым поиском:

Сортировка результатов по релевантности
Учёт морфологии русского языка
И самое главное – функцию «возможно вы искали»
Можно ли сделать такой поиск на своем сайте, затратив совсем немного времени и не используя громоздкие базы словоформ? Можно.

Сразу должен предупредить – это не описание того, как работает поиск на Яндексе. Это описание того, как сделать поиск, на 80% похожий на поиск в Яндексе:) Другими словами – будут показаны те методы, которые дают максимальную эффект при минимальных трудозатратах.

1. Сортировка по релевантности.

«Релевантность - субъективное понятие, выражающее степень соответствия запроса и найденного, уместность результата» (Wikipedia).
Поскольку понятие субъективное, значит и определять его придется нам самим. Сделаем релевантность документа функцией двух параметров – числа слов запроса, которые присутствуют в документе, и количества вхождений всех этих слов в текст.

Например, запрос «компьютерные салоны Сыктывкара».
В тексте «компьютерные» присутствует 5 раз, «салоны» 2 раза, «Сыктывкар» - 0 раз. У нас встретилось 2 слова, и всего 7 их вхождений. На языке математики x=2, y=7.
Определим функцию релевантность(x,y) = 1000x + y.
При таком ранжировании выше окажутся те страницы, в которых встречается больше слов из запроса, а между собой они будут отсортированы по частоте вхождения данных слов.

При правильно построенном индексе сайта, сортировку по релевантности можно легко включать прямо в SQL запрос, использовав order by (технические подробности ниже).

2. Учет морфологии русского языка.

Под поиском с морфологией понимают поиск, который не чувствителен к форме слова, то есть ищет не только «соседей», но и «соседи», «сосед», «соседский» и так далее.
Добиться этого можно двумя путями – правильным и «почти правильным».

Правильный путь заключается в наличии огромного (порядка 50 мб) словаря словоформ, грамотно переведенного в формат используемой БД и прикрученный к «движку» сайта. Найти бесплатный словарь можно тут: Ispell dictionary list, правда придется разбираться с его структурой.

«Почти правильный» путь – выделять корень слова на основе общих лингвистических правил языка (отбрасывая стандартные суффиксы и окончания). Делается это при помощи «стеммера». (Исходный код стеммера для языка PHP).
Минус этого алгоритма в том, что он основан на правилах. А как известно, у каждого правила есть исключения – данный алгоритм бессилен против пар вроде «идти»-«шёл», а также непредсказуем в случае с беглыми гласными, довольно часто встречающимися в русском языке (лев-львов, овца-овец).

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

3. Функция «возможно вы искали».

Я мог бы долго объяснять почему и для кого нужна эта функция. Но вместо этого скажу только одно – она есть в Яндексе (для русского) и в Google (для английского языка). И это при том, что данные поисковые службы очень осторожно и тщательно подходят к выбору своего функционала.

Как же нам поправить человека, который ввел «малако» вместо «молоко»?

Для английского языка давно существует алгоритм soundex, который устанавливает одинаковый индекс для строк, имеющих схожее звучание.
В MySQL и PHP функция soundex является встроенной. Работает ли она для русских слов? Нет, она работает только со словами, записанными латинскими буквами. Однако ничто не мешает нам записать наши русские слова латинскими буквами!
То есть переводим слово в транслит (не общепринятый транслит, а более подходящий именно по звучанию) и сразу же можем применять soundex.
К слову, существует попытка реализации русской версии soundex. Правда основана она на все той же soundex, только предварительно происходит учёт звучания русских букв.

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

4. Техническая реализация.

(Реализация на языке PHP для MySQL.)

Структура таблиц в базе данных.

CREATE TABLE `indexing_link` (
   `id` int PRIMARY KEY auto_increment,
   `url` varchar(255) not null default '',
   `title` varchar(255) not null default '',
   `short` text not null default ''
);

CREATE TABLE `indexing_word` (
   `id` int PRIMARY KEY auto_increment,
   `word` varchar(30) not null default '', 
   `sound` char(4) not null default 'A000'
);
CREATE INDEX idx_word_word ON indexing_word ( word(8) );
CREATE INDEX idx_word_sound ON indexing_word ( sound(4) );

CREATE TABLE `indexing_index` (
   `id`    int PRIMARY KEY auto_increment,
   `link`  int not null default 0,
   `word`  int not null default 0,
   `times` int not null default 0
);
CREATE INDEX idx_index_linkword ON indexing_index (link, word);

Таблица link содержит список документов в виде ссылки, заголовка и анонса (первых 300 символов страницы для вывода в результатах поиска).

Таблица word – содержит слова и включает в себя word – то что осталось после стеммера (то что мы называли «корнем») и sound – результат функции soundex для данного слова.

Таблица index связывает две других таблицы. Каждая ее строка – это слово «word», встретившеея на странице «link» «times»-раз.

Индексация.

Прежде чем разбивать текст на слова и индексировать их, следует избавится от тэгов и прочих ненужных символов.
Простейшим решением будет применение регулярных выражении:
$tex = preg_replace('@<script[^>]*?>.*?</script>@si',' ',$tex);

$tex = preg_replace('@<style[^>]*?>.*?</style>@si',' ',$tex);
$tex = preg_replace('@<[\/\!]*?[^<>]*?>@si',' ',$tex);

Для повышения качества поиска, можно предварительно выделять слова, заключенные в тэги title, h1-h6, b, strong, em, meta keywords и description, и повышать их вес в индексе для данной страницы. Например, банально умножив число вхождении этих слов на 3.

Стеммер.

Код стеммера можно взять тут - Эвристическое извлечение корня из русского слова

Транслитерация:
function rus2lat($string){
$rus = array('ё','ж','ц','ч','ш','щ','ю','я','Ё','Ж','Ц','Ч','Ш','Щ','Ю','Я','Ъ','Ь','ъ','ь');
$lat = array('e','zh','c','ch','sh','sh','ju','ja','E','ZH','C','CH','SH','SH','JU','JA','','','','');
$string = str_replace($rus,$lat,$string);
$string = strtr($string,
"АБВГДЕЗИЙКЛМНОПРСТУФХЫЭабвгдезийклмнопрстуфхыэ",
"ABVGDEZIJKLMNOPRSTUFHIEabvgdezijklmnoprstufhie");
return $string;
}

Поиск по запросу.

Первым делом разбиваем запрос на слова в массив $words, выделив для русских слов корень стеммером.

Формируем поисковый запрос так.
for($i=0;$i<$num;$i++)
{
	$if_clause.="iw.word='".$words[$i]."'";
	if($i!=$num-1) $if_clause.=" or ";
}
$query="select il.id,il.url,il.title,il.short, count(distinct iw.id)*1000 + sum(ii.times) as rel
from indexing_link il, indexing_index ii, indexing_word iw
where (".$if_clause.") and ii.word=iw.id and il.id=ii.link 
group by il.id order by rel desc";

Добавлено: 18 Сентября 2013 04:30:03 Добавил: Андрей Ковальчук

Якоря

Если шаблон не совпадает в начале строки, по умолчанию ядро регулярных выражений Perl «перемещает» его по строке, пытаясь найти совпадение в другом месте. Однако выражение может содержать «якорные» символы, привязывающие шаблон к определенной позиции строки. Якорь ^1 (циркумфлекс, «крышка») обозначает начало строки, а знак $ совпадает только в конце строки2. Таким образом, шаблон /^fred/ совпадет только от начала строки; в строке manfred mann совпадение найдено не будет. А шаблон /rock$/ совпадает только c символами rock в конце строки; в строке knute rockne совпадения не будет.

В некоторых ситуациях используются оба якоря; они гарантируют, что шаблон займет всю строку. Типичный пример – шаблон /^\s*$/, совпадающий с пустой строкой. Впрочем, эта пустая строка может содержать пропуски (например, табуляции и пробелы), невидимые для нас с вами. Все строки, состоящие из таких символов, внешне не отличимы друг от друга, поэтому шаблон рассматривает их как эквивалентные. Без якорей он бы также совпадал и в непустых строках.

Добавлено: 20 Июля 2018 19:20:21 Добавил: Андрей Ковальчук

Якоря в I-frame

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

<?php
if ($_GET['hash']=='zina'){
header('Location: http://flapps.ru');
}else{
echo "none hash";
}
?>

Познакомимся с таким параметром как hash, который и будет выступать в роли хз чего если честно, в общем вставляем мой код на пример в файл index.php, и обращаемся к нему через приложение в виде: http://vkontakte.ru/appXXXXXXX. Как мы видим код нам говорит что у нас нет хэша "none hash", давайте же предоставим ему хэш http://vkontakte.ru/appXXXXXXX#zina. Как мы видим когда код получил назовем его параметр zina, то соответственно выполнил ту функцию которую мы прописали. Всем спасибо за внимание!!!

Добавлено: 15 Августа 2013 11:02:36 Добавил: Андрей Ковальчук

Язык гипертекстовой разметки HTML

Для создания сайтов используют язык гипертекстовой разметки html. В настоящее время самая распространенная версия-это четвёртая. Но с недавних пор идет активное развитие html5.

Итак-что же такое язык разметки. Это обычный текст, в котором пристствуют html тэги. Каждый тэг выполняет отведенную ему роль. Это может быть очень простое действие-например выделение текста жирным, курсивом или подчеркиванием. И сложное-например отрисовка таблицы

Тут аттрибут rowspan Для объединения ячеек используется аттрубут colspan

Сам код и стили:

</p><table id="exam_table"><tbody><tr><td> </td><td> </td><td> </td></tr><tr><td rowspan="2"> </td><td colspan="2"> </td></tr><tr><td> </td><td> </td></tr></tbody></table>
<style type="text/css">
#exam_table{
	width:100%;
	border:1px solid black;
}
#exam_table td{
	border:1px solid black;
	height:50px;
}</style>
<p>

Также можно создать div конейнеры. Очень распространены абзацы p.

Для оформления заголовков используются h1,h2,h3 и h4.

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

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

Для вставки flash содержимого используется тэг object.

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

Временно ненужный html код можно закомментировать, или просто оставить таким образом комментарий в коде.

Ещё одна серьезная возможность этого языка-это формы. С помощью форм можно отправить заявку, сделать форму поиска, просто воткнуть кнопку на сайт. В связке с различными JavaScript библиотеками,например jQuery, можно создавать настоящие шедевры. Это может быть валидация форм на лету, отправка средствами Ajax.

Для стилизации html разметки используют css стили. Чаще всего эти файлы подключаются как внешние.Это более удобно, чем размещать код стля прямо на странице. Также это считается правилом хорошего тона, при верстке страниц.

Сделать что то простое, например боковое меню, достаточно просто. Вот пример бокового меню на html и css.Код займет совсем немного места и проверить его работу можно сразу же. Кстати, писать html код можно прямо в блокноте.Никакой специальной среды разработки не потребуется. Новичкам конечно можно использовать какие-нибудь редакторы, например Dreamweaver. Эта программа очень тяжелая и добавляет в код много ненужного мусора. Настоящие индейцы никогда не будут ей пользоваться. И если вы решили устроиться на работу верстальщиком-не произносите этого слова вслух:)

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

Главной проблемой html является не кроссбраузерность. Тоесть каждый браузер понимает html по-своему...и главная задача верстальщика-это написать кроссбраузерный код, который будет максимально одинаково отображаться в любом браузере. Самый плохой браузер-это Internet Explorer.Написание html кода под этот браузер-это 80% времени и трудов верстальщика.Сделать такой браузер могли только полные идиоты.

Более продвинутые пользователи могут также вставить php код в html разметку. Для этого нужен сервер с поддержкой php, и он должен быть правильно настроен.

И самое главное-это то, что html-это не язык программирования, и для его изучения не нужно быть программистом.

Всё достаточно просто-главное это начать.

Добавлено: 18 Августа 2013 02:59:09 Добавил: Андрей Ковальчук

Ядро. Легкая версия

ПРЕДИСЛОВИЕ

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

Представленный набор скриптов представляет из себя его облегченную, спартанскую версию настоящего ядра. Это просто попытка помочь более плавно адаптироваться в премудростях последующих скриптов.

Кто чувствует в себе силы сразу изучать более серьёзные вещи, может этот раздел пропустить.
В следующем придется начать все сначала. Хотя повторение - мать учения. Впрочем, выбирать Вам.
Шаг 1
Подготовительные работы.
С чего обычно начинается построение сайта? Вы думаете, что нужно сделать первый файл, допустим index.php, и пошло-поехало.
Ан нет.

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

Назвать это можно ядром, фреймворком, шаблоном, паттерном, горшком, чертом лысым или как душе угодно. Суть одна - все, что обычно повторяется в разных сайтах (структура и общие функции) должно быть готово. Как замороженные пельмени. Останется сварить и добавить специи.

Нужно сразу заметить, что ядром в нашем понимании, является не какие то догмы и рамки, которые обычно ставятся фреймворками и всевозможными CMS. У нас это просто структура, которая позволяет упорядочить скрипты и иные принадлежности сайта. Оставляя полную свободу выбора как и что реализовывать. И хотя "framework" и переводится как "основа" или "рабочая рама", в классическом понимании это больше язык программирования со своим синтаксисом и законами. Наша структура более точно подходит под определение "рама".

Вот сейчас и сделаем такую кухню. Приступим, помолясь.
Мы уже изучили структуру сайта, сейчас будет намного проще понять: что где и зачем. Возьмем этот скрипт и на его основе начнем разворачивать боевые действия.

Начнем с того, что обычно оставляется "на потом", так как это кажется не очень важным. И зачастую это "потом" так и не наступает.

А именно с конфигурации и сопутствующих фишек.

Начнем со страниц ошибок. В корневой директории нужно сделать, как минимум, три файла.

401.html
403.html
404.html

Оформлять их не нужно, это дело верстальщиков. Нам будет достаточно этого:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<title>404</title> 
</head> 
<body> 
<h2 style="color:#FF0000">404</h2> 
Запрашиваемая страница отсутствует на нашем сайте. 
</body> 
</html>

Еще там же в корне нужно сделать файл .htaccess с таким содержанием:
AddDefaultCharset UTF-8 
php_flag magic_quotes_gpc Off 
php_flag magic_quotes_runtime Off 
php_flag register_globals Off 
ErrorDocument 401 /401.html 
ErrorDocument 403 /403.html 
ErrorDocument 404 /404.html 
Options -Indexes

Что тут.

1. Кодировка. Все сайты мы будем делать в кодировке UTF-8.
2, 3. Убиваем магические кавычки.
4. Отключаем глобальные переменные
5-8. Обработка ошибок запросов. Вот тут и пригодятся странички. Обратите внимание на строку

Options -Indexes

Эта строка запретит вывод списка файлов и директорий, если в папке не окажется индекса. А директива ErrorDocument перенаправляет запросы на подготовленные страницы в случае ошибки сервера. Допустим набран адрес несуществующей страницы. В таком случае откроется 404.html

А пока что на данный момент должны иметь:

1. Всю структуру с прошлого занятия.
К ней добавили:
2. Три страницы с ошибками.
3. Файл .htacces в корневой директории.

Это точка отправления.

Шаг 2

Инициализация внешних переменных
Итак, начало у нас положено.
Продолжим-с.

Теперь у нас стоит задача выставить текущие и глобальные настройки сайта.
Основные и незыблемые две - кодировку и уровень ошибок, они прописаны первыми строчками индекса.
<?php
/** 
* We establish the charset and level of errors 
* Устанавливаем кодировку и уровень ошибок 
*/ 
    header("Content-Type: text/html; charset=utf-8"); 
    error_reporting(E_ALL);

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

Еще в config.php добавим еще две константы (одна там уже есть). Обратите внимание на префиксы констант. Они нужны, чтобы невзначай не пересечься с предопределенными константами или константами сторонних скриптов, которые мы, может быть, будем интегрировать в систему.
<?php
/** 
* Configuration file 
* Конфигурационный файл 
* @author IT studio IRBIS-team 
* @copyright © 2009 IRBIS-team 
*/ 
///////////////////////////////////////////////////////// 
/**  
* Choice of language of a site  
* Выбор языка сайта  
*/   
    define('IRB_LANGUAGE', 'ru');  

/**   
* Establishes a physical path to a root directory of a script   
* Устанавливает физический путь до корневой директории скрипта   
*/   
    define('IRB_ROOT', str_replace('\\', '/', $_SERVER['DOCUMENT_ROOT']) .'/');   

/**   
* Establishes a path to a script root for HTTP   
* Устанавливает путь до корневой директории скрипта   
* по протоколу HTTP   
*/   
    define('IRB_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');

Первая для указания полных физических путей, а вторая нужна для полных ссылок.

Для чего это нужно. А для того, чтобы скрипт можно было использовать не только в корне, а в отдельной папке, как дополнение или расширеник какого то готового сайта.
Для этого достаточно добавить в путь эту директорию.
/**  
* Establishes a path to a script root for HTTP  
* Устанавливает путь до корневой директории скрипта  
* по протоколу HTTP 
*/ 
    define('IRB_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/my_site/');

Теперь нужно все пути (к картинкам, стилям и т.д.) начинать с этого
<?php echo IRB_HOST ?>

и не бояться, что в определенный момент нужно будет перенести скрипт в другое место. Просто меняем путь в конфиге и насвистываем веселенький мотивчик.
Теперь ссылки в меню можно написать так:
<!-- skins/tpl/menu.tpl begin -->  
Сегодня <?php echo $date ?> года  
<ul>  
<li><a href="<?php echo IRB_HOST ?>?page=main">Главная страница</a></li>  
<li><a href="<?php echo IRB_HOST ?>?page=second">Вторая страница</a></li>  
</ul>  

<!-- skins/tpl/menu.tpl end -->

А ссылки - это важно. Потому что на гет-параметрах этих ссылок и будет строиться вся навигация и переключение модулей, так как все внутренние ссылки будут вести только на один файл (точку входа) - index.php

Это значит, что нам нужно бережно принять эти параметры и обработать их.

У нас уже был такой прецидент, мы инициализировали переменную $page в файле variables.php как раз для переключения модулей. Еще нам потребуется переменная для переключения разделов модуля (контроллеров). Назовем её $rem. Еще пригодится переменная для постранички. $num И переменная идентификатора чего-либо. Соответственно $id. А чтобы нам не греть голову, откуда появились в скрипте переменные, сложим их все в один массив $GET (не путать с $_GET). И теперь в любом месте будет ясна их принадлежность.
Ну а за одно сразу установим значения по умолчанию. Лишним никогда не будет.
variables.php
/**   
* Initialization of variables GET-parametres   
* Инициализация переменных GET-параметров   
*/   
    $GET['page'] = !empty($_GET['page']) ? $_GET['page'] : 'main'; 
    $GET['rem']  = !empty($_GET['rem']) ? $_GET['rem'] : 'read'; 
    $GET['num']  = !empty($_GET['num']) ? $_GET['num'] : 1;     
    $GET['id']   = !empty($_GET['id']) ? $_GET['id'] : 1;

В главном индексе нужно тоже изменить переменную, коль скоро они у нас все в массиве:
<?php

/** 
* The switch of modules 
* Переключатель страниц 
*/       
    switch($GET['page'])  
    {  
/**   
* Подключаем модуль приветствия   
* Includes the greeting module   
*/          
        case 'main':     
            include './modules/main/router.php';             
        break;

Еще нам понадобятся $_POST переменные. Мы же будем делать интерактивные приложения. В файле с переменными нужно просто указать несколько таких про запас. Если не хватит, потом добавим еще.
variables.php
<?php


/**  
* The block of initialization and processing of entering variables  
* Блок инициализации и обработки переменных  
* @author IT studio IRBIS-team  
* @copyright © 2009 IRBIS-team  
*/  
///////////////////////////////////////////////////////// 

/**   
* Initialization of variables GET-parametres   
* Инициализация переменных GET-параметров   
*/   
    $GET['page'] = !empty($_GET['page']) ? $_GET['page'] : 'main'; 
    $GET['rem']  = !empty($_GET['rem']) ? $_GET['rem'] : 'read'; 
    $GET['num']  = !empty($_GET['num']) ? $_GET['num'] : 1;     
    $GET['id']   = !empty($_GET['id']) ? $_GET['id'] : 1;     
     
/**   
* Initialization of variables POST   
* Инициализация переменных POST   
*/  
    
    $ok       = !empty($_POST['ok'])?true:false;   
    $delete   = !empty($_POST['delete'])?true:false; 
   
    $POST['value1'] = !empty($_POST['value1']) ? $_POST['value1'] : NULL;   
    $POST['value2'] = !empty($_POST['value2']) ? $_POST['value2'] : NULL;  
    $POST['value3'] = !empty($_POST['value3']) ? $_POST['value3'] : NULL;  
    $POST['value4'] = !empty($_POST['value4']) ? $_POST['value4'] : NULL;

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

Еще в этот же файл сразу добавим функцию для удаления магических кавычек.
Весь файл variables.php теперь такой:
<?php


/**  
* The block of initialization and processing of entering variables  
* Блок инициализации и обработки переменных  
* @author IT studio IRBIS-team  
* @copyright © 2009 IRBIS-team  
*/  
///////////////////////////////////////////////////////// 

/**  
* We kill magic inverted commas  
* Убиваем магические кавычки  
*/          
    function stripslashesDeep($data)      
    {      
        if(is_array($data))       
            $data = array_map("stripslashesDeep", $data);       
        else     
            $data = stripslashes($data);       
        return $data;  
    }  

    if(get_magic_quotes_gpc())   
    {   
        $_GET = stripslashesDeep($_GET);    
        $_POST = stripslashesDeep($_POST);    
        $_COOKIE = stripslashesDeep($_COOKIE);  
        $_REQUEST = stripslashesDeep($_REQUEST);  
    } 
     
/**   
* Initialization of variables GET-parametres   
* Инициализация переменных GET-параметров   
*/   
    $GET['page'] = !empty($_GET['page']) ? $_GET['page'] : 'main'; 
    $GET['rem']  = !empty($_GET['rem']) ? $_GET['rem'] : 'read'; 
    $GET['num']  = !empty($_GET['num']) ? $_GET['num'] : 1;     
    $GET['id']   = !empty($_GET['id']) ? $_GET['id'] : 1;     
     
/**   
* Initialization of variables POST   
* Инициализация переменных POST   
*/  
    
    $ok       = !empty($_POST['ok'])?true:false;   
    $delete   = !empty($_POST['delete'])?true:false; 
   
    $POST['value1'] = !empty($_POST['value1']) ? $_POST['value1'] : NULL;   
    $POST['value2'] = !empty($_POST['value2']) ? $_POST['value2'] : NULL;  
    $POST['value3'] = !empty($_POST['value3']) ? $_POST['value3'] : NULL;  
    $POST['value4'] = !empty($_POST['value4']) ? $_POST['value4'] : NULL; 
     
     
/**   
* Other variables   
* Другие переменные   
*/     
   $info  = array();

Это основа всех наших дальнейших поползновений.

Шаг 3
Паттерн MVC. Модель.
Ну раз у нас есть гостевая книга - не пропадать же добру. Попробуем на её основе построить что то более менее приличное.
Начнем с данных. Как помнится, для этого у нас была организована директория data. Ну и тут сделаем тоже самое. Это будет частью модели, а именно хранилищем данных.

Вторая часть - скрипт получения этих данных из хранилища. У нас в гостевой книге за это отвечает функция сканирования директории.
Поместим её в файл libs/model.php
<?php


/**    
* Model functions   
* Функции модели    
* @author IT studio IRBIS-team    
* @copyright © 2009 IRBIS-team    
*/ 
////////////////////////////////////////////////////////////////// 


/**      
* Function of reading of a directory     
* Функция чтения директории 
* @param string      
* @return array     
*/  
    function dirScan($dir)  
    {   
        static $files;  
          
            if(empty($files))  
            {  
                $files = scandir($dir);  
                $files = array_diff($files, array('.', '..'));  
            }  
   
        $files = count($files) ? $files : array('1');  
                  
        return $files;  
    }


Ну и для полного счастья добавим туда же еще две функции. Получения и записи информации, хранимой в виде сериализованных массивов.
<?php


/**     
* Model functions    
* Функции модели     
* @author IT studio IRBIS-team     
* @copyright © 2009 IRBIS-team     
*/  
//////////////////////////////////////////////////////////////////  


/**       
* Function of reading of a directory      
* Функция чтения директории  
* @param string       
* @return array      
*/   
    function dirScan($dir)   
    {    
        static $files;   
           
            if(empty($files))   
            {   
                $files = scandir($dir);   
                $files = array_diff($files, array('.', '..'));   
            }   
    
        $files = count($files) ? $files : array('1');   
                   
        return $files;   
    } 
     
     
/**       
* Function of reception of the information    
* Функция получения информации  
* @param string       
* @return array       
*/   
    function getData($file)   
    {    
        if(file_exists($file)) 
            $string = trim(file_get_contents($file));  
        else 
            exit('No such file '. $file); 

         
        return !empty($string) ? unserialize($string) : array();  
              
    } 

/**       
* Data recording function    
* Функция записи информации 
* @param string       
* @return array      
*/   
    function setData($file, $array)   
    {    
        return file_put_contents($file, serialize($array));  
    }

Вот и вся модель. Тоесть хранилище (папка data в корне) и эти три функции, позволяющие с этими данными работать. То есть находить нужный файл, чтать его, десериализовать массив и выдавать результат. Ну или наоборот - сериализовать массив и складывать в файл по месту назначения.

Пока работы этих скриптов мы не увидим, это внутренняя кухня. А чтобы увидеть, нам потребуется продолжение банкета - вид и контроллер.

Шаг 4
Паттерн MVC. Контроллер
Начнем с контроллера. В нем, для наглядности, будет два блока. Один для вывода информации, другой для записи.

Гостевая книга, как ей и положено, будет находиться на второй странице.
Итак, открываем файл modules/second/read_controller.php и пишем туда это:
<?php


/**   
* The controller of a conclusion of the information   
* Контроллер вывода информации   
* @author IT studio IRBIS-team   
* @copyright © 2009 IRBIS-team   
*/   
/////////////////////////////////////////////////////////   


/**   
* We connect a file of the model functions   
* Подключаем файл функций модели  
*/     
   include './libs/model.php'; 


/**   
* The block of reading of the information   
* Блок чтения информации   
*/  
    $posts = getData('./data/'. $GET['num']);  
    include './libs/bb_tags.php'; 
     
    $rows = '';  
         
    foreach($posts as $id => $post)  
    {  
        $date  = $post['date'];          
        $name  = htmlspecialchars($post['name']);  
        $mess  = nl2br(bbTags(htmlspecialchars($post['mess'])));  
        $rows .= '<div class="guest_post">'. $date .' / <strong> 
                 '. $name .'</strong><hr width="30%" align="left" /> 
                 '. $mess .'</div>';        

    } 

Всё это мы уже проходили в гостевой книге, просто сейчас пытаемся привести в удобоваримый вид. По этому на самом функционале акцентироваться не будем.
Но несколько важных момента отметить надо.
1. Не все страницы и модули будут работать с данными. А значит файл с функциями модели мы будем подключать непосредственно в контроллер.
2.Весь вывод мы поместим в переменную $rows, а не отправим тут же в поток. За вывод отвечает часть паттерна MVC "вид", так что не будем нарушать принципов. И хоть у нас там затесались предательские html-теги, это будет идеологически верно. А с тегами мы разберемся чуть позже.
3. Теперь нет необходимости в контроллере проверять наличие файла, это сделает функция чтения, которую мы поместили в модель. Она нам пригодиться в той же админке или в другом модуле. Допустим можно сделать блок комментариев к статьям или даже модуль новостей. Принцип работы с данными останется прежним.
4. Функция bb-тегов нам понадобится и в админке. Поэтому мы вынесем её в отдельный файл и будем подключать там, где потребуется. Чтобы не переписывать одно и тоже по 10 раз.
libs/bb_tags.php
<?php


/**  
* Replacement function bb-tags and smilies        
* Функция замены bb-тегов и смайликов     
* @param string     
* @return string   
* @author IT studio IRBIS-team  
* @copyright © 2009 IRBIS-team  
*/  
///////////////////////////////////////////////////////// 


    function bbTags($text)   
    {      
        $bb = array(  
                    '[B]',   
                    '
',
'', '',
'
',   
                    '
',
'', '',
'[:)]',
'[:(]',
'[;)]',
'[:D]'
);

$tag = array(
'<b>',
'</b>',
'<i>',
'</i>',
'<s>',
'</s>',
'<u>',
'</u>',
'<img src="'. IRB_HOST .'skins/images/smiles/1.gif" />',
'<img src="'. IRB_HOST .'skins/images/smiles/2.gif" />',
'<img src="'. IRB_HOST .'skins/images/smiles/3.gif" />',
'<img src="'. IRB_HOST .'skins/images/smiles/4.gif" />'
);

return str_ireplace($bb, $tag, $text);
}[/PHP]
Ну скучно же делать что то, не получая тут же результата. Так давайте веселиться. Для начала выведем переменную $rows в шаблон:
<!-- skins/tpl/second/show.html begin --> 

<div style="padding:10px; background-color:#e6e6e6;"> 
<?php echo $rows ?> 
</div> 

<!-- skins/tpl/second/show.tpl end -->

Потом сделаем файл стилей и поместим на свое законное место: skins/css/style.css
/* CSS Document */ 
.guest_post{ 
    border:1px solid;  
    width:70%;  
    background-color:#66FFFF;  
    min-height:100px;  
    margin:5px;  
    padding:5px; 
}

Подключим его к главному шаблону: skins/tpl/index.tpl
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head>  
<title>Мой сайт</title>
 
    <link href="<?php echo IRB_HOST ?>skins/css/style.css" rel="stylesheet" type="text/css" />
 
</head> 
<body> 
<?php echo $content ?> 
</body> 
</html>

И - на старт! Внимание! Мааааарш!
Запускаем.

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

Теперь работает? Если нет, вот тут точно работает.

Ну а мы продолжим. Исправим ситуацию и соорудим блок записи.

Шаг 5
Контроллер. Продолжение.
Итак, нам нужно срочно добавить записей. Для этого нужен блок записи, но для начала разберемся с формой.
Вообще, форма - это тоже вещь, касаемая данных. И её тоже можно, с небольшой натяжкой, отнести к модели. Но суть в том, что как бы мы её не обзывали, формой она быть от этого не перестанет. Я вообще противник каких-либо ярлыков и рамок. Если комуто понравилось назвать это все MVC, ну и Бог ему судья. Нам же гораздо важнее, чтобы все безупречно работало. А назвать можно хоть MVC, хоть VCM, хоть Семен Семенычем, хоть крылатой ракетой "Першинг".

Итак, форма. Добавим её в шаблон модуля:
<!-- skins/tpl/second/show.html begin --> 

<div style="padding:10px; background-color:#e6e6e6;"> 
  
<strong style="color:#FF0000"><?php echo getInfo($info); ?></strong> 

<?php echo $rows ?> 
<form action="" name="post" id="post" method="post">    
Имя:<br />    
<input name="value1" type="text" value="<?php echo $POST['value1'] ?>"/>
<br />   
<img style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/bold.gif" 
alt="Жирный" onclick="tag('[b]','
')">

<img style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/italics.gif"
alt="Курсив" onclick="tag('','')">

<img style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/underline.gif"
alt="Подчеркнутый" onclick="tag('','')">

<img style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/strikethrough.gif"
alt="Зачеркнутый" onclick="tag('
','
')">

<img style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/1.gif" onclick="tag('[:)]','')">
<img style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/2.gif" onclick="tag('[:(]','')">
<img style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/3.gif" onclick="tag('[;)]','')">
<img style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/4.gif" onclick="tag('[:D]','')">
<br />
Сообщение:<br />
<textarea name="value2" id="value2" cols="40" rows="10"><?php echo $POST['value2'];?></textarea><br />
<input name="ok" type="submit" />
</form>
</div>

<!-- skins/tpl/second/show.tpl end -->[/PHP]
Форма нам знакомая, изменились только названия полей и добавилась функция вывода ошибок. Для красоты.
<?php

/** 
* Information conclusion 
* Вывод информации         
*/   
    function getInfo($info) 
    { 
        if(count($info)) 
            return '<br>' . implode('<br>', $info); 
        else 
            return '&nbsp;'; 
    }

Добавилась она, как можно догадаться, в файл с общими функциями (libs/default.php)

И еще нужно взять смайлики и поместить их в папку skins/images
А вот для того, чтобы заработали эти смайлики и bb-теги, нужно в папку skins/js положить этот скрипт:
skins/js/script.js
function tag(text1, text2) 
{

    if ((document.selection)) 
    { 
        document.getElementById('value2').focus(); 

        document.post.document.selection.createRange().text = 
        text1+document.post.document.selection.createRange().text + text2; 

    } else if(document.forms['post'].elements['value2'].selectionStart != undefined) { 
        var element = document.forms['post'].elements['value2']; 
        var str = element.value; 
        var start = element.selectionStart; 
        var length = element.selectionEnd - element.selectionStart; 
        element.value = str.substr(0, start) + text1 + str.substr(start, length) 
        + text2 + str.substr(start + length); 

    }
}

и подключить в главный шаблон:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head>  
<title>Мой сайт</title> 
<link href="<?php echo IRB_HOST ?>skins/css/style.css" rel="stylesheet" type="text/css" />
 
    <script type="text/javascript" language="javascript" src="<?php echo IRB_HOST ?>skins/js/script.js"></script> 
 
</head> 
<body> 
<?php echo $content ?> 
</body> 
</html>

Вот теперь пора сделать и сам блок записи. Функционал его практически не изменился, такой же и был в гостевой книге.
modules/second/read_controller.php
<?php


/**   
* The controller of a guestbook   
* Контроллер гостевой книги   
* @author IT studio IRBIS-team   
* @copyright © 2009 IRBIS-team   
*/   
/////////////////////////////////////////////////////////   


/**   
* We connect a file of the model functions   
* Подключаем файл функций модели  
*/     
   include './libs/model.php'; 

/**   
* The block of recording of the information   
* Блок записи информации   
*/  
    if($ok)    
    {    
        if(!$POST['value1'])    
            $info[] = IRB_LANG_NO_NAME;  
                
        if(!$POST['value2'])    
            $info[] = IRB_LANG_NO_TEXT;;   
               
        if(count($info) == 0)    
        {    
               
             $file = max(dirScan('data'));  
             $posts = getData('data/'. $file);      
                  
             if(count($posts)) 
             {  
                 $keys = array_keys($posts);  
                 $id = max($keys) + 1;  
                 $num = count($posts);  
             }  
             else  
                 $num = $id = 1;  
                  
            if($num >= IRB_NUM_POSTS)  
            {  
                ++$file;  
                unset($posts);  
            }                     
                          
            $posts[$id]['date'] = date('d-m-Y');  
            $posts[$id]['name'] = $POST['value1'];  
            $posts[$id]['mess'] = $POST['value2'];                        
              
            setData('./data/'. $file, $posts);    

            header('location: '. IRB_HOST .'?page=second&num='. $file);    
            exit();    
        }    
    }  
     
     
/**   
* The block of reading of the information   
* Блок чтения информации   
*/  
    $posts = getData('./data/'. $GET['num']);  
    include './libs/bb_tags.php'; 
     
    $rows = '';  
         
    foreach($posts as $id => $post)  
    {  
        $date  = $post['date'];          
        $name  = htmlspecialchars($post['name']);  
        $mess  = nl2br(bbTags(htmlspecialchars($post['mess'])));  
        $rows .= '<div class="guest_post">'. $date .' / <strong> 
                 '. $name .'</strong><hr width="30%" align="left" /> 
                 '. $mess .'</div>';        

    }

Разница только в методах получения и записи информации (теперь это осуществляют специальные функции) и в редиректе. Мы в него подставили константу.

Кстати, о константах. Нужно добавить еще одну в конфигу. Она будет определять количество постов на странице.
<?php


/** 
* Configuration file 
* Конфигурационный файл 
* @author IT studio IRBIS-team 
* @copyright © 2009 IRBIS-team 
*/ 
///////////////////////////////////////////////////////// 

/**  
* Choice of language of a site  
* Выбор языка сайта  
*/   
    define('IRB_LANGUAGE', 'ru'); 
     
/**      
* Quantity of posts on page   
* Количество постов на странице    
*/  
   define('IRB_NUM_POSTS', 5);       

/**   
* Establishes a physical path to a root directory of a script   
* Устанавливает физический путь до корневой директории скрипта   
*/   
    define('IRB_ROOT', str_replace('\\', '/', $_SERVER['DOCUMENT_ROOT']) .'/');   

/**   
* Establishes a path to a script root for HTTP   
* Устанавливает путь до корневой директории скрипта   
* по протоколу HTTP   
*/   
    define('IRB_HOST', 'http://'. $_SERVER['HTTP_HOST'] .'/');

и еще парочку в языковой файл - для валидации данных формы:
language/ru.php (en.php)
<?php


/** 
* Варианты модуля приветствия   
* Variants of the module of a greeting 
*/ 
    define('IRB_WHO_FIRST', 'Мир');  
    define('IRB_WHO_SECOND','Солнце');  
    define('IRB_WHO_THIRD', 'Небо');  
    define('IRB_WHO_FOURTH','Вася');  
    define('IRB_WHO_FIFTH', 'Петя'); 
      
/** 
* Массив месяцев   
* The month array  
*/ 
    $month = array(  
                    '01' => 'января',  
                    '02' => 'февраля',  
                    '03' => 'марта',  
                    '04' => 'апреля',  
                    '05' => 'мая',  
                    '06' => 'июня',  
                    '07' => 'июля',  
                    '08' => 'августа',  
                    '09' => 'сентября',  
                    '10' => 'октября',  
                    '11' => 'ноября',  
                    '12' => 'декабря'  
                  ); 
                   
/** 
* Check data   
* Валидация  
*/                   
    define('IRB_LANG_NO_NAME', 'Нет имени');                   
    define('IRB_LANG_NO_TEXT', 'Текстовая область не заполнена.');

Ну вот теперь кажется и все, контроллер готов к бою. Можно пробовать.

Шаг 6
Паттерн MVC. Вид.
Ну а теперь займемся приведением в порядок отображения. У нас с ним далеко не все в порядке. Начнем с того, что уже проходили. А именно с возврата данных. Самые наблюдательные могли заметить, что у нас пропала обработка данных, которыен выводятся в элементы формы. Напомню:
<input name="value1" type="text" value="<?php echo $POST['value1'] ?>"/>

Тут отсутствует функция htmlspecialchars(). Это все неспроста.

Дело в том, что данные у нас хранятся не в разрозненных переменных, а в массиве $POST (не путать с $_POST). А раз они в массиве, то и обработать их можно одним махом. Для этого сочиним специальную функцию-обертку, которая заставит htmlspecialchars() работать с массивами.
Поместим её в файл libs/view.php, так как данные нужно обрабатывать всегда и повсеместно.
<?php


/** 
* Library of the views functions 
* Библиотека функций отображения 
* @author IT studio IRBIS-team 
* @copyright © 2009 IRBIS-team 
*/ 
/////////////////////////////////////////////////////////<br /> 

/**    
* Function of processing of variables for a conclusion in a stream    
* Функция обработки переменных для вывода в поток     
*/                                                        
    function htmlChars($data)       
    {       
        if(is_array($data))  // Если данные - массив, вызываем эту же функцию.             
            $data = array_map("htmlChars", $data);     
        else  // Если нет, обрабатываем  htmlspecialchars()               
            $data = htmlspecialchars($data);       
       // На выход                             
        return $data;    
    } 

/** 
* Date formatting 
* Форматирование даты  
*/ 
    $date = formatDate(date("Y-m-d"), false);

А теперь просто открываем вьюшку модуля и добавляем туда всего одну строчку:
modules/second/view.php
<?php


/** 
* View 
* Вид 
* @author IT studio IRBIS-team 
* @copyright © 2009 IRBIS-team 
*/ 
///////////////////////////////////////////////////////// 


   $POST = htmlChars($POST); 


/**   
* Подключаем шаблон   
* Includes a templates   
*/ 
    include './skins/tpl/second/show.tpl';

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

Поехали дальше. Блок чтения информации. Тут точно также можно обработать сразу весь массив:
/**   
* The block of reading of the information   
* Блок чтения информации   
*/  
    $posts = getData('./data/'. $GET['num']);  
    include './libs/bb_tags.php'; 
     
    $rows = '';  
         
    foreach($posts as $id => $post)  
    {  
        $post = htmlChars($post); 
        $date  = $post['date'];          
        $name  = $post['name'];  
        $mess  = nl2br(bbTags($post['mess']));  
        $rows .= '<div class="guest_post">'. $date .' / <strong> 
                 '. $name .'</strong><hr width="30%" align="left" /> 
                 '. $mess .'</div>';        

    }

Это удобно, но не столь важно. А важно то, что вот и попались нам эти бессовестные html теги, которым совсем не место в контроллере. Их нужно немедленно поместить в шаблон. Вот так:
<!-- skins/tpl/second/rows.html begin --> 

<div class="guest_post">          
<?php echo $date; ?> / <strong><?php echo $name; ?></strong>  
<hr width="30%" align="left" />  
<?php echo $mess; ?>  
</div> 

<!-- skins/tpl/second/rows.tpl end -->

А вот сам этот шаблон запихать в переменную $rows . Но как это сделать, ведь там переменные, и они должны меняться в каждом витке цикла... А для этого сочиним функцию, которая нам в этом поможет. Поместим её в файл libs/view.php
<?php


/** 
* Library of the views functions 
* Библиотека функций отображения 
* @author IT studio IRBIS-team 
* @copyright © 2009 IRBIS-team 
*/ 
///////////////////////////////////////////////////////// 

/**   
* Function of analysis of a template   
* Функция разбора шаблона   
*/        
    function parseTpl($file, $data = array())   
    {   
                       
            extract($data);   

            ob_start();   
                include $file;   
            $cont = ob_get_contents();     
            ob_end_clean();     

       return $cont;   
    }   
     
     
/**    
* Function of processing of variables for a conclusion in a stream    
* Функция обработки переменных для вывода в поток     
*/                                                        
    function htmlChars($data)       
    {       
        if(is_array($data))  // Если данные - массив, вызываем эту же функцию.             
            $data = array_map("htmlChars", $data);     
        else  // Если нет, обрабатываем  htmlspecialchars()               
            $data = htmlspecialchars($data);       
       // На выход                             
        return $data;    
    } 

/** 
* Date formatting 
* Форматирование даты  
*/ 
    $date = formatDate(date("Y-m-d"), false);

Что это за зверь такой. Ну вопервых, сразу оговорочка. Так делать вообще то нежелательно, потому что мы при каждой интерации (витке) цикла вынуждены обращаться к файловой системе. В следующем разделе я покажу, как этого избежать. А пока для наглядности так.
Но по порядку. Функция extract() разбирает массив на переменные. Теперь (хоть их и не видно) у нас внутри функции определены переменные с названиями, эдентичными ключам массива, и значениями соответственно. Тоесть, если мы передадим в неё массив
    array( 
            'name'  => 'Вася', 
            'mess'  => 'Привет!' 
         )

то внутри нашей функции, после обработки extract() образуются переменные
    $name = 'Вася'; 
    $mess = 'Привет!';

которые мы и подставим в подключенный шаблон. А дальше вступает в силу буферизация, и мы получаем шаблон с нужными значениями в виде строки. Которую и выдаем, как результат работы функции. Теперь нужно немного изменить контроллер (блок чтения) и все будет в порядке. Весь вывод - в шаблонах. А логика в контроллере.
/**   
* The block of reading of the information   
* Блок чтения информации   
*/  
    $posts = getData('./data/'. $GET['num']);  
    include './libs/bb_tags.php'; 
     
    $rows = '';  
         
    foreach($posts as $id => $post)  
    {  
        $post = htmlChars($post); 
        $post['mess']  = nl2br(bbTags($post['mess']));  
        $rows .= parseTpl('./skins/tpl/second/rows.tpl', $post);        

    }

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

А вот итог этого занятия.

Добавлено: 11 Мая 2018 08:41:10 Добавил: Андрей Ковальчук

Является ли указанная страница - домашней?

Работает только в Internet Explorer!

Для проверки выберите Сделать стартовой.
Затем обновите страницу, и проверить домашнюю страницу,
Вы получите сообщение: "Текущая страница установлена как домашняя!".

Является ли текущая страница домашней - можно с помощью такого кода:

<html xmlns:IE>
 <head>
  <title>Демонстрация домашней страницы</title>
  <style type="text/css">
  <!--
  @media all { IE\:homePage { behavior:url(#default#homepage); }
  //-->
  </style>
  <script language="JavaScript" type="text/javascript">
  <!--
   function verify() {
     if( oHomePage.isHomePage( 'http://htmlweb.ru/' ) )	// document.location.href
		alert( "Текущая страница установлена как домашняя!" );
   }
  //-->
  </script>
 </head>
 <body>
  <IE:homePage id="oHomePage" />
  <input type="button" value="test" onClick="verify()">
 </body>
</html>

В качестве аргумента функции isHomePage можно дать любой адрес.

Добавлено: 11 Июля 2018 22:15:47 Добавил: Андрей Ковальчук

Яваскрипт для вставки бб кода в форму

Привет всем моим читателям, я рад что вы сомной. И так начнём с обещанного продолжаем делать форму с бб кодами для сайта. Сегодня я предлагаю создать файл например javaform.js, и сним вот мы и будим работать. Давайте сначала опредилимся, что нам надо от формы, основные потребности. Первым хотелось отметить - это при клике на икоку с определённым тегом, например жирный текст, будит иконка соответственно с буквой В английской, так как (BOLD) и означает жирный шрифт. Значит при клике нам необходимо вставить в форму примерно такое. , соответственно слово вставленное между этими тегами должно выглядеть так , как вы заметили слово так выделилось. Далее, а если пользователь сначала написал какойто комментарий, а потом решил обрамить его тегом выделенным, можно просто выделить текст и вставить в начале и в конце выделенного открывающий и закрывающий тег. Полезная функция и применяется практичесски на всех движках форумов, кмс всеразличных. Две основных функции мы определили значит можно начинать программировать. Из предыдущих постов вспомним создание формы с бб кодами кто не читал рекомендую ознакомиться. Мы видели, что форма имеет определённый id идентификатор, это необходимо при работе с javascript и jquery. Вспомним, что идентификатор формы у нас id="forumform", обязательным параметром при создании такой формы учитывайте параметр name="REPLIER". Теперь смотрим что у нас получилось из предложенного условия.

Код javascript

function bbcode(form,field,v)//Создаем функцию с параматрами, первое условие, идентификатор формы, второе field идентификатор поля textarea и конечно сам тег вставки в поле 

{

if (document.selection) // for IE

{

var str = document.selection.createRange().text;

document.forms[form].elements[field].focus();

var sel = document.selection.createRange();

sel.text = "[" + v + "]" + str + "[/" + v + "]";

return;

}

else if ((typeof document.forms[form].elements[field].selectionStart) != 'undefined') // for Mozilla

{

var txtarea = document.forms[form].elements[field];

var selLength = txtarea.textLength;

var selStart = txtarea.selectionStart;

var selEnd = txtarea.selectionEnd;

var oldScrollTop = txtarea.scrollTop;

var s1 = (txtarea.value).substring(0,selStart);

var s2 = (txtarea.value).substring(selStart, selEnd)

var s3 = (txtarea.value).substring(selEnd, selLength);

txtarea.value = s1 + '[' + v + ']' + s2 + '[/' + v + ']' + s3;

txtarea.selectionStart = s1.length;

txtarea.selectionEnd = s1.length + 5 + s2.length + v.length * 2;

txtarea.scrollTop = oldScrollTop;

txtarea.focus();

return;

}

else insert(form,field,'[' + v + '][/' + v + '] ');

}
function insert(form,field,what)

  {

  if (document.forms[form].elements[field].createTextRange)

  {

  document.forms[form].elements[field].focus();

  document.selection.createRange().duplicate().text = what;

  }

  else if ((typeof document.forms[form].elements[field].selectionStart) != 'undefined') // für Mozilla

  {

  var tarea = document.forms[form].elements[field];

  var selEnd = tarea.selectionEnd;

  var txtLen = tarea.value.length;

  var txtbefore = tarea.value.substring(0,selEnd);

  var txtafter =  tarea.value.substring(selEnd, txtLen);

  var oldScrollTop = tarea.scrollTop;

  tarea.value = txtbefore + what + txtafter;

  tarea.selectionStart = txtbefore.length + what.length;

  tarea.selectionEnd = txtbefore.length + what.length;

  tarea.scrollTop = oldScrollTop;

  tarea.focus();

  }

  else

  {

  document.forms[form].elements[field].value += what;

  document.forms[form].elements[field].focus();

  }

  }

Вот такой вот простенький скрипт получился, по комментариям думаю больше ничего не надо объяснять. Смотрите предидущий пост там есть описано и прописано наглядно как прописывать ссылку для вставки. Кому лень возвращаться и вспоминать продолжу пример вставки жирного текста нужно прописать такого типа
<a  href="javascript:void(0)" onclick="bbcode('идентификатор формы','идентификатор поля textarea так как в него будим вставлять код',и собственно сам тег'B');">B</a>

Здесь я думаю все понятно как это происходит, в следующей статье обязательно просмотрим остальные вставка в форму, текста выделенного, вставка ссылок, цветного текста. До встречи!

Добавлено: 25 Августа 2013 12:04:26 Добавил: Андрей Ковальчук

Юзабилити – тестирование в домашних условиях

Я несколько лет занимаюсь созданием сайтов и по программной части, да и по всему остальному тоже, разговоры с клиентом веду я. Не так давно клиент начал умнеть и теперь помимо слов: макет, хостинг, скрипты, движок и база у него появилось новое слово – “юзабилити - тестирование”. От куда они этого нахватались неизвестно, может от иностранных коллег, может из книг. Кто его знает. И каждый раз приходится им объяснять, что это такое и с чем его едят. И все хотят, чтобы я обязательно его провёл и предоставил им отчёт. А так как в профессиональных студиях такие вещи очень дороги и мне они не по карману, приходится изобретать велосипед. В этой статье я бы хотел рассказать о том, как провести юзабилити - тест в домашних условиях. И так начнём…

Прочитав достаточное количество статей, я понял, что если вы хотите получить хороший сайт, его нужно тестировать. Ведь поработав несколько недель над одним проектом, ты знаешь каждую его мелочь, но её не знает рядовой пользователь. Надо понимать, что люди, а точнее целевая аудитория твоего будущего сайта может не думать, так как это делаешь ты, люди могут использовать другие методики поиска в Интернет нужной им информации. И в связи с этими обстоятельствами нельзя тестировать сайт самому. Обычно я прошу друзей сделать это для меня. Главное помнить, что лучше сайт протестирует хотя бы один человек, чем этого не сделает ни кто. Но для начала тестирования в “домашних условиях” нужно подготовить некоторые вещи. Например, список вопросов, которые вы будете задавать. Я, конечно, понимаю, что всё предугадать невозможно, но всё основное у вас должно быть на руках, остальное к вам придёт непосредственно при тестировании. Ещё вам понадобится записывающий магнитофон и/или видеокамера, расставьте их так, чтобы они не мешались пользователю и могли свободно записывать все, что происходит. Камера должна снимать только монитор, для дальнейшего анализа ошибок пользователя. При хорошем стечении обстоятельств вам понадобятся две камеры. Одна из них должна снимать пользователя и его реакцию на те или иные события, а другая должна снимать всё, что происходит на мониторе. Если же вы стеснены в финансах и у вас нет камеры, то вы описываете всё что увидите словами в какой либо тетради, но не советую, анализировать весь процесс тестирования будет очень сложно. Приготовьте два стула (себе и собеседнику) и поставьте их рядом, но так, чтобы пользователю вы не мешались, и он чувствовал себя свободно и раскованно. Включите компьютер и загрузите с локального сервера копию сайта. Выключите монитор. Вот и всё, место для тестирования готово.

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

С чего начинать, да всё просто. Для начала предложите тестируемому кофе или чай, для того чтобы он почувствовал себя спокойнее. Объясните ему, что он в процессе тестирования должен спокойно проговаривать свои мысли и не бояться ошибаться, ведь тестируете вы сайт, а не его. Человек должен понять, что ничего страшного в этом нет, и никто на него не будет ругаться, если он сделает что-то не так. Да и вы сами должны спокойно реагировать на все глупости, которые может выкинуть пользователь в процессе тестирования. Главное спокойно относиться ко всему и не давать пользователю замолчать, пользователь должен проговаривать всё, что он думает и не стесняться этого. Ведь главное в тестировании это слова пользователя и его ход мыслей, а целью всего этого процесса является осмысление ошибок и их устранение.

Попили чаю, идём дальше. Предложите пользователю сесть перед компьютером и включите монитор. С этого момента вы должны наблюдать за ходом мысли тестера, при этом, задавать ему вопросы и просить выполнить какие либо действия, но не старайтесь ему помочь, пользователь должен сам найти выход из ситуации или достичь цели, которая была ему поставлена. Лишь только если вы увидите, что тестируемый окончательно поставлен в тупик ввиду ошибки вашего сайта или же непонимания происходящего вы можете помочь ему советом или показать, как это можно обойти. После чего вы должны сделать пометку о данной ошибке и в дальнейшем убрать или доработать её. Для начала поинтересуйтесь у пользователя, что он думает о главной странице, понятен ли ему смысл и предназначение сайта, что привлекло его внимание сразу, а чего он не заметил, как ему нравится сочетание цветов, возникают ли у него ассоциации и дальше в таком духе. Потом можно попросить пользователя выполнить какую либо простую операцию (например, если вы тестируете магазин, попросите пользователя заказать определённый товар, который с начала он должен найти, а потом добавить товар в корзину и оформить заказ на себя). Но не забывайте о том, что ваш пользователь должен проговаривать все свои мысли и объяснять все свои поступки. После просмотра и оценки главной страницы (обычно от 3 до 5 мин) переходите на другие страницы и элементы сайта. В частности пробегитесь с пользователем по всем меню, обычно первые проблемы возникают именно на почве не грамотно построенного и отсортированного меню. Затем можно попробовать воспользоваться сервисами (если, конечно же, они есть), предоставляемые данным сайтом. Будь-то голосование или служба рассылок, главное узнать, понятно ли предназначение данных сервисов. После того, как пользователь просмотрел весь сайт (или большую его часть) вы должны поинтересоваться у него, что ему особенно понравилось в большей степени, а что в меньшей. Какие мысли и предложения есть у него самого. Не забывайте всё это записывать. После тестирования первого человека пригласите второго и повторите тест. Обычно на тестирование сайта требуется 3-4 человека. В среднем один сайт тестируется от 30 минут до одного часа. Как показывает практика, если ошибка серьёзная, то все пользователи, как правило, останавливаются в одном и том же месте, заходя в тупик, или просто сообщают вам о ней.

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

И вот настал тот день, когда вы исправили все замеченные ошибки. Вы думаете, что всё у вас в порядке и собираетесь выкладывать сайт, не торопитесь, пригласите ещё 2-3 человек и проведите повторный тест. Я много раз убеждался, что при исправлении одних ошибок, вылезает много других. При повторном тестировании старайтесь не использовать тех людей, которые были использованы при первом тестировании, старайтесь подключать к этому, как можно больше новых и разных личностей. Лично мне хватает двух тестирований, чтобы удалить практически все имеющиеся ошибки. Остальное дорабатывается уже после запуска сайта в эксплуатацию.

Перед тем, как сдавать сайт заказчику и получать с него деньги напишите маленький отчет (обычно 1-2 листа) и предоставьте все имеющиеся у вас материалы тестирований. Это производит очень большой эффект вашей компетентности по данному вопросу и в дальнейшем большую часть заказов будет приходить от партнёров, друзей родственников вашего заказчика. Вот вроде бы и всё, список приблизительных вопросов, которые нужно задавать пользователю – тестеру вы сможете найти в книге Стива Круга “Вебдизайн”.

Успехов вам в этом нелёгком деле, как создание сайтов.

Добавлено: 18 Апреля 2018 21:32:04 Добавил: Андрей Ковальчук

Юзабилити – тестирование в домашних условиях

Я несколько лет занимаюсь созданием сайтов и по программной части, да и по всему остальному тоже, разговоры с клиентом веду я. Не так давно клиент начал умнеть и теперь помимо слов: макет, хостинг, скрипты, движок и база у него появилось новое слово – “юзабилити - тестирование”. От куда они этого нахватались неизвестно, может от иностранных коллег, может из книг. Кто его знает. И каждый раз приходится им объяснять, что это такое и с чем его едят. И все хотят, чтобы я обязательно его провёл и предоставил им отчёт. А так как в профессиональных студиях такие вещи очень дороги и мне они не по карману, приходится изобретать велосипед. В этой статье я бы хотел рассказать о том, как провести юзабилити - тест в домашних условиях. И так начнём…

Прочитав достаточное количество статей, я понял, что если вы хотите получить хороший сайт, его нужно тестировать. Ведь поработав несколько недель над одним проектом, ты знаешь каждую его мелочь, но её не знает рядовой пользователь. Надо понимать, что люди, а точнее целевая аудитория твоего будущего сайта может не думать, так как это делаешь ты, люди могут использовать другие методики поиска в Интернет нужной им информации. И в связи с этими обстоятельствами нельзя тестировать сайт самому. Обычно я прошу друзей сделать это для меня. Главное помнить, что лучше сайт протестирует хотя бы один человек, чем этого не сделает ни кто. Но для начала тестирования в “домашних условиях” нужно подготовить некоторые вещи. Например, список вопросов, которые вы будете задавать. Я, конечно, понимаю, что всё предугадать невозможно, но всё основное у вас должно быть на руках, остальное к вам придёт непосредственно при тестировании. Ещё вам понадобится записывающий магнитофон и/или видеокамера, расставьте их так, чтобы они не мешались пользователю и могли свободно записывать все, что происходит. Камера должна снимать только монитор, для дальнейшего анализа ошибок пользователя. При хорошем стечении обстоятельств вам понадобятся две камеры. Одна из них должна снимать пользователя и его реакцию на те или иные события, а другая должна снимать всё, что происходит на мониторе. Если же вы стеснены в финансах и у вас нет камеры, то вы описываете всё что увидите словами в какой либо тетради, но не советую, анализировать весь процесс тестирования будет очень сложно. Приготовьте два стула (себе и собеседнику) и поставьте их рядом, но так, чтобы пользователю вы не мешались, и он чувствовал себя свободно и раскованно. Включите компьютер и загрузите с локального сервера копию сайта. Выключите монитор. Вот и всё, место для тестирования готово.

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

С чего начинать, да всё просто. Для начала предложите тестируемому кофе или чай, для того чтобы он почувствовал себя спокойнее. Объясните ему, что он в процессе тестирования должен спокойно проговаривать свои мысли и не бояться ошибаться, ведь тестируете вы сайт, а не его. Человек должен понять, что ничего страшного в этом нет, и никто на него не будет ругаться, если он сделает что-то не так. Да и вы сами должны спокойно реагировать на все глупости, которые может выкинуть пользователь в процессе тестирования. Главное спокойно относиться ко всему и не давать пользователю замолчать, пользователь должен проговаривать всё, что он думает и не стесняться этого. Ведь главное в тестировании это слова пользователя и его ход мыслей, а целью всего этого процесса является осмысление ошибок и их устранение.

Попили чаю, идём дальше. Предложите пользователю сесть перед компьютером и включите монитор. С этого момента вы должны наблюдать за ходом мысли тестера, при этом, задавать ему вопросы и просить выполнить какие либо действия, но не старайтесь ему помочь, пользователь должен сам найти выход из ситуации или достичь цели, которая была ему поставлена. Лишь только если вы увидите, что тестируемый окончательно поставлен в тупик ввиду ошибки вашего сайта или же непонимания происходящего вы можете помочь ему советом или показать, как это можно обойти. После чего вы должны сделать пометку о данной ошибке и в дальнейшем убрать или доработать её. Для начала поинтересуйтесь у пользователя, что он думает о главной странице, понятен ли ему смысл и предназначение сайта, что привлекло его внимание сразу, а чего он не заметил, как ему нравится сочетание цветов, возникают ли у него ассоциации и дальше в таком духе. Потом можно попросить пользователя выполнить какую либо простую операцию (например, если вы тестируете магазин, попросите пользователя заказать определённый товар, который с начала он должен найти, а потом добавить товар в корзину и оформить заказ на себя). Но не забывайте о том, что ваш пользователь должен проговаривать все свои мысли и объяснять все свои поступки. После просмотра и оценки главной страницы (обычно от 3 до 5 мин) переходите на другие страницы и элементы сайта. В частности пробегитесь с пользователем по всем меню, обычно первые проблемы возникают именно на почве не грамотно построенного и отсортированного меню. Затем можно попробовать воспользоваться сервисами (если, конечно же, они есть), предоставляемые данным сайтом. Будь-то голосование или служба рассылок, главное узнать, понятно ли предназначение данных сервисов. После того, как пользователь просмотрел весь сайт (или большую его часть) вы должны поинтересоваться у него, что ему особенно понравилось в большей степени, а что в меньшей. Какие мысли и предложения есть у него самого. Не забывайте всё это записывать. После тестирования первого человека пригласите второго и повторите тест. Обычно на тестирование сайта требуется 3-4 человека. В среднем один сайт тестируется от 30 минут до одного часа. Как показывает практика, если ошибка серьёзная, то все пользователи, как правило, останавливаются в одном и том же месте, заходя в тупик, или просто сообщают вам о ней.

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

И вот настал тот день, когда вы исправили все замеченные ошибки. Вы думаете, что всё у вас в порядке и собираетесь выкладывать сайт, не торопитесь, пригласите ещё 2-3 человек и проведите повторный тест. Я много раз убеждался, что при исправлении одних ошибок, вылезает много других. При повторном тестировании старайтесь не использовать тех людей, которые были использованы при первом тестировании, старайтесь подключать к этому, как можно больше новых и разных личностей. Лично мне хватает двух тестирований, чтобы удалить практически все имеющиеся ошибки. Остальное дорабатывается уже после запуска сайта в эксплуатацию.

Перед тем, как сдавать сайт заказчику и получать с него деньги напишите маленький отчет (обычно 1-2 листа) и предоставьте все имеющиеся у вас материалы тестирований. Это производит очень большой эффект вашей компетентности по данному вопросу и в дальнейшем большую часть заказов будет приходить от партнёров, друзей родственников вашего заказчика. Вот вроде бы и всё, список приблизительных вопросов, которые нужно задавать пользователю – тестеру вы сможете найти в книге Стива Круга “Вебдизайн”.

Успехов вам в этом нелёгком деле, как создание сайтов.

Добавлено: 17 Августа 2013 02:43:03 Добавил: Андрей Ковальчук

Юзабилити главной страницы

Чтобы обратить на себя внимание посетителя, у сайта есть всего 10 секунд. Удержит ли пользователя главная страница Вашего сайта? В обществе, насыщенном информацией и многочисленными сайтами разной направленности, главная страница сайта должна привлечь внимание посетителей и ответить на вопросы: где, что дальше, зачем. Отвечает ли главная страница Вашего узла этим требованиям? В этом выпуске перечислены основные принципы создания удобных главных страниц (по материалам работ Якоба Нильсена)

Зачем?

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

Назначение сайта

1. Название и/или логотип компании должны иметь подходящий размер и располагаться в заметном месте страницы. Обычно это верхний левый угол (для языков читающихся слева направо)
2. Добавить к странице рекламный лозунг, который бы четко характеризовал, чем занимается данная компания (или для чего предназначен сайт)
3. Четко выделите первостепенные задачи сайта, чтобы, попав на главную страницу, посетитель сразу понимал, с чего ему следует начинать (например, середина верхней части страницы. Постарайтесь не перегружать эту область визуальными эффектами – если выделить все, пользователь не заметит ничего.
4. Количество ключевых задач должно быть небольшим (1-4), а область страницы вокруг нее – незаполненной)
5. Оформление главной страницы должно четко отличать ее от остальных страниц сайта.

Информация о компании

Если поддерживаете механизм Обратной связи, объясните назначение данной ссылки и уточните детали – кто именно будет читать полученные сообщения: служба работы с клиентами или web-мастер и т.п.

Стиль содержимого сайта

Выбирая слова, ориентируйтесь на язык пользователей. Названия разделов и категорий должны соответствовать их названию с точки зрения пользователя, а не компании (например, широкое понятие «Информация для потребителя» лучше заменить на «Как сэкономить энергию у себя дома»)

Не употребляйте слишком много умных фраз или рекламного жаргона, которые только затрудняют понимание (не «Выбирай, планируй и вперед!», а «Планирование отпуска»)

Строго следите за применением прописных букв и соблюдением стилевого форматирования (если все элементы списка набраны прописными и строчными буквами, а один – только прописными, складывается впечатление, что данный элемент важнее других)

Формулируя задания для пользователей сайта, используйте повелительное наклонение, например «Введите название города».

Избегайте восклицательных знаков (тогда их придется часто использовать либо остальной текст потеряет значимость)

Использование примеров для краткого обзора содержимого сайта

Примеры должны рассказывать, а не просто описывать содержимое сайта (заголовок «Товары» скажет много меньше, чем фотографии нескольких реальных товаров вместе с их ценами)

Каждый пример должен сопровождаться ссылкой на подробное описание данного продукта, а не категории, к которой он принадлежит

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

Ссылки на подробную информацию о конкретном продукте должны отличаться от ссылок на категорию в целом.

Ссылки

Не используйте в названиях ссылок инструкции общего характера, как, например «Нажмите сюда»

Цвета просмотренных и непросмотренных ссылок должны различаться

В названии ссылки или группы ссылок не употребляйте само слово «ссылка». Чтобы показать, что данное слово или фраза является ссылкой, подчеркните его/ее и выделите голубым

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

Навигация

Главная панель навигации должна находиться в заметном месте страницы, предпочтительно рядом с ее основной частью (не следует размещать верхнюю горизонтальную панель навигации (неважно, главную или какую-нибудь другую) над графическими элементами наподобие горизонтальных границ или баннеров – пользователи зачастую игнорируют любую прямоугольную область в верхней части экрана, а также все, что находится выше нее. Подобное поведение называют «баннерной слепотой».

Страница не должна содержать активной (т.е. такой, на которой можно щелкнуть) ссылки на саму себя.

Не используйте в названиях элементов навигации самостоятельно придуманные искусственные слова. В названиях категорий должно быть заложено их различие – если пользователи не поймут выдуманной терминологии, то не смогут и различить категории.

Поиск

Главная страница должна содержать непосредственно поле для ввода поисковых запросов, а не просто ссылка на страницу поиска.

Ссылки на службу сайта

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

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

Графика и анимация

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

Графическое оформление

Постарайтесь обойтись без горизонтальной полосы прокрутки для разрешения экрана 800 на 600 пикселей.

Все главные элементы главной страницы по возможности должны находиться «выше линии сгиба» (в первом экране страницы, доступном без вертикальной прокрутки) для наиболее распространенного разрешения экрана, которое на данный момент составляет 1024 на 768 пикселей.

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

Элементы интерфейса

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

Адрес главной страницы

Главные страницы коммерческих компаний должны иметь адрес вида www.company.com (или эквивалентный URL для домена Вашей страны или некоммерческого домена верхнего уровня. Позаботьтесь так же о том, чтобы главная страница компании «отвечала» на оба адреса www.company.com и company.com)

Если содержание сайта тесно привязано к конкретной стране, адрес должен содержать домен верхнего уровня данной страны.

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

Новости и пресс-релизы

Составьте специальное резюме для каждой статьи или пресс-релиза, о которых упоминается на главной странице. (Не следует в качестве резюме просто воспроизводить первый абзац статьи, который явно не предназначался для самостоятельного «существования»)

Раскрывающиеся окна и промежуточные страницы

Пользователи, набравшие в адресной строке обозревателя главный URL Вашего сайта либо пришедшие на него по ссылке, должны попадать сразу на «настоящую» главную страницу. (Никаких эффектных заставок и промежуточных страниц быть не должно. Исключение – если на сайте содержаться материалы, чтение которых не разрешено детям или некоторым другим категориям пользователей – заставка с предупреждением о наличие материала определенной тематики будет даже уместной).

Откажитесь от раскрывающихся окон. (Дополнительные окна только отвлекают внимание от главной странице, и даже если в этих окнах содержится какая-либо ценная информация, большинство пользователей все равно примут их за рекламные объявления и постараются побыстрее закрыть. Еще один недостаток раскрывающихся окон заключается в том, что от них легко избавится – как только пользователь закрывает такое окно, оно исчезает, и его назад невозможно, если даже пользователю очень захочется)

Рекламные объявления

Рекламные баннеры других компаний следует вынести «на периферию» страницы. (Никогда не размещайте баннеры рядом с первостепенными элементами страницы – наряду с баннерами посетители проигнорируют и сами элементы. Вообще не рекомендуется размещать главную информацию страницы над рекламными объявлениями: большинство пользователей «страдает» от «баннерной слепоты», т.е. проигнорируют все, что находится выше области размещения баннеров)

Избегайте общепринятых приемов дизайна рекламных баннеров в оформлении основного содержимого сайта.

Сообщение о технических проблемах и внештатных ситуациях
Если сайт «слег» или если важные элементы сайта перестали работать, немедленно сообщите об этом на главной странице. (Постарайтесь хотя бы примерно оценить, сколько времени уйдет на устранение неполадок – например, скажите не просто «Попробуйте зайти на сайт несколько позднее», а «Как ожидается, сайт заработает около 4 часов вечера») Заранее продумайте план работы с сайтом на случай внештатных ситуаций. (Например, подготовьте альтернативную главную страницу со специально областью, отведенной под сообщение о возникшем чрезвычайном положении, а также с упрощенной схемой навигации, которая бы состояла из нескольких перекрестных ссылок и способ возвращения к главной странице сайта)

Благодарности

Не тратьте драгоценное место страницы на выражение благодарностей поисковой системе, дизайнерской студии, любимой марке Internet-обозревателя или применяемой на сайте технологии. (Пользователей это совершенно не волнует, а каждый лишний элемент страницы только усложняет ее и отвлекает внимание от основного содержания)

Добавлено: 10 Апреля 2018 07:32:33 Добавил: Андрей Ковальчук