Location: PHPKode > projects > Sound PHP Engine > s-p-e-0.3.0/s-p-e-0.3.0/how-it-works/manual/index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<HTML lang="ru">
<HEAD>
<TITLE>Руководство пользователя и разработчика Sound PHP Engine</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</HEAD>
<BODY>
<H1>Руководство пользователя и разработчика Sound PHP Engine</H1>
<center>Версия 0.3.1</center>
<P>Copyright (C) 2010, 2011 Vladimir B. Tsarkov</P>
<p>Permission is granted to copy, distribute and/or modify this document 
under the terms of the GNU Free Documentation License, Version 1.2 
or any later version published by the Free Software Foundation; 
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. 
A copy of the license is included in the section entitled "GNU Free Documentation License".</p>

<p>Разрешается копирование, распространение и/или модификация данного 
документа согласно условиям GNU Free Documentation License 
(лицензии на свободную документацию GNU) версии 1.2 или любой 
более поздней версии, опубликованной Фондом Свободного программного 
обеспечения (Free Software Foundation); без Неизменных Разделов, 
Текстов на Передней и Задней Обложках. Копия лицензии находится в 
разделе под названием "GNU Free Documentation License".</p>

<h2>Содержание</h2>
<ol>
<li><a name="chistory" href="#history">История внесения изменений (History)</a>

<li><a name="cdesc" href="#desc">Общее описание программы, 
а также руководства пользователя и разработчика</a>

<li><a name="cfeedback" href="#feedback">Обратная связь</a>

<li><a name="cversions" href="#versions">Нумерация версий программы</a>

<li><a name="cadd" href="#add">Добавления, а также исправления, 
внесённые в программу и планируемые</a>
<li><a name="cinstall" href="#install">Руководство по установке программы</a>
<li><a name="ccfgfile" href="#cfgfile">Конфигурационный файл</a>
<li><a name="cdb" href="#db">База данных и взаимодействие с ней
в Sound PHP Engine</a>
<li><a name="cerror" href="#error">Коды ошибок</a>
<li><a name="cmultilang" href="#multilang">Многоязыковая поддержка</a>
<li><a name="cfuncdesc" href="#funcdesc">Описание подпрограмм</a>

<ul>
<li><a name="cauth" href="#auth">auth($connector, $sid, $type, $prefix)</a>

<li><a name="ccache" href="#cache">cache()</a>

<li><a name="ccomments" href="#comments">comments($id, $rid, $host, $user, $password, $database, $prefix)</a>

<li><a name="cconnect" href="#connect">connect($host, $user, $password, $database, &$connector)</a>

<li><a name="clangch" href="#langch">langch($lng)</a>

<li><a name="clanguage" href="#language">language($language)</a> 

<li><a name="cline" href="#line">line()</a>

<li><a name="cpubform" href="#pubform">publicform($type, $tabheader, $partname, $theme, $intro, 
$full, $date, $num, $time, $update)</a>

<li><a name="cpwdlength" href="#pwdlength">pwdlength($newpwd)</a>

<li><a name="credirect" href="#redirect">redirect($value)</a>

<li><a name="csearch-pager" href="#search-pager">search_pager($pageline, $page, $addrline, $pageq)</a>

<li><a name="csearch-parser" href="#search-parser">search_parser($array, $type)</a>

<li><a name="copen" href="#open">open()</a>

<li><a name="cclose" href="#close">close()</a>

<li><a name="cread" href="#read">read($value)</a>

<li><a name="cwrite" href="#write">write($info, $value)</a>

<li><a name="cdestroy" href="#destroy">destroy($value)</a>

<li><a name="cgc" href="#gc">gc()</a>

<li><a name="cpattern" href="#pattern">Шаблон для описания новых подпрограмм</a>
</ul>

<li><a name="cinterface" href="#interface">Описание интерфейса пользователя Sound PHP Engine</a>

<ul>
<li><a name="cadminpanel" href="#adminpanel">Панель администратора</a>

<ul>
<li><a name="csegpart" href="#segpart">Сегмент "Разделы"</a>
<li><a name="csegcrpart" href="#segcrpart">Сегмент "Создание и удаление разделов"</a>
<li><a name="csegbind" href="#segbind">Сегмент "Привязка корреспондентов"</a>
<li><a name="csegarc" href="#segarc">Сегмент "Архивация"</a>
<li><a name="cseguaddrem" href="#seguaddrem">Сегмент "Добавление и удаление пользователей"</a>
<li><a name="csegupdateui" href="#segupdateui">Сегмент "Обновление данных пользователей"</a>
<li><a name="csegmisc" href="#segmisc">Сегмент "Дополнительно"</a>
<li><a name="cseguserview" href="#seguserview">Сегмент "Просмотр данных пользователей"</a>
<li><a name="cseginfo" href="#seginfo">Сегмент "Информация"</a>
<li><a name="csegaddinfo" href="#segaddinfo">Общие рекомендации и замечания</a>
</ul>

<li><a name="csimple-edit" href="#simple-edit">Панель для редактирования содержимого разделов</a>
</ul>

<li><a href="#fdl" name="cfdl">GNU Free Documentation License</a>
</ol>

<h2>1. <a name="history" href="#chistory">История внесения изменений (History)</a></h2>

<p>Руководство пользователя и разработчика Sound PHP Engine<br>
07/06/2010 - version 0.1.0 - Vladimir B. Tsarkov (vbt)<br>
23/06/2010 - version 0.2.0 - vbt<br>
15/11/2011 - version 0.3.0 - vbt<br>
23/12/2011 - version 0.3.1 - vbt<br>
31/12/2011 - version 0.3.2 - vbt</p>

<h2>
2. <a name="desc" href="#cdesc">
Общее описание программы, а также руководства пользователя и разработчика
</a>
</h2>

<p>s-p-e - это свободная, распространяемая согласно GNU General Public License, 
система управления содержанием (Content Management System), реализованная 
на языке PHP. В качестве СУБД используется MySQL.</p>

<p>Изначально программа создавалась для решения практических задач 
автора и можно сказать, что сегодня реализовано многое из задуманного.</p>

<p>В s-p-e умышленно не используются JavaScript и cookies 
(они заменены сессиями с передачей идентификатора в адресной строке). 
Также в s-p-e нет места объектно-ориентированному программированию. 
Все необходимые подпрограммы оформлены стандартными средствами PHP в виде функций.</p>

<p>Надеюсь, что кому-то отмеченные характеристики s-p-e придутся по душе.</p>

