Выпущена система управления сайтом HostCMS v. 3.2.3
Реестр основных изменений:
- Значительно переработаны все модули системы
- Добавлена дата окончания публикации для информационного элемента
- Добавлена возможность включения для форм проверки кода (CAPTCHA — тест Тьюринга для различения компьютеров и людей)
- Добавлена возможность включения для форумов проверки кода (CAPTCHA — тест Тьюринга для различения компьютеров и людей)
- Добавлен модуль «IP адреса», позволяющий запрещать доступ к сайту с определенных IP адресов, а также отключающий учитывание в статистике доступа с указанных IP
- Добавлена принудительная загрузка критически важных модулей при отсутствии их в списке подключаемых модулей
- Доработано кэширование, значительно сокращено число запросов к БД
- Доработана индексация форумов
- Добавлена функция «Удалить» для файлов в файловый менеджер визуального редактора
- Добавлена поддержка PHP 5
- Исправлено определение новых посетителей в модуле «Статистика посещаемости сайта»
Порядок обновления:
- Создать резервную копию БД
- Выполнить SQL код из файла /Update.sql
- Обновить файл /index.php в корневой директории
- Обновить файл /download_file.php в корневой директории
- Обновить файл /main_classes.php в корневой директории
- Загрузить файл /captcha.php в корневой директории из релиза
- Скопировать директорию /hostcmsfiles/captcha/ из релиза для коммерческих редакций системы
- Удалить директории /admin/ и /modules/
- Загрузить директории /admin/ и /modules/ из релиза 3.2.3
Получить бесплатную версию системы управления сайтом HostCMS.Free v. 3.2.3 Вы можете здесь.
При возникновении вопросов обращайтесь в службу поддержки по эл.почте.
Для использования CAPTCHA в формах необходимо доработать XSL шаблоны форм:
<?xml version= «1.0» encoding= «windows-1251»?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version= «1.0» xmlns:xsl= «http://www.w3.org/1999/XSL/Transform»>
<xsl:output indent= «yes» encoding= «windows-1251»/>
<xsl:template match= «/»>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match= «/document»>
<SCRIPT language= «JavaScript»>
function testData ()
{
<xsl:apply-templates select= «fields/field[ (type=0 or type=1 or type=5) and obligatory=1]»/>
}
</SCRIPT>
<h1><xsl:value-of disable-output-escaping= «yes» select= «forms_name»/></h1>
<!-- Выводим ошибку (error), если она была передана через внешний параметр →
<xsl:if test= «error! = ''»>
<p><xsl:value-of disable-output-escaping= «yes» select= «error»/></p>
</xsl:if>
<!-- Параметр action формы должен быть «./», если обработчик на этой же странице, либо «./form/», если обработчик на другой странице, например. /form/ →
<form name= «form{forms_id}» action= «./» method= «post» ENCTYPE= «multipart/form-data»>
<!-- Максимальный размер загружаемых данных — 2 Мб →
<INPUT TYPE= «hidden» NAME= «MAX_FILE_SIZE» VALUE= «2097152»/>
<table border= «0» cellpadding= «2» cellspacing= «0»>
<xsl:apply-templates select= «fields/field» mode= «show_form»>
<xsl:sort select= «order»/>
</xsl:apply-templates>
<xsl:if test= «forms_captcha_key! = 0»>
<tr>
<td colspan= «2» align= «center»>Для отправки формы введите число, изображённое на картинке</td>
</tr>
<tr>
<td>
<img style= «border: 1px solid #000000» src= «/captcha.php?get_captcha={forms_captcha_key}» title= «Введите число изображённое на картинке»/>
</td>
<td>
<input type= «hidden» name= «captcha_key» value= «{forms_captcha_key}»/>
<input type= «text» name= «captcha_keystring» style= «width:100%» />
</td>
</tr>
</xsl:if>
<tr>
<td colspan= «2» align= «center»>
<!-- Простая кнопка →
<xsl:if test= «forms_button_type=0»>
<input onclick= «return testData ()» type= «submit» name= «{forms_button_name}» value= «{forms_button_text_value}» />
</xsl:if>
<!-- Кнопка с картинкой →
<xsl:if test= «forms_button_type=1»>
<button onclick= «return testData ()» name= «{forms_button_name}» value= «{forms_button_value}» type= «submit»><xsl:value-of disable-output-escaping= «yes» select= «forms_button_text_value»/></button>
</xsl:if>
</td>
</tr>
</table>
</form>
</xsl:template>
<xsl:template match= «fields/field» mode= «show_form»>
<!-- Не скрытое поле →
<xsl:if test= «type!=7»>
<tr>
<td><xsl:value-of disable-output-escaping= «yes» select= «field_text_name»/>
<xsl:if test= «obligatory=1»>
<sup><font color= «red»>*</font></sup>
</xsl:if>  </td>
<td>
<!-- Текстовое поле ввода →
<xsl:if test= «type=0»>
<input type= «text» name= «{name}» value= «{value}» size= «{size}» onmouseout='this.className= «input»' onmouseover='this.className= «input_blur»;' />
</xsl:if>
<!-- Поле для ввода пароля →
<xsl:if test= «type=1»>
<input type= «password» name= «{name}» value= «{value}» size= «{size}»/>
</xsl:if>
<!-- Поле загрузки файла →
<xsl:if test= «type=2»>
<input type= «file» name= «{name}» size= «{size}» value= «{value}»/>
</xsl:if>
<!-- Радиокнопки →
<xsl:if test= «type=3»>
<xsl:apply-templates select= «list/list_item»/>
</xsl:if>
<!-- Checkbox →
<xsl:if test= «type=4»>
<xsl:if test= «checked=1»>
<input type= «checkbox» name= «{name}» checked= «„/>
</xsl:if>
<xsl:if test=„checked=0“>
<input type=„checkbox“ name=„{name}“/>
</xsl:if>
</xsl:if>
<!-- textarea →
<xsl:if test=„type=5“>
<textarea onmouseout='this.className=„input“' onmouseover='this.className=„input_blur“;' name=„{name}“ cols=„{cols}“ rows=„{rows}“ wrap= «off“><xsl:value-of disable-output-escaping= «yes» select= «value» /></textarea>
</xsl:if>
<!-- список →
<xsl:if test= «type=6»>
<select name= «{name}»>
<xsl:apply-templates select= «list/list_item»/>
</select>
</xsl:if>
</td>
</tr>
</xsl:if>
<!-- скрытое поле →
<xsl:if test= «type=7»>
<input type= «hidden» name= «{name}» value= «{value}»/>
</xsl:if>
</xsl:template>
<!-- Формируем радиогруппу или выпадающий список →
<xsl:template match= «list/list_item»>
<xsl:if test= «../../type=3»>
<xsl:if test= «list_item_value = (../../value)»>
<input id= «{../../name}_{list_item_id}» type= «radio» name= «{../../name}» value= «{list_item_value}» checked= «„/> 
<label for=„{../../name}_{list_item_id}“>
<xsl:value-of disable-output-escaping=„yes“ select=„list_item_value“/>
</label><br/>
</xsl:if>
<xsl:if test=„list_item_value! = (../../value)“>
<input id=„{../../name}_{list_item_id}“ type=„radio“ name=„{../../name}“ value=„{list_item_value}“/> 
<label for=„{../../name}_{list_item_id}“><xsl:value-of disable-output-escaping= «yes“ select= «list_item_value»/>
</label><br/>
</xsl:if>
</xsl:if>
<xsl:if test= «../../type=6»>
<xsl:if test= «list_item_value =. ./../value»>
<option value= «{list_item_value}» checked= «„><xsl:value-of disable-output-escaping=„yes“ select=„list_item_value“/></option>
</xsl:if>
<xsl:if test=„list_item_value! =. ./../value“>
<option value=„{list_item_value}“><xsl:value-of disable-output-escaping=„yes“ select=„list_item_value“/></option>
</xsl:if>
</xsl:if>
</xsl:template>
<!-- Формируем тело функции →
<xsl:template match=„fields/field[ (type=0 or type=1 or type=5) and obligatory=1]“>
if (document.form<xsl:value-of disable-output-escaping=„yes“ select=„../../forms_id“/>.elements['<xsl:value-of disable-output-escaping= «yes“ select= «name»/>'].value == «„) {
alert („ Заполните поле \“<xsl:value-of disable-output-escaping=„yes“ select=„field_text_name“/>\“!\t „)
document.form<xsl:value-of disable-output-escaping=„yes“ select=„../../forms_id“/>.elements['<xsl:value-of disable-output-escaping=„yes“ select=„name“/>'].focus ();
return false;
}
</xsl:template>
</xsl:stylesheet>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version= «1.0» xmlns:xsl= «http://www.w3.org/1999/XSL/Transform»>
<xsl:output indent= «yes» encoding= «windows-1251»/>
<xsl:template match= «/»>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match= «/document»>
<SCRIPT language= «JavaScript»>
function testData ()
{
<xsl:apply-templates select= «fields/field[ (type=0 or type=1 or type=5) and obligatory=1]»/>
}
</SCRIPT>
<h1><xsl:value-of disable-output-escaping= «yes» select= «forms_name»/></h1>
<!-- Выводим ошибку (error), если она была передана через внешний параметр →
<xsl:if test= «error! = ''»>
<p><xsl:value-of disable-output-escaping= «yes» select= «error»/></p>
</xsl:if>
<!-- Параметр action формы должен быть «./», если обработчик на этой же странице, либо «./form/», если обработчик на другой странице, например. /form/ →
<form name= «form{forms_id}» action= «./» method= «post» ENCTYPE= «multipart/form-data»>
<!-- Максимальный размер загружаемых данных — 2 Мб →
<INPUT TYPE= «hidden» NAME= «MAX_FILE_SIZE» VALUE= «2097152»/>
<table border= «0» cellpadding= «2» cellspacing= «0»>
<xsl:apply-templates select= «fields/field» mode= «show_form»>
<xsl:sort select= «order»/>
</xsl:apply-templates>
<xsl:if test= «forms_captcha_key! = 0»>
<tr>
<td colspan= «2» align= «center»>Для отправки формы введите число, изображённое на картинке</td>
</tr>
<tr>
<td>
<img style= «border: 1px solid #000000» src= «/captcha.php?get_captcha={forms_captcha_key}» title= «Введите число изображённое на картинке»/>
</td>
<td>
<input type= «hidden» name= «captcha_key» value= «{forms_captcha_key}»/>
<input type= «text» name= «captcha_keystring» style= «width:100%» />
</td>
</tr>
</xsl:if>
<tr>
<td colspan= «2» align= «center»>
<!-- Простая кнопка →
<xsl:if test= «forms_button_type=0»>
<input onclick= «return testData ()» type= «submit» name= «{forms_button_name}» value= «{forms_button_text_value}» />
</xsl:if>
<!-- Кнопка с картинкой →
<xsl:if test= «forms_button_type=1»>
<button onclick= «return testData ()» name= «{forms_button_name}» value= «{forms_button_value}» type= «submit»><xsl:value-of disable-output-escaping= «yes» select= «forms_button_text_value»/></button>
</xsl:if>
</td>
</tr>
</table>
</form>
</xsl:template>
<xsl:template match= «fields/field» mode= «show_form»>
<!-- Не скрытое поле →
<xsl:if test= «type!=7»>
<tr>
<td><xsl:value-of disable-output-escaping= «yes» select= «field_text_name»/>
<xsl:if test= «obligatory=1»>
<sup><font color= «red»>*</font></sup>
</xsl:if>  </td>
<td>
<!-- Текстовое поле ввода →
<xsl:if test= «type=0»>
<input type= «text» name= «{name}» value= «{value}» size= «{size}» onmouseout='this.className= «input»' onmouseover='this.className= «input_blur»;' />
</xsl:if>
<!-- Поле для ввода пароля →
<xsl:if test= «type=1»>
<input type= «password» name= «{name}» value= «{value}» size= «{size}»/>
</xsl:if>
<!-- Поле загрузки файла →
<xsl:if test= «type=2»>
<input type= «file» name= «{name}» size= «{size}» value= «{value}»/>
</xsl:if>
<!-- Радиокнопки →
<xsl:if test= «type=3»>
<xsl:apply-templates select= «list/list_item»/>
</xsl:if>
<!-- Checkbox →
<xsl:if test= «type=4»>
<xsl:if test= «checked=1»>
<input type= «checkbox» name= «{name}» checked= «„/>
</xsl:if>
<xsl:if test=„checked=0“>
<input type=„checkbox“ name=„{name}“/>
</xsl:if>
</xsl:if>
<!-- textarea →
<xsl:if test=„type=5“>
<textarea onmouseout='this.className=„input“' onmouseover='this.className=„input_blur“;' name=„{name}“ cols=„{cols}“ rows=„{rows}“ wrap= «off“><xsl:value-of disable-output-escaping= «yes» select= «value» /></textarea>
</xsl:if>
<!-- список →
<xsl:if test= «type=6»>
<select name= «{name}»>
<xsl:apply-templates select= «list/list_item»/>
</select>
</xsl:if>
</td>
</tr>
</xsl:if>
<!-- скрытое поле →
<xsl:if test= «type=7»>
<input type= «hidden» name= «{name}» value= «{value}»/>
</xsl:if>
</xsl:template>
<!-- Формируем радиогруппу или выпадающий список →
<xsl:template match= «list/list_item»>
<xsl:if test= «../../type=3»>
<xsl:if test= «list_item_value = (../../value)»>
<input id= «{../../name}_{list_item_id}» type= «radio» name= «{../../name}» value= «{list_item_value}» checked= «„/> 
<label for=„{../../name}_{list_item_id}“>
<xsl:value-of disable-output-escaping=„yes“ select=„list_item_value“/>
</label><br/>
</xsl:if>
<xsl:if test=„list_item_value! = (../../value)“>
<input id=„{../../name}_{list_item_id}“ type=„radio“ name=„{../../name}“ value=„{list_item_value}“/> 
<label for=„{../../name}_{list_item_id}“><xsl:value-of disable-output-escaping= «yes“ select= «list_item_value»/>
</label><br/>
</xsl:if>
</xsl:if>
<xsl:if test= «../../type=6»>
<xsl:if test= «list_item_value =. ./../value»>
<option value= «{list_item_value}» checked= «„><xsl:value-of disable-output-escaping=„yes“ select=„list_item_value“/></option>
</xsl:if>
<xsl:if test=„list_item_value! =. ./../value“>
<option value=„{list_item_value}“><xsl:value-of disable-output-escaping=„yes“ select=„list_item_value“/></option>
</xsl:if>
</xsl:if>
</xsl:template>
<!-- Формируем тело функции →
<xsl:template match=„fields/field[ (type=0 or type=1 or type=5) and obligatory=1]“>
if (document.form<xsl:value-of disable-output-escaping=„yes“ select=„../../forms_id“/>.elements['<xsl:value-of disable-output-escaping= «yes“ select= «name»/>'].value == «„) {
alert („ Заполните поле \“<xsl:value-of disable-output-escaping=„yes“ select=„field_text_name“/>\“!\t „)
document.form<xsl:value-of disable-output-escaping=„yes“ select=„../../forms_id“/>.elements['<xsl:value-of disable-output-escaping=„yes“ select=„name“/>'].focus ();
return false;
}
</xsl:template>
</xsl:stylesheet>
Пример динамической страницы для формы с обработкой CAPTCHA
<?
$forms = new Forms;
# Идентификатор формы
$forms_id=1;
if (isset ($_POST['Submit']))
{
$param['type']=0; # 0 — html, 1- plain
if (!empty ($_POST['email']))
{
$param['e-mail'] = $_POST['email'];
}
$external_propertys = array ();
# Производим обработку формы, результат записываем $result_form
$result_form = $forms->GetForm ($forms_id, 'ОбработкаОтправкиФормы','ПисьмоКураторуФормы',$param);
if ($result_form===0) # форма не обработана
{
$external_propertys['error']=„Вы неверно ввели число подтверждения отправки формы!“;
}
elseif ($result_form===false) # форма не обработана
{
$external_propertys['error']= «Прошло слишком мало времени с момента последней отправки Вами формы!“;
}
# Если была ошибка — выводим форму повторно с сообщением об ошибке
if (!empty ($external_propertys['error']))
{
$forms->ShowForm ($forms_id, 'ОтобразитьФорму',$external_propertys,$_POST);
}
}
else
{
$forms->ShowForm ($forms_id, 'ОтобразитьФорму');
}
? >
30.07.2006