<p>Sound PHP Engine подходит как основа для небольших проектов и хорошо 
применим в качестве средства самообразования в сфере web-технологий. 
Каталог how-it-works, входящий в дистрибутив программы, содержит 
подробную информацию о том, как s-p-e работает, что значительно 
упрощает задачу изменения и доработки исходного кода программы.
Разумеется, текущая версия s-p-e (0.2) пока ещё содержит недочёты, 
которые, вероятнее всего, не позволят её полноценно использовать 
человеку, не умеющему программировать и не стремящемуся этому научиться.</p>

<p>s-p-e распространяется согласно лицензии GNU General Public License.</p>
	
<p>Основные возможности и особенности программы:</p>

<ul>
<li>публикация новостей, статей и объявлений;
<li>реализация многоязыковой поддержки на базе GNU gettext;
<li>версия для печати;
<li>возможность архивации новостей и статей;
<li>посетители сайта могут комментировать опубликованные новости;
<li>графический интерфейс администрирования программы и ее пользователей;
<li>возможность быстрого изменения дизайна программы;
<li>для авторизации и идентификации пользователей программа использует
сессии, что позволяет не выдвигать никаких требований к настройкам 
обозревателя посетителей сайта, созданного на основе s-p-e (в текущей
версии программы функция ini_set() не используется, поэтому в файле php.ini, который
лежит на сервере, переменная session.use_cookies должна равняться нулю, 
а session.use_trans_sid должна быть равна единице);
<li>данные сессий хранятся в базе данных, что делает похищение сеанса почти
невыполнимой задачей;
<li>пароли пользователей программы хранятся в зашифрованном виде;
<li>интерфейс s-p-e удобно использовать через текстовые обозреватели: 
w3m (превосходное отображение), links и другие.
</ul>

<p>Для упрощения знакомства с программой -- руководства 
пользователя и разработчика сведены в один документ.</p>

<h2>
3. <a name="feedback" href="#cfeedback">Обратная связь</a>
</h2>                                   

<p>Владимир Царьков [vbt] - основатель проекта<br> 
E-mail: lipetsk-gnu-lug at bk period ru</p>

<p>Отзывы и предложения присылайте пожалуйста на указанный выше адрес
электронной почты.</p>

<h2>
4. <a name="versions" href="#cversions"> Нумерация версий программы</a>
</h2>

<p>Нумерация осуществляется по следующему шаблону:
НАЗВАНИЕ_ПРОГРАММЫ-Major-Minor-Release</p>

<p>Было решено, что значение Release, равное
нулю, будет соответствовать версии s-p-e,
распространяемой мною (vbt), как основателем проекта.</p>

<p>Изменения, внесённые другими разработчиками,
рекомендуется сопровождать изменением значения Release.</p>

<p>Это делается для того, чтобы потенциальные пользователи и
разработчики хотя бы приблизительно знали о том, какой
функционал содержит та или иная версия программы.</p>

<p>К примеру, я (vbt) не планирую в рамках данного
проекта применять ни JavaScript, ни элементы ООП.
Другие же разработчики могут этого страстно желать
и делать.</p>

<h2>
5. <a name="add" href="#cadd">
Добавления, а также исправления, внесённые в программу или планируемые
</a>
</h2>

<p>Если Вы нашли ошибки в программе -- пишите мне, либо присылайте патчи.</p>

<p>В дальнейшем планируется настроить взаимодействие
программы с модулем Apache mod_rewrite. Это позволит
упростить индексацию поисковыми системами страниц, 
генерируемых Sound PHP Engine.</p>

<h2>
6. <a name='install' href='#cinstall'>
Руководство по установке программы
</a>
</h2>

<ol>
<li>Перейдите к консоли системы управления базами
данных MySQL. Из командной строки GNU/Linux это можно
сделать, например, так:
<ul>
<p><b>sudo mysql -p</b></p>
</ul>

<li>Создайте базу данных (БД) с произвольным именем (латиницей):
<ul>
<p><b>create database ИМЯ_БАЗЫ_ДАННЫХ;</b></p>
</ul>

<li>Загрузите в БД данные из файла sql/s-p-e.sql. 
Например, так:
<ul>
<p><b>use ИМЯ_БАЗЫ_ДАННЫХ;</b></p>
<p><b>source /var/www/s-p-e-ВЕРСИЯ/sql/s-p-e.sql;</b></p>
</ul>

Проверить создались ли таблицы можно командой:

<ul>
<p><b>show tables;</b></p>
</ul>

<li>В файле <b>data/configure/specfg.php</b> пропишите параметры доступа
к MySQL серверу и желаемый язык интерфейса.

<li>Зайдите на страницу <b>data/auth.php</b> и авторизуйтесь как администратор.
По умолчанию у администратора учётное имя: <b>admin</b> и пароль: <b>12345678</b>.
В дальнейшем, в целях безопасности, пароль необходимо сменить.

<li>Используя возможности панели администрирования сделайте следующее:

<ul>
<li>смените пароль администратора
<li>создайте один или несколько разделов
<li>создайте учётную запись редактора
<li>создайте учётную запись одного или нескольких корреспондентов
<li>закрепите корреспондентов за разделами
</ul>

<li>В файле <b>data/configure/specfg.php</b> укажите информацию о том, содержание
каких разделов будет отображаться в списке свежих публикаций. В частности, 
могут отображаться публикации из разделов статей (<b>articles</b>) либо новостей (<b>news</b>), 
либо из тех и других разделов (<b>all</b>). Таким образом, если вы хотите, чтобы
в списке свежих публикаций выводились только новости, задайте переменной
<b>$cfg["std"]</b> значение news: <b>$cfg["std"] = "news";</b>. По-умолчанию
используется значение <b>all</b>. 

<li>С помощью обозревателя перейдите на страницу <b>s-p-e-ВЕРСИЯ/index.php</b>.
</ol>

<p>ПРИМЕЧАНИЯ</p>

<ol>
<li>В случае если, после установки s-p-e, вместо главной страницы <b>s-p-e-ВЕРСИЯ/index.php</b> появилось
сообщение об ошибке, проверьте (в первую очередь) настроен ли ваш PHP интерпретатор на работу
с GNU gettext (опция --with-gettext).

<li>Настройка "версии для печати" осуществляется редактированием файла <b>data/configure/specfg.php</b>.

<li>Информацию об условиях распространения публикуемых вами материалов 
вы можете указать в файле <b>data/configure/specfg.php</b>.

<li>Для корректной работы сеcсий необходима корректная настройка сервера. 
в текущей версии программы функция ini_set() не используется, поэтому 
в файле php.ini, который лежит на сервере, переменная <b>session.use_cookies</b>
должна равняться нулю, а <b>session.use_trans_sid</b> должна быть равна единице.
</ol>

<h2>
7. <a name="cfgfile" href="#ccfgfile">
Конфигурационный файл
</a>
</h2>

<p>В каталоге <b>data/configure</b> 
располагается файл <b>specfg.php</b>. 
Ниже приведено описание переменных конфигурации, 
находящихся в нём.</p>

<p>
<b>$cfg["host"]</b> 
- адрес MySQL сервера. Иногда в качестве адреса 
указывается значение <CODE>localhost</CODE>. 
Значением этой переменной также может 
являться IP адрес.</p>

<p>
<b>$cfg["user"]</b> 
- имя пользователя базы данных (БД).</p>

<p>
<b>$cfg["password"]</b> 
- пароль для доступа к БД.</p>

<p>
<b>$cfg["database"]</b> 
- имя БД.</p>

<p>Адрес сервера, имя пользователя, пароль, 
а также имя БД, должны быть предоставлены 
администраторами сервера, на который 
устанавливается программа.</p>

<p>
<b>$cfg["prefix"]</b> 
- префикс для таблиц, генерируемых на лету.</p>

<p>
<b>$cfg["deflangadmin"]</b> 
- стандартный язык интерфейса административной 
части программы. В настоящее время, доступны два языка:
русский <CODE>russian</CODE> и английский <CODE>english</CODE>.</p>

<p>
<b>$cfg["deflangvisitor"]</b> 
- стандартный язык интерфейса части программы, 
доступной для всеобщего просмотра.</p>

<p>
<b>$cfg["skin"]</b> 
- переменная графического оформления 
программы. На данный момент, доступен 
только один вид оформления <CODE>default</CODE>.</p>

<p>
<b>$cfg["std"]</b> 
- типы разделов, содержащих свежие 
публикации. Записи из таких разделов пользователь 
видит на главной странице сайта на основе программы. 
Допустимые значения переменной: <CODE>news</CODE>, 
<CODE>articles</CODE>, <CODE>all</CODE>.</p>

<p>
<b>$cfg["partlimit"]</b> 
- количество записей, находящихся в разделе 
статей или новостей, отображаемых на одной странице. 
Таким образом, содержание раздела может 
занимать несколько страниц.</p>

<p>
<b>$cfg["mainlimit"]</b> 
- количество свежих публикаций, отображаемых на одной
странице.</p>

<p>
<b>$cfg["mboardlim"]</b> 
- количество записей на доске объявлений, 
отображаемых на одной странице.</p>

<p>
<b>$cfg["manlatest"]</b> 
- количество записей на одной странице администрирования свежих
публикаций.</p>

<p>
<b>$cfg["manarc"]</b> 
- количество записей на одной странице 
администрирования архивов.</p>

<p>
<b>$cfg["xtitle"]</b> 
- содержание тэга TITLE главной страницы.</p>

<p>
<b>$cfg["xname"]</b> 
- строка, отображаемая в верхней части страниц 
сайта на основе программы.</p>


<h2>
8. <a href="#cdb" name="db">
База данных и взаимодействие с ней в Sound PHP Engine
</a>
</h2>

<p>В данном разделе мы постараемся пояснить логику, по которой
Sound PHP Engine работает с базой данных (БД), а также подробно описать
структуру этой БД. Для обозначенных целей построим диаграмму "сущность-связь"</p>

<p>Прежде чем начать, напомним, что существует несколько
широко распространённых подходов для создания моделей "сущность-связь".</p>

<dl>
	<dt><b>Нотация Питера Чена</b></dt>
	<dd>http://www.essentialstrategies.com/publications/modeling/chen.htm</dd>
	
	<dt><b>Нотация Мартина и Финкельштейна</b></dt>
	<dd>http://www.essentialstrategies.com/publications/modeling/infoeng.htm</dd>

	<dt><b>Нотация Баркера</b></dt>
	<dd>http://www.essentialstrategies.com/publications/modeling/barker.htm</dd>

	<dt><b>Язык моделирования IDEF1X </b></dt>
	<dd>Топорец А. Ю. Основы методологии IDEF1 и IDEF1X. URL: http://stoporets.narod.ru/doc/35.pdf 
	(дата обращения: 22.10.2011).</dd>
	<dd></dd>

</dl>

<p>Представленная ниже диаграмма сущность-связь является черновиком и впоследствии
будет дорабатываться и уточняться.</p>

<p><img width="100%" src="db-er-fs8.png"></p>

<p>Взаимодействие с БД в Sound PHP Engine cтроится на основе 
вызова функции, которая носит имя mysql_connect.
После каждого логически завершённого запроса
к БД соединение с ней разрывается. Использование
постоянного соединения с БД через функцию mysql_pconnect
умышленно не используется по причине того, что постоянное
соединение часто склонно накапливать ошибки в окружении.</p>

<p>Включение в модель БД отношений сущностей 1:1 вызвано
потребностью более ясного представления информации и упрощением
реализации программного взаимодействия между СУБД и PHP
программой. Данные, которые, в теории,
могли бы быть включены в одну единственную сущность,
для удобства программирования вынесены в отдельные сущности.</p>

<p>База данных, используемая программой является частично
денормализованной. Такое решение обусловлено
практической необходимостью упростить код программы
для взаимодействия с БД. В частности, некоторые таблицы БД,
имеют повторяющиеся атрибуты: предпочтение отдаётся копированию
удобного для восприятия человека символьного
значения атрибута из таблицы в таблицу нежели
чем созданию системы внешних ключей по
числовым атрибутам. Избыточное использование
числовых атрибутов осложнило бы процесс отладки программы.
Иными словами, для нас доступность исходного кода Sound PHP Engine 
для понимания важнее скорости его работы.</p>

<h3>Постраничный вывод публикаций</h3>
<p>В Sound PHP Engine используются временные таблицы для промежуточного хранения
результатов запросов. В частности, создаётся промежуточная
таблица se_tmpoutput, где атрибут pointer содержит
запрос к таблице раздела статей или новостей. Далее в
se_output (см. include/page.php) заносятся все
записи из таблицы раздела. Таким образом, есть возможность
организовать постраничный вывод информации раздела статей/новостей.
Таблица se_output очищается перед использованием.</p>

<p>Раздел ``База данных и взаимодействие с ней в Sound PHP Engine '' 
будет расширен в последующих версиях руководства пользователя и разработчика.</p>

<h2>
9. <a name="error" href="#cerror">Коды ошибок</a>
</h2>

<p>В случае, если по тем или иным причинам не удаётся произвести
соединение с базой данных или выполнить запрос к ней, генерируется
сообщение, содержащее код ошибки.</p>

<p>Расшифровка кодов ошибок приведена ниже:</p>

<P><b>#101</b> - MySQL не может выделить ни одной строки из БД;</P>
<P><b>#102</b> - невозможно выполнить запрос (скорее всего ошибка в программном коде);</P>
<P><b>#103</b> - Connection to MySQL server faield;</P>
<P><b>#104</b> - Connection to database failed;</P>

<p>В целях упрощения процесса отладки программы, каждый PHP
файл содержит сквозную нумерацию запросов к базе данных.
Например, если при выполнении содержимого файла page.php 
возникла ошибка взаимодействия с БД и было выведено сообщение
<b>error #102-5</b>, значит произошёл сбой при пятом
по счёту запросе в рамках файла page.php. Подсчёт разных кодов
ошибок ведётся отдельно.</p>

<p>Файл include/functions.php содержит нумерацию кодов ошибок
следующего вида: <b>error #102-fномер-по-порядку</b>.</p>

<h2>
10. <a name="multilang" href="#cmultilang">Многоязыковая поддержка</a>
</h2>

<p>В этом разделе изложим основные приёмы работы с GNU gettext.</p>

<p>Каталог locale должен содержать подкаталоги, в которых размещены варианты 
перевода интерефейса Sound PHP Engine на разные языки. Таким образом,
по адресу <CODE>ru_RU/LC_MESSAGES/messages.po</CODE>, размещён
специально размеченный файл, получившийся при переводе интерфейса программы
на русский язык.</p>

<p>Файл <CODE>messages.po</CODE> генерируется с помощью программы
<CODE>xgettext</CODE>: ей на вход подаётся содержимое файлов 
(в нашем случае, файлов *.php), включающих специальным образом 
отформатированный текст, который необходимо перевести.</p>

<p>Ниже представлен список файлов Sound PHP Engine, текст интерфейса
которых нуждается в переводе:</p>

<pre>
include/functions.php                                                                                   
include/page.php                                                                                        
include/pageone.php                                                                                     
include/pagethree.php                                                                                   
                                                                                                                
data/eduser.php                                                                                         
data/msaver.php                                                                                         
data/edcol.php                                                                                          
data/parc.php                                                                                           
data/bams.php                                                                                           
data/auth.php                                                                                           
data/public.php                                                                                         
data/admininfo.php                                                                                      
data/security.php                                                                                       
data/pnewest.php                                                                                        
data/edproc.php                                                                                         
data/user.php                                                                                           
data/arc.php                                                                                            
data/newest.php                                                                                         
data/admin.php                                                                                                  
data/logout.php                                                                                         
data/index.php                                                                                          
data/update.php                                                                                         
data/addnews.php                                                                                        
data/muser.php                                                                                          
data/robot.php    

moutput.php                                                                                             
print.php                                                                                               
search.php                                                                                              
searchtips.php                                                                                          
starter.php                                                                                             
view.php                                                                                                
comment.php                                                                                             
comsaver.php                                                                                            
index.php                                                                                               
map.php                                                                                                 
</pre>

<p>Формат файлов <CODE>po</CODE> прост и легко поддаётся ручной
правке. После того как файл <CODE>messages.po</CODE> отредактирован
нужным образом, командой <CODE>msgfmt</CODE> создаётся
почти не содержащий служебной информации файл в формате <CODE>mo</CODE>:
<CODE>msgfmt messages.po -o messages.mo</CODE>, который
используется в случае настройки конфигурационного файла
на применение соответствующего языка интерфейса.</p>

<p>Некоторые тонкости организации многоязыковой поддержки прокомментированы в
статье ``Хитрости при работе с GNU gettext'', размещённой по адресу
<a href="http://rus-linux.net/nlib.php?name=/MyLDP/algol/gnu-gettext-tricks.html">
http://rus-linux.net/nlib.php?name=/MyLDP/algol/gnu-gettext-tricks.html</a>.</p>

<h2>
11. <a name="funcdesc" href="#cfuncdesc">Описание подпрограмм</a>
</h2>

<p>Далее перечислены и описаны подпрограммы, входящие в состав
Sound PHP Engine и находящиеся в файле <tt>include/functions.php</tt>.</p>

<p><b><a name="auth" href="#cauth">auth($connector, $sid, $type, $prefix)</a></b></p>

<p><i>Назначение:</i> осуществляет проверку активности 
индентификатора сессии для заданного пользователя</p>

<p><i>Выполняемые действия</i>
<ol>
<li>В качестве аргументов получает:
	<ul>
	<li>идентификатор подключения к БД, где хранятся 
	данные программы ($connector);
	<li>идентификатор текущей сессии ($sid);
	<li>тип авторизуемого пользователя ($type);
	<li>префикс таблицы БД, где хранится информация 
	об активных сессиях ($prefix).
	</ul>

<li>Проверяет существует ли пользователь заданного типа
с заданным активным идентификатором сессии.

<li>В случае если идентификатор сессии активен для
данного пользователя, возвращает его учётное имя.

<li>Если пользователь заданного типа с заданным активным
идентификатором сессии не найден, возвращает значение false.
</ol>

<p><b><a name="cache" href="#ccache">cache()</a></b></p>

<p><i>Назначение:</i> запрещает кэширование страниц программы обозревателем
и прокси-серверами.</p>

<p><b><a name="comments" href="#ccomments">comments($id, $rid, $host, $user, $password, $database, $prefix)</a></b></p>

<p><i>Назначение:</i> выводит комментарии, оставленные пользователями к статья и новостям.</p>

<p><i>Выполняемые действия</i>
<ol>
<li>В качестве аргументов получает:
        <ul>
        <li>идентификатор раздела к которому относится новость либо статья ($id);
        <li>идентификатор записи в разделе, которому соответствует 
	конкретная статья либо новость ($rid);
        <li>адрес хоста, на котром работает СУБД ($host);
        <li>имя пользователя для доступа к СУБД ($user);
	<li>пароль для доступа к СУБД ($password);
	<li>имя БД программы ($database);
	<li>префикс таблицы БД, где хранятся комментарии 
	к новостям и статьям ($prefix).
        </ul>

<li>Подключается к таблице БД, где хранятся комментарии к новостям и статьям.

<li>Подсчитывает количество комментариев к конкретной статье либо новости.

<li>Отключается от БД.

<li>Возвращает число комментариев.
</ol>

<p><b><a name="connect" href="#cconnect">connect($host, $user, $password, $database, &$connector)</a></b></p>

<p><i>Назначение:</i> подключается к БД.</p>

<p><i>Выполняемые действия</i>
<ol>
<li>В качестве аргументов получает:
        <ul>
        <li>адрес хоста, на котром работает СУБД ($host);
        <li>имя пользователя для доступа к СУБД ($user);
	<li>пароль для доступа к СУБД ($password);
        <li>имя БД программы ($database);
	<li>переменную куда будет записан идентификатор подключения к БД ($connector).
        </ul>

<li>Подключается к БД.
<li>Возвращает идентификатор подключения к БД. 
</ol>

<p><b><a name="langch" href="#clangch">langch($lng)</a></b></p>

<p><i>Назначение:</i> расшифровывает код языка интерфейса 
и присваивает расшифрованное значение промежуточной переменной.</p>

<p><i>Выполняемые действия</i>
<ol>
<li>В качестве аргументов получает:
        <ul>
        <li> код языка интерфейса, например, ``ru'' ($lng).
        </ul>

<li>Расшифровывает код языка и присваивает его переменной $language.
<li>Возвращает значение переменной $language.
</ol>

<p><b><a name="language" href="#clanguage">language($language)</a></b></p>

<p><i>Назначение:</i> подключает файлы интернационализации
языка интерфейса.</p>

<p><i>Выполняемые действия</i>
<ol>
<li>В качестве аргументов получает:
        <ul>
        <li>название языка интерфейса, например, ``russian'' ($language).
        </ul>
<li>Временно присваивает переменной окружения LC_ALL значение, 
соответствующее выбранному языку.
<li>Подключает локаль, соответствующую выбранному языку.
<li>Подключает хранилище текстовых строк интерфейса на выбранном языке.
</ol>

<p><b><a name="line" href="#cline">line()</a></b></p>

<p><i>Назначение:</i> рисует линию.</p>

<p><i>Выполняемые действия</i>
<ol>
<li>В качестве аргументов получает:
        <ul>
        <li><i>нет аргументов</i>.
        </ul>

<li>Выводит на экран линию, используя стандартную функцию
``echo'' и HTML тэг ``hr''.
</ol>


<p><b><a name="pubform" href="#cpubform">
publicform($type, $tabheader, $partname, $theme, $intro, $full, $date, $num, $time, $update)
</a></b></p>

<p><i>Назначение:</i> выводит текст новости или статьи 
в HTML форму для последующего редактирования.</p>

<p><i>Выполняемые действия</i>
<ol>
<li>В качестве аргументов получает:
        <ul>
        <li>идентификатор типа раздела ($type); 
        <li>переменную, содержащую подпись, соответствующую типу раздела ($tabheader); 
        <li>название раздела статей или новостей ($partname);
	<li>тему выбранной публикации ($theme);
	<li>аннотацию к выбранной публикации ($intro);
	<li>полный текст выбранной публикации ($full);
	<li>дату сохранения оригинальной публикации ($date);
	<li>порядковый номер публикации в БД ($num);
	<li>время сохранения оригинальной публикации ($timer);
	<li>указатель на возможность обновления выбранной публикации ($update).
        </ul>

<li>На основании полученной через аргументы информации,
создаёт HTML форму для редактирования публикации.
</ol>

<p><b><a name="pwdlength" href="#cpwdlength">pwdlength($newpwd)</a></b></p>

<p><i>Назначение:</i> проверяет длину нового пароля.</p>

<p><i>Выполняемые действия</i>
<ol>
<li>В качестве аргументов получает:
        <ul>
        <li>новый пароль пользователя ($newpwd).
        </ul>

<li>В случае, если пароль короче восьми символов, возвращает 0.
<li>Иначе возвращает единицу.
</ol>

<p><b><a name="redirect" href="#credirect">redirect($value)</a></b></p>

<p><i>Назначение:</i> осуществляет перенаправление неавторизованных
посетителей страниц администрирования программы на страницу авторизации.</p>

<p><i>Выполняемые действия</i>
<ol>
<li>В качестве аргументов получает:
        <ul>
        <li> значение ($value).
        </ul>

<li>В случае если значение $value равно false,
происходит переадресация на страницу авторизации,
либо, если HTTP заголовки по какой-то причине уже
отправлены, выводится сообщение об ошибке.
</ol>

<p><b><a name="search-pager" href="#csearch-pager">search_pager($pageline, $page, $addrline, $pageq)</a></b></p>

<p><i>Назначение:</i> осуществляет постраничный вывод результатов поиска.</p>

<p><i>Выполняемые действия</i>
<ol>
<li>В качестве аргументов получает:
        <ul>
        <li>строку, отображающую количество страниц, на 
	которые для вывода были разбиты результаты поиска ($pageline); 
        <li>номер текущей страницы для вывода результатов поиска ($page);
        <li>строка запроса к БД с метасимволами URL, преобразованными в escape-последовательности,
        а также информация необходимая для выполнения запроса ($addrline);
	<li>количество страниц, необходимое для вывода результатов поиска ($pageq).
        </ul>

<li>в зависимости от значений аргументов, выводит ссылку на
следующую и предыдущую страницы вывода результатов поиска.
</ol>

<p><b><a name="search-parser" href="#csearch-parser">search_parser($array, $type)</a></b></p>

<p><i>Назначение:</i> формирует запрос к БД программы в зависимости от указания на
необходимую точность поиска.</p>

<p><i>Выполняемые действия</i>
<ol>
<li>В качестве аргументов получает:
        <ul>
        <li>текст запроса к БД, сохранённый в массив ($array);
        <li>указание на то, нужно ли выполнять запрос для совпадения с каждым из слов
        искомой строки либо со всей искомой строкой либо с любым
        из слов искомой строки ($type).
        </ul>

<li>В зависимости от значения аргумента $type формирует запрос к БД программы.
<li>Возвращает уточнённый запрос.
</ol>

<p><b><a name="open" href="#copen">open()</a></b></p>

<p><i>Назначение:</i> подключается к БД и возвращает идентификатор
подключения.</p>

<p><i>Выполняемые действия</i>
<ol>
<li>В качестве аргументов получает:
        <ul>
        <li><i>нет аргументов</i>.
        </ul>

<li>Подключается к файлу настроек <tt>data/configure/specfg.php</tt>.
<li>Подключается к БД, используя информацию из файла настроек.
<li>Возвращает идентификатор подключения к БД.
</ol>


<p><b><a name="pattern" href="#cpattern">Шаблон для описания новых подпрограмм</a></b></p>

Функции добавляемые в программу рекомедуется документировать по следующему шаблону:

<fieldset>
<p><b><a name="" href="#c">ИМЯ_ФУНКЦИИ(аргумент1, аргумент2, аргумент3)</a></b></p>

<p><i>Назначение:</i> ...</p>

<p><i>Выполняемые действия</i>
<ol>
<li>В качестве аргументов получает:
        <ul>
        <li> ... (аргумент1);
        <li> ... (аргумент2);
        <li> ... (аргумент3).
        </ul>

<li> ...
<li> ...
<li> ...
<li> ...
</ol>
</fieldset>

<h2>
12. <a name="interface" href="#cinterface">
Описание интерфейса пользователя Sound PHP Engine
</a>
</h2>

<dl>
<dd><b><a name="adminpanel" href="#cadminpanel">
Панель администратора
</a></b></dd>
</dl>

<p>Итак, вы указали учётное имя, пароль и получили 
доступ к странице администратора (admin.php).
Перед вами таблица разделённая на девять сегментов. 
Администратор имеет право создавать и удалять
разделы, пользователей, привязки пользователей 
к разделам, архивировать и удалять архивы статей и
новостей. Все эти действия можно выполнять через 
формы и ссылки, находящиеся в сегментах страницы
администратора. Ниже приведено описание каждого 
из сегментов admin.php.</p>

<h4>
<a href="#csegpart" name="segpart">
Сегмент "Разделы"
</a>
</h4>

<p>В этом сегменте находится список существующих 
разделов статей и новостей. Разделы новостей указываются
под заголовком "новости", разделы статей под заголовком 
"статьи". Если разделов не существует, список
будет пуст.</p>

<h4>
<a href="#csegcrpart" name="segcrpart">
Сегмент "Создание и удаление разделов"
</a>
</h4>

<p>В этом сегменте находится форма для создания 
и удаления разделов статей и новостей.
При создании раздела, укажите его имя 
в поле "раздел", выберите тип раздела (новости
или статьи) и нажмите на кнопку "Создать".</p>

<p>При удалении раздела, занесите его имя 
в поле "раздел", выберите его тип и нажмите 
на кнопку "Удалить". Помните, что при удалении 
раздела все хранящиеся в нём данные будут 
уничтожены.</p>

<p>Не существует ограничений на совпадение 
имён разделов разных типов. Таким образом, могут 
существовать разделы статей и новостей с 
одним и тем же именем.</p>

<h4>
<a href="#csegbind" name="segbind">
Сегмент "Привязка корреспондентов"
</a>
</h4>

<p>Данный сегмент содержит две формы. Одна для 
просмотра существующих привязок, другая для их создания
и удаления. В данном контексте слово "привязка" 
обозначает факт закрепления пользователя за разделом.
Закреплённый за разделом пользователь может 
редактировать его (раздела) содержание (добавлять, 
обновлять или удалять новости либо статьи).</p>

<p>Вы можете закреплять любого (даже ещё не созданного) 
пользователя только за существующим разделом.
Таким образом, обязательным является существование раздела, 
а пользователя с нужным именем можно создать позже, 
использовав при этом сегмент "Добавление и удаление 
пользователей".</p>

<p>Администратор и редактор могут узнать 
регистрационные данные корреспондента (учётное имя и адрес
электронной почты).</p>

<p><b>Пример.</b> 
Если вы хотите закрепить раздел статей "12345" 
за пользоватлем "54321", нужно будет внести название
раздела и имя пользователя в одноимённые поля формы, 
проставить галочки напротив "привязать" и "раздел 
статей", а потом нажать на кнопку с надписью "Применить".</p>

<h4>
<a href="#csegarc" name="segarc">
Сегмент "Архивация"
</a>
</h4>

<p>Sound PHP Engine предоставляет возможность 
архивировать новости и статьи. Если какая-либо запись из раздела
любого типа потеряла актуальность/устарела, возможно, 
имеет смысл внести её в архив. В результате, 
внесённая в архив запись перестанет отображаться 
в списке свежих публикаций на главной странице. 
Имя архива будет совпадать с именем раздела, 
в котором находится запись.</p>

<p>Осуществив переход по ссылке "архивировать статьи" 
или "архивировать новости", вы можете выбрать нужный
раздел и перенести нужные записи в архив статей/новостей.</p>

<p>Как уже упоминалось выше, внесение сообщения 
в архив влечёт за собой создание архива с названием
идентичным названию активного раздела, 
из которого была взята новость или статья. 
Удаляя архив с именем "123" вы удаляете 
все сообщения, которые были занесены туда 
из активного раздела "123". Удалить архив 
можно используя форму, находящуюся в описываемом сегменте.</p>

<h4>
<a href="#cseguaddrem" name="seguaddrem">
Сегмент "Добавление и удаление пользователей"
</a>
</h4>

<p>Для создания пользователей вы НЕ 
можете использовать учётное имя "admin", 
оно принадлежит администратору и только ему. 
Учётную запись администратора можно только обновлять. 
Для задания имени корреспондента/редактора 
и пароля лучше всего использовать алфавитно-цифровые сочетания, 
включающие только латинские буквы (от "a" до "z" и от "A" до "Z"). 
Разрешается использование пробелов.</p>

<p>Принцип работы с содержащейся в сегменте 
формой совпадает с описанными выше. 
Поле "e-mail" не является обязательным 
для заполнения. Для удаления пользователя 
нужно в соответствующих полях указать его учётное 
имя (логин) и пароль, отметить тип пользователя 
(корреспондент или редактор), а потом 
нажать на кнопку "Удалить".</p>

<h4>
<a href="#csegupdateui" name="segupdateui">
Сегмент "Обновление данных пользователей"
</a>
</h4>

<p>Укажите текущие учетное имя и 
пароль пользователя (администратора, 
корреспондента или редактора), выберите его тип, 
укажите новые данные (поле "e-mail" не обязательно 
для заполенения) и нажмите на копку "Обновить". 
Данные администратора могут быть обновлены именно здесь.</p>

<h4>
<a href="#csegmisc" name="segmisc">
Сегмент "Дополнительно"
</a>
</h4>

<p>Срок действия сессии изначально ограничен 
1200 секундами. Если вы хотите завершить действие 
текущей сессии досрочно, воспользуйтесь находящейся 
в данном сегменте ссылкой с надписью "выход".</p>

<h4>
<a href="#cseguserview" name="seguserview">
Сегмент "Просмотр данных пользователей"
</a>
</h4>

<p>Если вы забыли адрес электронной почты какого-либо 
из пользователей, укажите его имя (логин) в соответствующем
поле и нажмите на кнопку "Просмотр", будет выведена 
регистрационная информация выбранного пользователя.</p>

<p>Sound PHP Engine использует три типа пользователей: 
администратор, редактор и корреспондент. Имя пользователя
и его тип (статус) указаны в таблице под формой для 
выяснения регистрационной информации.</p>

<h4>
<a href="#cseginfo" name="seginfo">
Сегмент "Информация"
</a>
</h4>

<p>В данном сегменте указана используемая версия 
Sound PHP Engine и информация о том, где можно скачать более
свежие версии программы.</p>

<h4><a href="#csegaddinfo" name="segaddinfo">
Общие рекомендации и замечания
</a></h4>

<ul>
<li>Не используйте метасимволы и специальные 
символы в именах разделов и пользователей.</li>
</ul>

<dl>
<dd><b><a href="#csimple-edit" name="simple-edit">
Панель для редактирования содержимого разделов
</a></b></dd>
</dl>

<p>Подразумевается, что на данном этапе вы уже создали 
один или несколько разделов, одного или нескольких 
корреспондентов, а также закрепили разделы за корресподентами.</p>

<p>Пройдите авторизацию указав регистрационные 
данные корреспондента. Будет получен доступ к
web-интерфейсу публикации статей и новостей. 
В выпадающем меню выберите желаемый раздел новостей 
или же перейдите по ссылке "добавление статей" 
и выберите раздел статей. Нажмите на кнопку "Просмотр".</p>

<p>По нажатию кнопки "Просмотр" будет отображена 
форма, в которую можно вносить информацию.</p>

<p>В поле формы "Вcтупление" должно указываться то, 
что пользователь увидит когда будет просматривать
краткие описания статей/новостей. "Полный текст" 
- полный вариант текста новости/статьи.</p>

<p>После того, как вы заполнили форму нужной информацией, 
нажмите на кнопку "Сохранить" (при добавлении
нескольких сообщений подряд можно не обновлять страницу, 
а изменять поля формы и нажимать на кнопку
"Сохранить"). Для того, чтобы проверить сохранились ли 
данные, нажмите на кнопку "Просмотр" - будет выведен
список статей/новостей раздела (в колонке 
"Новости/Статьи. Имя_раздела").</p>

<p>Обновление данных может проводиться 
несколькими способами. В форме, которой принадлежит 
кнопка "Просмотр" можно указать настройки поиска записи 
(поля "тема" и "дата") и нажав на кнопку "Пуск" получить доступ
к желаемой записи. Если же вы не хотите проводить 
поиск подобным образом, можно выбрать желаемую запись 
из списка колонки "Новости/Статьи. Имя_раздела" и перейти 
по ссылке "Обновить" рядом с нужной записью. 
Проведя необходимые изменения записи, нажмите на 
кнопку "Обновить", изменения вступят в силу.</p>

<p>Если возникнет необходимость в удалении 
каких-либо записей, отметьте их галочками 
(в колонке "Новости/Статьи. Имя_раздела") 
и нажмите на кнопку "Удалить отмеченное".</p>

<h2>
<a name="fdl" HREF="#cfdl">
GNU Free Documentation License
</a>
</h2>

<P>
Version 1.2, November 2002
<P>
<PRE>
Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
</PRE>
<P>
<STRONG>0. PREAMBLE</STRONG>

<P>
The purpose of this License is to make a manual, textbook, or other
functional and useful document "free" in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way
to get credit for their work, while not being considered responsible
for modifications made by others.
<P>
This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense.  It
complements the GNU General Public License, which is a copyleft
license designed for free software.
<P>
We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does.  But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book.  We recommend this License
principally for works whose purpose is instruction or reference.
<P>

<STRONG>1. APPLICABILITY AND DEFINITIONS</STRONG>
<P>
This License applies to any manual or other work, in any medium, that
contains a notice placed by the copyright holder saying it can be
distributed under the terms of this License.  Such a notice grants a
world-wide, royalty-free license, unlimited in duration, to use that
work under the conditions stated herein.  The "Document", below,
refers to any such manual or work.  Any member of the public is a
licensee, and is addressed as "you".  You accept the license if you
copy, modify or distribute the work in a way requiring permission
under copyright law.
<P>
A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
<P>
A "Secondary Section" is a named appendix or a front-matter section of
the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall subject
(or to related matters) and contains nothing that could fall directly
within that overall subject.  (Thus, if the Document is in part a
textbook of mathematics, a Secondary Section may not explain any
mathematics.)  The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.
<P>

The "Invariant Sections" are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License.  If a
section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant.  The Document may contain zero
Invariant Sections.  If the Document does not identify any Invariant
Sections then there are none.
<P>
The "Cover Texts" are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License.  A Front-Cover Text may
be at most 5 words, and a Back-Cover Text may be at most 25 words.
<P>
A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters.  A copy made in an otherwise Transparent file
format whose markup, or absence of markup, has been arranged to thwart
or discourage subsequent modification by readers is not Transparent.
An image format is not Transparent if used for any substantial amount
of text.  A copy that is not "Transparent" is called "Opaque".
<P>
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format, SGML
or XML using a publicly available DTD, and standard-conforming simple
HTML, PostScript or PDF designed for human modification.  Examples of
transparent image formats include PNG, XCF and JPG.  Opaque formats
include proprietary formats that can be read and edited only by
proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the
machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.
<P>
The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page.  For works in
formats which do not have any title page as such, "Title Page" means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
<p>
A section "Entitled XYZ" means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language.  (Here XYZ stands for a
specific section name mentioned below, such as "Acknowledgements",
"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
of such a section when you modify the Document means that it remains a
section "Entitled XYZ" according to this definition.
<p>
The Document may include Warranty Disclaimers next to the notice which
states that this License applies to the Document.  These Warranty
Disclaimers are considered to be included by reference in this
License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License.
<P>
<STRONG>2. VERBATIM COPYING</STRONG>
<P>

You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other
conditions whatsoever to those of this License.  You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute.  However, you may accept
compensation in exchange for copies.  If you distribute a large enough
number of copies you must also follow the conditions in section 3.
<P>
You may also lend copies, under the same conditions stated above, and
you may publicly display copies.
<P>

<STRONG>3. COPYING IN QUANTITY</STRONG>
<P>
If you publish printed copies (or copies in media that commonly have
printed covers) of the Document, numbering more than 100, and the
Document's license notice requires Cover Texts, you must enclose the
copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover.  Both covers must also clearly and legibly identify
you as the publisher of these copies.  The front cover must present
the full title with all words of the title equally prominent and
visible.  You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.
<P>
If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.
<P>
If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a computer-network location from which the general network-using
public has access to download using public-standard network protocols
a complete Transparent copy of the Document, free of added material.
If you use the latter option, you must take reasonably prudent steps,
when you begin distribution of Opaque copies in quantity, to ensure
that this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that
edition to the public.
<P>
It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
them a chance to provide you with an updated version of the Document.
<P>

<STRONG>4. MODIFICATIONS</STRONG>
<P>
You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it.  In addition, you must do these things in the Modified Version:
<P>
<UL>
<LI><STRONG>A.</STRONG> Use in the Title Page (and on the covers, if any) a title distinct
   from that of the Document, and from those of previous versions
   (which should, if there were any, be listed in the History section
   of the Document).  You may use the same title as a previous version
   if the original publisher of that version gives permission.
<LI><STRONG>B.</STRONG> List on the Title Page, as authors, one or more persons or entities
   responsible for authorship of the modifications in the Modified
   Version, together with at least five of the principal authors of the
   Document (all of its principal authors, if it has fewer than five),
   unless they release you from this requirement.
<LI><STRONG>C.</STRONG> State on the Title page the name of the publisher of the
   Modified Version, as the publisher.
<LI><STRONG>D.</STRONG> Preserve all the copyright notices of the Document.

<LI><STRONG>E.</STRONG> Add an appropriate copyright notice for your modifications
   adjacent to the other copyright notices.
<LI><STRONG>F.</STRONG> Include, immediately after the copyright notices, a license notice
   giving the public permission to use the Modified Version under the
   terms of this License, in the form shown in the Addendum below.
<LI><STRONG>G.</STRONG> Preserve in that license notice the full lists of Invariant Sections
   and required Cover Texts given in the Document's license notice.
<LI><STRONG>H.</STRONG> Include an unaltered copy of this License.
<LI><STRONG>I.</STRONG> Preserve the section Entitled "History", Preserve its Title, and add
   to it an item stating at least the title, year, new authors, and
   publisher of the Modified Version as given on the Title Page.  If
   there is no section Entitled "History" in the Document, create one
   stating the title, year, authors, and publisher of the Document as
   given on its Title Page, then add an item describing the Modified
   Version as stated in the previous sentence.
<LI><STRONG>J.</STRONG> Preserve the network location, if any, given in the Document for
   public access to a Transparent copy of the Document, and likewise
   the network locations given in the Document for previous versions
   it was based on.  These may be placed in the "History" section.
   You may omit a network location for a work that was published at
   least four years before the Document itself, or if the original
   publisher of the version it refers to gives permission.

<LI><STRONG>K.</STRONG> For any section Entitled "Acknowledgements" or "Dedications",
   Preserve the Title of the section, and preserve in the section all
   the substance and tone of each of the contributor acknowledgements
   and/or dedications given therein.
<LI><STRONG>L.</STRONG> Preserve all the Invariant Sections of the Document,
   unaltered in their text and in their titles.  Section numbers
   or the equivalent are not considered part of the section titles.
<LI><STRONG>M.</STRONG> Delete any section Entitled "Endorsements".  Such a section
   may not be included in the Modified Version.
<LI><STRONG>N.</STRONG> Do not retitle any existing section to be Entitled "Endorsements"
   or to conflict in title with any Invariant Section.
<LI><STRONG>O.</STRONG> Preserve any Warranty Disclaimers.
</UL>
<P>

If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant.  To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.
<P>
You may add a section Entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.
<P>
You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version.  Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity.  If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.
<P>
The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.
<P>

<STRONG>5. COMBINING DOCUMENTS</STRONG>
<P>
You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice, and that you preserve all their Warranty Disclaimers.
<P>
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy.  If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.
<P>
In the combination, you must combine any sections Entitled "History"
in the various original documents, forming one section Entitled
"History"; likewise combine any sections Entitled "Acknowledgements",
and any sections Entitled "Dedications".  You must delete all sections
Entitled "Endorsements."

<P>

<STRONG>6. COLLECTIONS OF DOCUMENTS</STRONG>
<P>
You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.
<P>
You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all
other respects regarding verbatim copying of that document.
<P>


<STRONG>7. AGGREGATION WITH INDEPENDENT WORKS</STRONG>
<P>
A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, is called an "aggregate" if the copyright
resulting from the compilation is not used to limit the legal rights
of the compilation's users beyond what the individual works permit.
When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves
derivative works of the Document.
<P>
If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half of
the entire aggregate, the Document's Cover Texts may be placed on
covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form.
Otherwise they must appear on printed covers that bracket the whole
aggregate.

<P>

<STRONG>8. TRANSLATION</STRONG>
<P>
Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections.  You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include
the original English version of this License and the original versions
of those notices and disclaimers.  In case of a disagreement between
the translation and the original version of this License or a notice
or disclaimer, the original version will prevail.
<p>
If a section in the Document is Entitled "Acknowledgements",
"Dedications", or "History", the requirement (section 4) to Preserve
its Title (section 1) will typically require changing the actual
title.
<P>

<STRONG>9. TERMINATION</STRONG>
<P>
You may not copy, modify, sublicense, or distribute the Document except
as expressly provided for under this License.  Any other attempt to
copy, modify, sublicense or distribute the Document is void, and will
automatically terminate your rights under this License.  However,
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such
parties remain in full compliance.
<P>

<STRONG>10. FUTURE REVISIONS OF THIS LICENSE</STRONG>

<P>
The Free Software Foundation may publish new, revised versions
of the GNU Free Documentation License from time to time.  Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.  See
http://www.gnu.org/copyleft/.
<P>
Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License "or any later version" applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation.  If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation.
<P>

<H2>How to use this License for your documents</H2>
<P>
To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:
<P>
<PRE>
      Copyright (c)  YEAR  YOUR NAME.
      Permission is granted to copy, distribute and/or modify this document
      under the terms of the GNU Free Documentation License, Version 1.2
      or any later version published by the Free Software Foundation;
      with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
	 Texts.  A copy of the license is included in the section entitled "GNU
      Free Documentation License".
</PRE>
<P>
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the "with...Texts." line with this:

<p>
<pre>
    with the Invariant Sections being LIST THEIR TITLES, with the
    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
</pre>
<p>
If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.
<p>
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License,
to permit their use in free software.

</BODY>
</HTML>
Return current item: Sound PHP Engine