Разработчикам   / шаблоны сайтов / создание сайтов / форум / партнерство
Авторизация Закрыть [x]  
     
   
Запомнить / Напомнить
SiteEdit

Найти:


Карта сайта

Сайт разработчиков SiteEdit

Cоздание модуля Online новостей

Категории:

Из этого урока Вы узнаете как создаются модули для SiteEdit на примере построения модуля онлайн новостей. Шаг за шагом данный урок проведет вас через все этапы разработки модуля.


Техническое задание

Необходимо разработать новостной модуль, который бы позволил управлять новостями on-line.

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

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

Необходимо предусмотреть автоматическую настройку модуля при установке.

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

Модуль должен работать в мультиязычном режиме.

Так же необходимо обеспечить возможность идентификации модераторов раздела через параметы в SiteEdit.

Вернуться назад

Создание нового модуля

Запустим редактор модулей и создадим файл нового модуля через меню "Модуль->Создать новый модуль" либо сочетанием CTRL+N.

В открывшемся окне определим свойства создаваемого модуля:
Group: Новости
Name: Он-лайн новости (добавление через сайт или SiteEdit Менеджер)
Description: Модуль онлайн-новостей позволяет добавлять новости непосредственно на сайте.
Class section: contOnNews
Поставим галочку напротив свойства Params (укажем, что в модуль использует параметры) и проконтролируем версию модуля  Version 4.0.0.

Создание нового модуля

После нажатия "ОК" мы увидим начальное содержимое созданного модуля.

Начальное содержимое модуля 

Сохраним файл в удобной для работы директории (например, в C:\Program Files\SiteEdit\types\rus - здесь находятся модули, используемые SiteEdit) под именем monlinenews2 (модуль monlinenews уже существует).  При сохранении редактор предложит защитить файл паролем. Устанавливать пароль пока нет необходимости, поэтому просто кликаем "ОК". На этом подготовка к работе завершена.

Вернуться назад

Создание шаблона списка новостей

Продолжим работу над модулем. Отредактируем содержимое вкладки "Раздел" так, чтобы оно соответствовало назначению модуля. Пройдемся по коду:

<div class="content contOnNews" >

Тэг <div> здесь открывает блок раздела, ему определен класс contOnNews. В макропеременной  содержатся индивидуальные настройки раздела. Подробнее об этих настройках рассказано в разделе "Синтаксис шаблонов модуля"  Справочного руководства. Задать индивидуальные настройки  можно на вкладке CSS редактирования раздела:

Индивидуальные настройки раздела

Далее выводим заголовок раздела:

<noempty:part.title>
  <h3 class="contentTitle"><span class="contentTitleTxt"></span></h3>
</noempty>

Тэг <noempty: переменная> обеспечивает вывод содержимого в том случае, если переменная (в данном случае  part.title  - заголовок раздела) определена. Тэг <h3> определяет заголовок третьего уровня, ему указан класс contentTitle. Внутри тэга <span></span> располагается текст заголовка раздела с классом contentTitle.

Следующий фрагмент кода выводит изображение раздела:

<noempty:part.image>
  <img border="0" class="contentImage" src="" alt="">
</noempty>

Здесь мы выводим изображение  без рамки (border="0"). Картинке определен класс "contentImage". Само изображение определяется переменной и альтернативный текст соответственно .

Добавим здесь заголовок изображения: title="". Код теперь будет выглядеть так: 

<noempty:part.image>
  <img border="0" class="contentImage" src="" alt="" title="">
</noempty>

Далее выводится текст раздела

<noempty:part.text>
  <div class="contentText">

Из этого урока Вы узнаете как создаются модули для SiteEdit на примере построения модуля онлайн новостей. Шаг за шагом данный урок проведет вас через все этапы разработки модуля.

</div>
</noempty>

и добавляется ссылка для добавления новостей:

<if:{$editobject}!=N>
    <a class="addLink" href="/lesson-onlinenews/1/sub2/">[param6]</a>
</if>

Здесь переменная $editobject содержит информацию о возможности редактирования раздела, если она не равна N, то редактирование возможно и ссылка на соответствующую страницу отобразится. Зададим ей сразу значение по умолчанию, для этого перейдем на "PHP-(Pretreatment)" и добавим запись: $editobject = 'N';.

Переменная по умолчанию

Добавим блок постраничной навигации:

<div class="muchpages top">
{$MANYPAGE}
</div>

Переменная $MANYPAGE необходима для последующей привязки к макрокоманде отображения стандартного переключателя страниц.

Фрагмент кода 

<div class="contentBody">

    <repeat:records>
    <div class="object" [objedit]>
      <noempty:record.title><h4 class="objectTitle">[record.title]</h4></noempty>
      <noempty:record.image><img border="0" class="objectImage" src="[record.image_prev]" border="0" alt="[record.image_alt]"></noempty>
      <noempty:record.note><div class="objectNote">[record.note]</div></noempty>
      <noempty:record.text><a href=[record.link]>[далее..]</a></noempty>
    </div>
    </repeat:records>
  </div>

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

<repeat:objects>
<div class="object">
</div>
</repeat:objects>

Внутри блока выведем заголовок записи:

<repeat:objects>
<div class="object">
  <h4 class="objectTitle">[record.edit]
  <span class="dataType_date">[record.date]</span>
  <span class="textTitle">[record.title]</span>
  </h4>
</div>
</repeat:objects>

Заголовок здесь четвертого уровня с классом "objectTitle". В заголовке выводим дату добавления новости [record.data], класс "dataType_date", и текст заголовка [record.title], класс "textTitle".

Далее добавим вывод изображения записи record.image_prev, если оно определено:

<repeat:objects>
<div class="object">
  <h4 class="objectTitle">[record.edit]
  <span class="dataType_date">[record.date]</span>
  <span class="textTitle">[record.title]</span>
  </h4>
  <noempty:record.image_prev>
  <img border="0" class="objectImage" src="[record.image_prev]" alt="[record.image_alt]">
  </noempty>
 
</div>
</repeat:objects>

Выведем текст новости и ссылку на подрбное описание:

   <div class="objectNote">[record.text]
    <a class="newsLink" href="/lesson-onlinenews/1/sub1/<serv>id/[record.id]/</serv>">[param2]</a>
  </div> 
 

Здесь между тэгами <serv></serv> серверу передается переменная id - идентификатор новости для отображения.

Объединим изображение и краткий текст новости в один блок с классом newsContainer (в дальнейшем это поможет легко настроить стили оформления):

 <div class="newsContainer">
  <noempty:record.image_prev>
    <img border="0" class="objectImage" src="[record.image_prev]" alt="[record.image_alt]">
  </noempty>
  
  <div class="objectNote">[record.text]
    <a class="newsLink" href="/lesson-onlinenews/1/sub1/<serv>id/[record.id]/</serv>">[param2]</a>
  </div>
  </div>

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

<if:{$editobject}!=N>
     <div class="objectPanel">
        <a class="buttonSend recordEdit" href="/lesson-onlinenews/1/sub2/<serv>id/[record.id]/</serv>">[param15]</a>
        <a class="buttonSend recordDelete" href="/lesson-onlinenews/<serv>id/[record.id]/</serv>">[param27]</a>        
     </div>
  </if>

Здесь так же проверяется переменная $editobject, и если редактирование возможно, панель отобразится.

Добавим нижний блок постаничной навигации:

<div class="muchpages bottom">
{$MANYPAGE}
</div>

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

<div class="content contOnNews" >
<noempty:part.title>
  <h3 class="contentTitle"><span class="contentTitleTxt"></span></h3>
</noempty>
<noempty:part.image>
  <img border="0" class="contentImage" src=""
  alt="" title="">
</noempty>
<noempty:part.text>
  <div class="contentText" >

Из этого урока Вы узнаете как создаются модули для SiteEdit на примере построения модуля онлайн новостей. Шаг за шагом данный урок проведет вас через все этапы разработки модуля.

</div>
</noempty>
<if:{$editobject}!=N>
    <a class="addLink" href="/lesson-onlinenews/1/sub2/">[param6]</a>
</if>
<div class="muchpages top">
{$MANYPAGE}
</div>
<repeat:objects>
<div class="object">
  <h4 class="objectTitle">
  <span class="dataType_date">[record.date]</span>
  <span
  class="textTitle">[record.title]</span>
  </h4>
 
  <div class="newsContainer">
  <noempty:record.image_prev>
    <img border="0" class="objectImage" src="[record.image_prev]" alt="[record.image_alt]">
  </noempty>
  
  <div class="objectNote">[record.text]
    <a class="newsLink" href="/lesson-onlinenews/1/sub1/<serv>id/[record.id]/</serv>">[param2]</a>
  </div>
  </div>
 
  <if:{$editobject}!=N>
     <div class="objectPanel">
        <a class="buttonSend recordEdit" href="/lesson-onlinenews/1/sub2/<serv>id/[record.id]/</serv>">[param15]</a>
        <a class="buttonSend recordDelete" href="/lesson-onlinenews/<serv>delete/[record.id]/</serv>">[param27]</a>        
     </div>
  </if>
 
</div>
</repeat:objects>
<div class="muchpages bottom">
{$MANYPAGE}
</div>
</div>

На этом построение шаблона списка новостей завершено.

Вернуться назад

Создание шаблона просмотра новости

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

Создание субстраниц

Создание субстраницы

В режиме HTML добавим блоки:

<div class="content contOnNews view">
  <div class="contentBody">
  </div>
</div>

Основной блок имеет класс "contOnNews", внутри него располагается другой блок, где и будет осуществляться весь вывод.

Добавим ссылку на страницу со всем новостями:

<div class="content contOnNews view">
  <div class="contentBody">
    <a class="backLink" href="/lesson-onlinenews/">[param18]</a> 
   </div>
</div>

Класс ссылки "backLink", адрес определяется макрокомандой lesson-onlinenews, а текст ссылки параметром [param18] (подробнее о параметрах будет сказано в разделе "Настройка параметров").

Добавим заголовок новости:

<div class="content contOnNews  view">
  <div class="contentBody
    <a class="backLink" href="/lesson-onlinenews/">[param18]</a>
    <h4 class="objectTitle">
      <span class="objectTitleTxt">{$news_title}</span>
    </h4>

  </div>
</div>

Заголовок здесь определен четвертого уровня, класс "obectTitle", текст заголовка имеет класс "objectTitletxt" и определяется переменной $news_title.

Далее необходимо вывести изображение новости, текст и сслылку для возврата на предыдущую страницу. Для этого добавим блоки с классами "objimage" и "obectText". Изображение и текст для вывода определяются соотвественно переменными $news_img и $news_text:

<div class="content contOnNews view">
  <div class="contentBody">
    <a class="backLink" href="/lesson-onlinenews/">[param18]</a>
    <h4 class="objectTitle">
      <span class="objectTitleTxt">{$news_title}</span>
    </h4>
    <div id="objimage">
    {$news_img}
    </div>
    <div class="objectText">
    {$news_text}
    </div>
  </div>
  <input class="buttonSend" onclick='javascript:history.back(-1)' type="button" value="[param19]">
</div>

 На этом создание шаблона страницы вывода текста новости завершено.

Вернуться назад

Создание шаблона добавления и редактирования новости

Редактирование и добавление новости происходит посредством одной и той же формы, поэтому и шаблон необходимо построить только один. Приступим.

Добавим субстраницу, в режиме HTML начнем постоение шаблона. Создадим основной блок и форму вниутри него:

<div class="content contOnNewsEdit add">
<form method="post" action="" enctype="multipart/form-data" style="margin:0px;">
</form>
</div>

Данные формы передаются методом Post.

В форму добавим таблицу из 7 строк и 2 столбцов ( в последних 4 строках столбцы объединены):

<div class="content contOnNewsEdit add">
    <form method="post" action="" enctype="multipart/form-data" style="margin:0px;">
    <table class="tableTable">
    <tbody>
    <tr>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td colspan="2"></td>
    </tr>
    <tr>
        <td colspan="2"></td>
    </tr>
    <tr>
        <td colspan="2"></td>
    </tr>
    <tr>
         <td colspan="2"></td>
    </tr>
    </tbody>
    </table>    
    </form>
</div>

Теперь поработаем с таблицей.

Первая строка: определим левой ячейке класс "title" и значение  [param29]*. Правой ячейке зададим класс "field" и добавим 3 поля ввода: ввод даты (имя поля day, максимальная длина 2 символа, размер поля 2 символа, значение передадим в переменную $_day ), ввод месяца (имя поля month, максимальная длина 2 символа, размер поля 2 символа, значение передадим в переменную $_month)  и поле ввода года (имя поля year, максимальная длина 4 символа, размер поля 4 символа, значение передадим в переменную $_year).

<div class="content contOnNewsEdit add">
    <form method="post" action="" enctype="multipart/form-data" style="margin:0px;">
    <table class="tableTable">
    <tbody>
    <tr>
        <td class="title">[param29]*</td>
        <td class="field">
        <input class="date day" type="text" name="day" maxlength="2" size="2" value="[$_day]">
        <input class="date month" type="text" name="month" maxlength="2" size="2" value="[$_month]">
        <input class="date year" type="text" name="year" maxlength="4" size="4" value="[$_year]">       
        </td>

    </tr>
    <tr>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td colspan="2"></td>
    </tr>
    <tr>
        <td colspan="2"></td>
    </tr>
    <tr>
        <td colspan="2"></td>
    </tr>
    <tr>
         <td colspan="2"></td>
    </tr>
    </tbody>
    </table>    
    </form>
</div>

Вторая строка: левой ячейке определим класс "title", содержать ячейка будет заголовок для поля с идентифкатором "titleNews", значение заголовка определяется параметром param23; правая ячейка содержит поле ввода с идентификатором "titleNews" (имя поля title, значение передается в переменную $_title).

Третья строка: левой ячейке определим класс "title", в ячейке будет находится заголовок для поля с идентификатром "userfile"значение заголовка определяется параметром param24; правая ячейка содержит область выбора пользовательского файла.

<div class="content contOnNewsEdit add">
    <form method="post" action="" enctype="multipart/form-data" style="margin:0px;">
    <table class="tableTable">
    <tbody> 
    <tr>
        <td class="title">[param29]*</td>
        <td class="field">
        <input class="date day" type="text" name="day" maxlength="2" size="2" value="[$_day]">
        <input class="date month" type="text" name="month" maxlength="2" size="2" value="[$_month]">
        <input class="date year" type="text" name="year" maxlength="4" size="4" value="[$_year]">       
        </td>
    </tr>    
    <tr>
        <td class="title"><label for="titleNews">[param23]*</label</td>
        <td class="field">
            <input id="titleNews" type="text" name="title" value="[$_title]">
        </td>
    </tr>   
    <tr>
        <td class="title"><label for="userfile">[param24]</label></td>
        <td><input id="userfile" type="file" name="userfile"></td>
    </tr>
<tr>
        <td  colspan="2">td>
    </tr>
    <tr>
        <td colspan="2"></td>
    </tr> 
    <tr>
        <td colspan="2"></td>
    </tr> 
    <tr>
         <td colspan="2"></tr>
    </tbody>
    </table>    
    </form>
</div>

Четвертая строка:  класс ячейки "title", содержимое определяется параметром param25.

Пятая строка содержит поле ввода текстового материала с идентификатором edittar, имя поля text,  значение передается в переменную $_text.

Шестая строка остается пустой.

Седьмая строка содержит 2 кнопки: для сохранения внесенных данных и для возвращения на предыдущую страницу.

<div class="content contOnNewsEdit add">
    <form method="post" action="" enctype="multipart/form-data" style="margin:0px;">
    <table class="tableTable">
    <tbody> 
    <tr>
        <td class="title">[param29]*</td>
        <td class="field">
        <input class="date day" type="text" name="day" maxlength="2" size="2" value="[$_day]">
        <input class="date month" type="text" name="month" maxlength="2" size="2" value="[$_month]">
        <input class="date year" type="text" name="year" maxlength="4" size="4" value="[$_year]">       
        </td>
    </tr>    
    <tr>
        <td class="title"><label for="titleNews">[param23]*</label</td>
        <td class="field">
            <input id="titleNews" type="text" name="title" value="[$_title]">
        </td>
    </tr> 
    <tr>
        <td class="title"><label for="userfile">[param24]</label></td>
        <td><input id="userfile" type="file" name="userfile"></td>
    </tr> 
    <tr>
        <td class="title" valign="top" colspan="2">[param25]</td>
    </tr>
    <!--пятая строка -->
    <tr>
        <td colspan="2">
            <textarea style="width:100%;" rows="10" cols="40" id="edittar" name="text">[$_text]
            </textarea>
        </td>
    </tr> 
      <tr>
        <td colspan="2"></td>
    </tr>
    <tr>
         <td colspan="2">
         <input class="buttonSend edSave" type="submit" name="Save" value="[param26]" >
           <input class="buttonSend edBack" type="button" value="[param28]" onclick='javascript:history.back()'>         
         </td>
    </tr>
    </tbody>
    </table>    
    </form>
</div>

Для функционирования формы необходимо добавить java-скрипт. Создадим еще одну субстраницу и зададим ей такое содержимое:

<header:js>
[js:jquery/jquery.min.js]
[js:tiny_mce/tiny_mce.js]
</header:js>
     <script type='text/javascript'>
         <!--
         tinyMCE.init({
            language : "$mlang",
            mode : "exact",
            elements : "edittar",
            theme : "advanced",
            theme_advanced_toolbar_location : "top",
            theme_advanced_toolbar_align : "left",
            theme_advanced_statusbar_location : "bottom"
         });
      -->
    </script>

Переменная $mlang содержит значение текущего языка сайта, принимает значения "ru", "en", задается переменная в php-обработчике. Подробное описание скрипта можно найти на сайте разработчика http://tinymce.moxiecode.com/.

Теперь подключим эту субстраницу к недавно созданной:


<div class="content contOnNewsEdit add">
    <form method="post" action="" enctype="multipart/form-data" style="margin:0px;">
    <table class="tableTable">
    <tbody> 
    <tr>
        <td class="title">[param29]*</td>
        <td class="field">
        <input class="date day" type="text" name="day" maxlength="2" size="2" value="[$_day]">
        <input class="date month" type="text" name="month" maxlength="2" size="2" value="[$_month]">
        <input class="date year" type="text" name="year" maxlength="4" size="4" value="[$_year]">       
        </td>
    </tr>     
    <tr>
        <td class="title"><label for="titleNews">[param23]*</label</td>
        <td class="field">
            <input id="titleNews" type="text" name="title" value="[$_title]">
        </td>
    </tr> 
    <tr>
        <td class="title"><label for="userfile">[param24]</label></td>
        <td><input id="userfile" type="file" name="userfile"></td>
    </tr> 
    <tr>
        <td class="title" valign="top" colspan="2">[param25]</td>
    </tr>
    <tr>
        <td colspan="2">
            <textarea style="width:100%;" rows="10" cols="40" id="edittar" name="text">[$_text]
            </textarea>
        </td>
    </tr> 
    <tr>
        <td colspan="2"></td>
    </tr>
    <tr>
         <td colspan="2">
         <input class="buttonSend edSave" type="submit" name="Save" value="[param26]" >
            <input class="buttonSend edBack" type="button" value="[param28]" onclick='javascript:history.back()'>         
         </td>
    </tr>
    </tbody>
    </table>    
    </form>
</div>

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


<div class="content contOnNewsEdit add">
    <b class="errorText">$errortext</b>
    <form method="post" action="" enctype="multipart/form-data" style="margin:0px;">
    <table class="tableTable">
    <tbody> 
    <tr>
        <td class="title">[param29]*</td>
        <td class="field">
        <input class="date day" type="text" name="day" maxlength="2" size="2" value="[$_day]">
        <input class="date month" type="text" name="month" maxlength="2" size="2" value="[$_month]">
        <input class="date year" type="text" name="year" maxlength="4" size="4" value="[$_year]">       
        </td>
    </tr>    
    <tr>
        <td class="title"><label for="titleNews">[param23]*</label</td>
        <td class="field">
            <input id="titleNews" type="text" name="title" value="[$_title]">
        </td>
    </tr> 
    <tr>
        <td class="title"><label for="userfile">[param24]</label></td>
        <td><input id="userfile" type="file" name="userfile"></td>
    </tr> 
    <tr>
        <td class="title" valign="top" colspan="2">[param25]</td>
    </tr>
    <tr>
        <td colspan="2">
            <textarea style="width:100%;" rows="10" cols="40" id="edittar" name="text">[$_text]
            </textarea>
        </td>
    </tr> 
      <tr>
        <td colspan="2"></td>
    </tr> 
    <tr>
         <td colspan="2">
         <input class="buttonSend edSave" type="submit" name="Save" value="[param26]" >
            <input class="buttonSend edBack" type="button" value="[param28]" onclick='javascript:history.back()'>         
         </td>
    </tr>
    </tbody>
    </table>    
    </form>
</div>

На этом построение шаблона добавления новостей завершено.

Вернуться назад

Настройка параметров

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

Настройка параметров

Перейдем на вкладку "Параметры" и добавим через контекстное меню следующий список параметров:

  Заголовок По умолчанию Список значений для выбора
param1 Логин Модератора:    
param2 Ссылка "подробнее...": подробнее...  
param3 Количество новостей на странице: 15  
param4 Ширина рисунка: 200  
param5 Ширина превью-картинки: 100  
param6 Сообщение "Добавить новость": [+] Добавить новость  
param7 Сообщение "Введите краткий текст новости": Введите краткий текст новости  
param8 Сообщение "Введите заголовок": Введите заголовок  
param9 Сообщение "Введите месяц": Введите месяц  
param10 Сообщение "Введите день": Введите день  
param11 Сообщение "Введите год": Введите год  
param12 Сообщение "Неправильно введена дата": Неправильно введена дата  
param13 Сообщение "Не является картинкой": Выбранный файл не является картинкой  в формате GIF/JPG/PNG!  
param14 Сообщение "Превышает размер": Выбранный файл превышает размер 1 Мб!  
param15 Кнопка "Изменить": &nbsp;»  
param16 Всплывающая подсказка: Редактировать  
param17 Число символов в кратком тексте: 250  
param18 Текст ссылки "Все новости": Все новости  
param19 Кнопка "Вернуться назад": Вернуться назад  
param20 Идентификатор новостей: news  
param21 Подсказка в активное поле страницы Введите номер страницы для перехода   
param22 :::Страницы редактирования:::    
param29 Заголовок "Дата": Дата  
param23 Заголовок "Заголовок": Заголовок  
param24 Заголовок "Загрузить рисунок": Загрузить рисунок  
param25 Заголовок "Текст новости": Текст новости  
param26 Кнопка "Сохранить": Сохранить  
param27 Кнопка "Удалить": Удалить  
param28 Кнопка "Назад": Назад  
param30 Краткий вид даты: Y Y|Да,N|Нет

Вернуться назад

Прототип модуля

Прототип - это имитация работы динамического компонента сайта для визуальной оченки и настройки дизайна.
Файт прототипа имеет расширение  PTT, имя совпадает с именем модуля. Создается прототип автоматически в той же директории, где находится сам модуль. Подробнее о протипах рассказано в разделе Конструктор прототипов Справочного руководства.

Откроем файл прототипа нашего модуля:


record.title=title
record.image_prev=image_prev
record.image_alt=image_alt
record.note=note
record.link=link
[var]
add_news=add_news
MANYPAGE=MANYPAGE
news_title=news_title
news_img=news_img
news_text=news_text
[objects]
record.edit=edit
record.date=date
record.title=title
record.image_prev=image_prev
record.image_alt=image_alt
record.text=text
record.link=link
record.link_detail=link_detail

В переменную MANYPAGE  поместим макрокоманду [DB_PAGE_SELECTOR] для отображения пепключателя страниц. Верхний блок до [var] можно удалить. Добавим количество отображаемых записей reccount=15 и варианты содержимого записей:

[var]
MANYPAGE=[DB_PAGE_SELECTOR]
news_title=[Заголовок новости 1|Заголовок новости 2|Заголовок новости 3]
news_img=<img src="/lib/img/img_350.jpg" class="viewImage" title="Oioi" border="0">
news_text=[По результатам почти полувековых самых престижных спортивных баталий
editobject=editobject
 на биатлонных стрельбищах и лыжных трассах советско-российская научно-педагогическая школа
 биатлона получила международное признание, обрела мировую известность. Рекордные достижения наших
 биатлонистов были обеспечены талантом и трудолюбием работающих с ними тренеров, врачей,
 массажистов, научных работников, сотрудников сервисной группы, руководителей спорта.|Чемпионаты мира ежегодно
 проводят с 1958 г., а олимпийскую прописку этот спорт получил в 1960 г. на VIII Играх (Скво-Вэлли, США).
 В каждом олимпийском году мировые Чемпионаты разыгрывают только в тех дисциплинах, которые не входят в олимпийскую
 программу.| Раздел сайта для тренеров и специалистов, а также студентов физкультурных ВУЗов, обучающихся по специальности
 «Физическая культура и спорт», посвященный актуальным вопросам подготовки квалифицированных биатлонисток, системам тренировок,
 специфике соревновательной деятельности, в том числе и членов сборных команд России.]

[objects]
reccount=15
record.edit=<a class="editLink" href="/lesson-onlinenews/1/sub2/">[param15]</a>
record.date=[02.06.2010|02.06.2010|10.06.2010]
record.title=[Заголовок новости 1|Заголвок новости 2|Заголовок новости 3]
record.image_prev=[/lib/img\img_100.jpg|]
record.image_alt=image_alt
record.text=[По результатам почти полувековых самых престижных спортивных баталий на биатлонных стрельбищах и лыжных трассах советско-российская научно-педагогическая школа
record.link_detail=link_detail
record.id=id
 биатлона получила международное признание, обрела мировую известность. Рекордные достижения наших
 биатлонистов были обеспечены талантом и трудолюбием работающих с ними тренеров, врачей,
 массажистов, научных работников, сотрудников сервисной группы, руководителей спорта.|Чемпионаты мира ежегодно
 проводят с 1958 г., а олимпийскую прописку этот спорт получил в 1960 г. на VIII Играх (Скво-Вэлли, США).
 В каждом олимпийском году мировые Чемпионаты разыгрывают только в тех дисциплинах, которые не входят в олимпийскую
 программу.| Раздел сайта для тренеров и специалистов, а также студентов физкультурных ВУЗов, обучающихся по специальности
 «Физическая культура и спорт», посвященный актуальным вопросам подготовки квалифицированных биатлонисток, системам тренировок,
 специфике соревновательной деятельности, в том числе и членов сборных команд России.]

Прототип модуля он-лайн новостей создан.
Вернуться назад

Настройка стилей

В редакторе модулей перейдем на вкладку "Стили" и проконтролируем, чтобы активным был основной раздел модуля.

Настройка стлей

Пока наши возможности настройки стилей ограничены. Перейдем в текстовый режим:

Текстовый режим редактирования стилей

Мы видим, что в стилях описаны не все созданные нами элементы:

Стили модуля 

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

<div class="content contOnNews" ><!--Он-лайн новости (добавление через сайт или SiteEdit Менеджер)--> 
<noempty:part.title> <!--Заголовок раздела-->
<h3 class="contentTitle" >
<span class="contentTitleTxt"></span></h3> <!--Текст заголовка раздела-->
</noempty>         
<noempty:part.image> <!--Изображение раздела-->
  <img border="0" class="contentImage" src="" alt="" title="">
</noempty> 
<noempty:part.text> <!--Текст раздела-->
  <div class="contentText">

Из этого урока Вы узнаете как создаются модули для SiteEdit на примере построения модуля онлайн новостей. Шаг за шагом данный урок проведет вас через все этапы разработки модуля.

</div>
</noempty>
<if:{$editobject}!=N> <!--Сылка "редактировать" -->
    <a class="addLink" href="/lesson-onlinenews/1/sub2/">[param6]</a>
</if>
<div class="muchpages top"> <!--Переключатель страниц верхний-->
{$MANYPAGE}
</div>
<repeat:objects>
<div class="object"> <!--Новость-->
  <h4 class="objectTitle">[record.edit]    <!--Заголовок новости-->
    <span class="dataType_date">[record.date]</span>   <!--Дата добавления новости-->
    <span class="textTitle">[record.title]</span>  <!--Текст заголовка новости-->
  </h4>
  <div class="newsContainer"> <!--Содержание новости-->
  <noempty:record.image_prev> <!--Изображение новости-->
  <img border="0" class="objectImage" src="[record.image_prev]" alt="[record.image_alt]">
  </noempty>
     <div class="objectNote">[record.text]<!--Краткий текст новости-->
    <a class="newsLink" href="/lesson-onlinenews/1/sub1/<serv>id/[record.id]/</serv>">[param2]</a> <!--Ссылка "подробнее"-->
  </div>
  </div>    
<if:{$editobject}!=N>
  <div class="objectPanel"> <!--Панель редактирования-->
        <a class="buttonSend recordEdit" href="/lesson-onlinenews/1/sub2/<serv>id/[record.id]/</serv>">[param15]</a> <!--Ссылка "редактировать"-->
        <a class="buttonSend recordDelete" href="/lesson-onlinenews/<serv>id/[record.id]/</serv>">[param27]</a>  <!--Ссылка "удалить"-->
     </div>
  </if> </div>
</repeat:objects>
<div class="muchpages bottom"> <!--Переключатель страниц нижний-->
{$MANYPAGE}
</div>
</div>

В стилях в текстовом режиме отредактируем автоматически созданный текст в соответствии с выделенными элементами:

Модули
 Новости
  Он-лайн новости (добавление через сайт или SiteEdit Менеджер) [.contOnNews]
   Заголовок раздела [.contOnNews .contentTitle]
    Текст заголовка [.contOnNews .contentTitleTxt]
   Изображение раздела [.contOnNews .contentImage]
   Текст раздела [.contOnNews .contentText]
   Переключатель страниц верхний [.contOnNews .muchpages.top]
   "Добавить новость" [.contOnNews .addLink]
   Новость [.contOnNews .object]
    Заголовок новости [.contonNews .objectTitle]
     Дата добавления новости [.contOnNews .dataType_date]
     Текст заголовка[.contOnNews .textTitle]
    Содержание новости [.contOnNews .newsContainer]
     Изображение новости [.contOnNews .newsContainer .objectImage]
     Краткий текст новости [.contOnNews .newsContainer.objectNote]
    Ссылка "Подробнее" [.contOnNews .newsLink]{float:right; text-align:right;}
    Панель редактирования [.contOnNews .objectPanel]
     Кнопка "редактировать" [.contOnNews .objectPanel .buttonSend.recordEdit]
     Кнопка "удалить" [.contOnNews .objectPanel .buttonSend.recordDelete]
    Переключатель страниц верхний [.contOnNews .muchpages.bottom]

Добавим возможность подробной настройки стилей для переключателя страниц:

Модули
 Новости
  Он-лайн новости (добавление через сайт или SiteEdit Менеджер) [.contOnNews]
   Заголовок раздела [.contOnNews .contentTitle]
    Текст заголовка [.contOnNews .contentTitleTxt]
   Изображение раздела [.contOnNews .contentImage]
   Текст раздела [.contOnNews .contentText]
   "Добавить новость" [.contOnNews .addLink]
   Переключатель страниц
    Общие настройки [.contOnNews .muchpages]
     Текущая страница [.contOnNews .muchpages .pagenactive]
      Поле ввода страниц [.contOnNews .muchpages .inputpagenactive]
     Другие страницы [.contOnNews .muchpages .pagen]
      Ссылка на другую страницу [.contOnNews .muchpages .pagen a]
      Ссылка на другую страницу при наведении [.contOnNews .muchpages .pagen a:hover]
    Верхний переключатель [.contOnNews .muchpages.top]
     Текущая страница [.contOnNews .muchpages.top .pagenactive]
      Поле ввода страниц [.contOnNews .muchpages.top .inputpagenactive]
     Другие страницы [.contOnNews .muchpages.top .pagen]
      Ссылка на другую страницу [.contOnNews .muchpages.top .pagen a]
      Ссылка на другую страницу при наведении [.contOnNews .muchpages.top .pagen a:hover]
    Нижний нижний переключатель [.contOnNews .muchpages.bottom]
     Текущая страница [.contOnNews .muchpages.bottom .pagenactive]
      Поле ввода страниц [.contOnNews .muchpages.bottom .inputpagenactive]
     Другие страницы [.contOnNews .muchpages.bottom .pagen]
      Ссылка на другую страницу [.contOnNews .muchpages.bottom .pagen a]
      Ссылка на другую страницу при наведении [.contOnNews .muchpages.bottom .pagen a:hover]
   Новость [.contOnNews .object]
    Заголовок новости [.contonNews .objectTitle]
     Дата добавления новости [.contOnNews .dataType_date]
     Текст заголовка[.contOnNews .textTitle]
    Содержание новости [.contOnNews .newsContainer]
     Изображение новости [.contOnNews .newsContainer .objectImage]
     Краткий текст новости [.contOnNews .newsContainer .objectNote]
    Ссылка "Подробнее" [.contOnNews .newsLink]{float:right; text-align:right;}
    Панель редактирования [.contOnNews .objectPanel]
     Кнопка "редактировать" [.contOnNews .objectPanel .buttonSend.recordEdit]
     Кнопка "удалить" [.contOnNews .objectPanel .buttonSend.recordDelete]

  Добавим возможность настройки стилей для страницы просмотра новости (subpage1):

Модули
 Новости
  Он-лайн новости (добавление через сайт или SiteEdit Менеджер) [.contOnNews]
   Заголовок раздела [.contOnNews .contentTitle]
    Текст заголовка [.contOnNews .contentTitleTxt]
   Изображение раздела [.contOnNews .contentImage]
   Текст раздела [.contOnNews .contentText]
   "Добавить новость" [.contOnNews .addLink]
   Переключатель страниц
    Общие настройки [.contOnNews .muchpages]
     Текущая страница [.contOnNews .muchpages .pagenactive]
      Поле ввода страниц [.contOnNews .muchpages .inputpagenactive]
     Другие страницы [.contOnNews .muchpages .pagen]
      Ссылка на другую страницу [.contOnNews .muchpages .pagen a]
      Ссылка на другую страницу при наведении [.contOnNews .muchpages .pagen a:hover]
    Верхний переключатель [.contOnNews .muchpages.top]
     Текущая страница [.contOnNews .muchpages.top .pagenactive]
      Поле ввода страниц [.contOnNews .muchpages.top .inputpagenactive]
     Другие страницы [.contOnNews .muchpages.top .pagen]
      Ссылка на другую страницу [.contOnNews .muchpages.top .pagen a]
      Ссылка на другую страницу при наведении [.contOnNews .muchpages.top .pagen a:hover]
    Нижний нижний переключатель [.contOnNews .muchpages.bottom]
     Текущая страница [.contOnNews .muchpages.bottom .pagenactive]
      Поле ввода страниц [.contOnNews .muchpages.bottom .inputpagenactive]
     Другие страницы [.contOnNews .muchpages.bottom .pagen]
      Ссылка на другую страницу [.contOnNews .muchpages.bottom .pagen a]
      Ссылка на другую страницу при наведении [.contOnNews .muchpages.bottom .pagen a:hover]
   Новость [.contOnNews .object]
    Заголовок новости [.contonNews .objectTitle]
     Дата добавления новости [.contOnNews .dataType_date]
     Текст заголовка[.contOnNews .textTitle]
    Содержание новости [.contOnNews .newsContainer]
     Изображение новости [.contOnNews .newsContainer .objectImage]
     Краткий текст новости [.contOnNews .newsContainer .objectNote]
    Ссылка "Подробнее" [.contOnNews .newsLink]
    Панель редактирования [.contOnNews .objectPanel]
     Кнопка "редактировать" [.contOnNews .objectPanel .buttonSend.recordEdit]
     Кнопка "удалить" [.contOnNews .objectPanel .buttonSend.recordDelete]
   Просмотр [.contOnNews.view]
    Содержание [.contOnNews.view .contentBody]
    Заголовок новости [.contOnNews.view .objectTitle]
     Текст заголовка [.contOnNews.view .objectTitleTxt]
    Слой рисунка-Подробно [.contOnNews.view #objimage]
    Рисунок "Подробно" [.contOnNews.view .viewImage]
    Подробный текст[.contOnNews.view .objectText]
    Кнопка "Назад" [.contOnNews.view .buttonSend]

     
Добавим возможность настройки стилей для страницы редактирования/добавления новостей (subpage2):

Модули
 Новости
  Он-лайн новости (добавление через сайт или SiteEdit Менеджер) [.contOnNews]
   Заголовок раздела [.contOnNews .contentTitle]
    Текст заголовка [.contOnNews .contentTitleTxt]
   Изображение раздела [.contOnNews .contentImage]
   Текст раздела [.contOnNews .contentText]
   "Добавить новость" [.contOnNews .addLink]
   Переключатель страниц
    Общие настройки [.contOnNews .muchpages]
     Текущая страница [.contOnNews .muchpages .pagenactive]
      Поле ввода страниц [.contOnNews .muchpages .inputpagenactive]
     Другие страницы [.contOnNews .muchpages .pagen]
      Ссылка на другую страницу [.contOnNews .muchpages .pagen a]
      Ссылка на другую страницу при наведении [.contOnNews .muchpages .pagen a:hover]
    Верхний переключатель [.contOnNews .muchpages.top]
     Текущая страница [.contOnNews .muchpages.top .pagenactive]
      Поле ввода страниц [.contOnNews .muchpages.top .inputpagenactive]
     Другие страницы [.contOnNews .muchpages.top .pagen]
      Ссылка на другую страницу [.contOnNews .muchpages.top .pagen a]
      Ссылка на другую страницу при наведении [.contOnNews .muchpages.top .pagen a:hover]
    Нижний нижний переключатель [.contOnNews .muchpages.bottom]
     Текущая страница [.contOnNews .muchpages.bottom .pagenactive]
      Поле ввода страниц [.contOnNews .muchpages.bottom .inputpagenactive]
     Другие страницы [.contOnNews .muchpages.bottom .pagen]
      Ссылка на другую страницу [.contOnNews .muchpages.bottom .pagen a]
      Ссылка на другую страницу при наведении [.contOnNews .muchpages.bottom .pagen a:hover]
   Новость [.contOnNews .object]
    Заголовок новости [.contonNews .objectTitle]
     Дата добавления новости [.contOnNews .dataType_date]
     Текст заголовка[.contOnNews .textTitle]
    Содержание новости [.contOnNews .newsContainer]
     Изображение новости [.contOnNews .newsContainer .objectImage]
     Краткий текст новости [.contOnNews .newsContainer .objectNote]
    Ссылка "Подробнее" [.contOnNews .newsLink]
    Панель редактирования [.contOnNews .objectPanel]
     Кнопка "редактировать" [.contOnNews .objectPanel .buttonSend.recordEdit]
     Кнопка "удалить" [.contOnNews .objectPanel .buttonSend.recordDelete]
   Просмотр [.contOnNews.view]
    Содержание [.contOnNews.view .contentBody]
    Заголовок новости [.contOnNews.view .objectTitle]
     Текст заголовка [.contOnNews.view .objectTitleTxt]
    Слой рисунка-Подробно [.contOnNews.view #objimage]
    Рисунок "Подробно" [.contOnNews.view .viewImage]
    Подробный текст[.contOnNews.view .objectText]
    Кнопка "Назад" [.contOnNews.view .buttonSend]
   Добавить/редактировать новости [.contOnNewsEdit]
    Сообщение об ошибке [.contOnNewsEdit .errorText]
    Таблица [.contOnNewsEdit .tableTable]
     Заголовки [.contOnNewsEdit .title]
     Данные [.contOnNewsEdit .field]
      Дата [.contOnNewsEdit .date]
       День [.contOnNewsEdit .date.day]
       Месяц [.contOnNewsEdit .date.month]
       Год [.contOnNewsEdit .date.year]
      Заголовок [.contOnNewsEdit #titleNews]{width:100%;}
      Основной текст [.contOnNewsEdit #edittar]
      Добавить рисунок [.contOnNewsEdit #userfile]
    Кнопка "Сохранить" [.contOnNewsEdit .edSave]
    Кнопка "Назад" [.contOnNewsEdit .edBack]

 Теперь можно настроить стили для каждого элемента раздела.

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

Настройка стилей модуля

Чтобы оценить, как модуль выглядит, подключим его на странице тестового проекта SiteEdit:

Добавление нового раздела

Следует обратить внимание, если модуль сохранен не в директории C:\Program Files\SiteEdit\types\rus , его стоит туда скопировать, иначе он не отобразится в SiteEdit):

Выбор модуля для подключения

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

Модуль Он-лайн новостей ненастроенный

Приступим к настройке стилей. Вернемся в Редактор модулей на вкладку "Стили". Выделенные элементы в дереве обозначаются красной рамкой.

Настройка раздела и списка новостей

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

Выбор элемента в дереве

и установим ему выравнивание ( css: float) " left" на вкладке "Position".

Установка парамеров стилей

Для "Текста раздела" назначим горизонтальное выравнивание (css:text-align) "justify" на вкладке "Location Text".

Для ссылки "Добавить новость" укажем так же выравниание "left"  расположение (css: clear) "both". Для переключателя страниц в "Общих настройках" укажем отступы (css: margin) верх и низ по 15px и расположение "both".

 Далее настроим отображение списка новостей. Для заголовка новости укажем (так же на вкладке "Position") тип контейнера (css: display) "block", общую ширину 100% и расположение "both". Для содержания новости так же укажем общую ширину (css:width) 100% ,  расположение "both", на вкладке "Location Text" панели настроек укажем отступы (css: padding) сверху и снизу по 10px. Изобржению новости назначим тип контейнера "block", выравнивание "left", отступы право 10px, низ 5px. Ссылке "Подробнее" зададим выравнивание "right".

Для "Панели редактирования" укажем общую высоту (css: height) 40px и расположение "both". Кнопке "Редактировать" укажем смещение сверху и снизу по 5px, слева и справа по 10px. Такие же настройки сделаем для кнопки "Удалить".

Настройка страницы просмотра новости

Для настройки страницы просмотра новости переключимся на субстраницу 1.

Переключение на субстраницу

Перейдем на ветку "Просмотр [.contOnNews.view]" дерева элементов. Слою рисунка присвоим выравнивание "left" и отступ "право" 15px. Кнопке "Назад" укажем выравнивание "right"  и отступ "верх" 20px. На этом настройки субстраницы можно заверишть.

Настройка стилей для страницы редактирования/добавления

Перейдем на субстраницу 2. В дереве элементов найдем ветку "Добавить/редактировать новости [.contOnNewsEdit]" . Для таблицы укажем общую ширину 80%.  Перейдем по ветке "Данные". Для заголовка укажем ширину 100%, для основного текста укажем высоту 400px.

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

Модули
 Новости
  Он-лайн новости (добавление через сайт или SiteEdit Менеджер) [.contOnNews]
   Заголовок раздела [.contOnNews .contentTitle]
    Текст заголовка [.contOnNews .contentTitleTxt]
   Изображение раздела [.contOnNews .contentImage]{float:left;}
   Текст раздела [.contOnNews .contentText]{text-align:justify;}
   "Добавить новость" [.contOnNews .addLink]{margin-top:20px; float:left; clear:both;}
   Переключатель страниц
    Общие настройки [.contOnNews .muchpages]{margin-top:15px; margin-bottom:15px; clear:both;}
     Текущая страница [.contOnNews .muchpages .pagenactive]
      Поле ввода страниц [.contOnNews .muchpages .inputpagenactive]
     Другие страницы [.contOnNews .muchpages .pagen]
      Ссылка на другую страницу [.contOnNews .muchpages .pagen a]
      Ссылка на другую страницу при наведении [.contOnNews .muchpages .pagen a:hover]
    Верхний переключатель [.contOnNews .muchpages.top]
     Текущая страница [.contOnNews .muchpages.top .pagenactive]
      Поле ввода страниц [.contOnNews .muchpages.top .inputpagenactive]
     Другие страницы [.contOnNews .muchpages.top .pagen]
      Ссылка на другую страницу [.contOnNews .muchpages.top .pagen a]
      Ссылка на другую страницу при наведении [.contOnNews .muchpages.top .pagen a:hover]
    Нижний нижний переключатель [.contOnNews .muchpages.bottom]
     Текущая страница [.contOnNews .muchpages.bottom .pagenactive]
      Поле ввода страниц [.contOnNews .muchpages.bottom .inputpagenactive]
     Другие страницы [.contOnNews .muchpages.bottom .pagen]
      Ссылка на другую страницу [.contOnNews .muchpages.bottom .pagen a]
      Ссылка на другую страницу при наведении [.contOnNews .muchpages.bottom .pagen a:hover]
   Новость [.contOnNews .object]
    Заголовок новости [.contonNews .objectTitle]{display:block; width:100%; clear:both;}
     Дата добавления новости [.contOnNews .dataType_date]
     Текст заголовка[.contOnNews .textTitle]
    Содержание новости [.contOnNews .newsContainer]{padding-top:10px; padding-bottom:10px; width:100%; clear:both;}
     Изображение новости [.contOnNews .newsContainer .objectImage]{padding-left:0px; margin-bottom:5px; margin-right:10px; display:block; float:left;}
     Краткий текст новости [.contOnNews .newsContainer .objectNote]{text-align:justify;}
    Ссылка "Подробнее" [.contOnNews .newsLink]{float:right; text-align:right;}
    Панель редактирования [.contOnNews .objectPanel]{padding-top:10px; padding-bottom:10px; height:40px; float:none; clear:both;}
     Кнопка "редактировать" [.contOnNews .objectPanel .buttonSend.recordEdit]{padding-top:5px; padding-bottom:5px; padding-left:10px; padding-right:10px;}
     Кнопка "удалить" [.contOnNews .objectPanel .buttonSend.recordDelete]{padding-top:5px; padding-bottom:5px; padding-left:10px; padding-right:10px;}
   Просмотр [.contOnNews.view]
    Содержание [.contOnNews.view .contentBody]{clear:both;}
    Заголовок новости [.contOnNews.view .objectTitle]
     Текст заголовка [.contOnNews.view .objectTitleTxt]
    Слой рисунка-Подробно [.contOnNews.view #objimage]{margin-right:15px; float:left;}
    Рисунок "Подробно" [.contOnNews.view .viewImage]
    Подробный текст[.contOnNews.view .objectText]
    Кнопка "Назад" [.contOnNews.view .buttonSend]{margin-top:20px; float:right;}
   Добавить/редактировать новости [.contOnNewsEdit]
    Сообщение об ошибке [.contOnNewsEdit .errorText]
    Таблица [.contOnNewsEdit .tableTable]{width:80%;}
     Заголовки [.contOnNewsEdit .title]
     Данные [.contOnNewsEdit .field]
      Дата [.contOnNewsEdit .date]
       День [.contOnNewsEdit .date.day]
       Месяц [.contOnNewsEdit .date.month]
       Год [.contOnNewsEdit .date.year]
      Заголовок [.contOnNewsEdit #titleNews]{width:100%;}
      Основной текст [.contOnNewsEdit #edittar]{height:400px;}
      Добавить рисунок [.contOnNewsEdit #userfile]
    Кнопка "Сохранить" [.contOnNewsEdit .edSave]
    Кнопка "Назад" [.contOnNewsEdit .edBack]

Настроить стили модуля можно и в SiteEdit. После подключения модуля открываем Редактор дизайна (F4) и Текст CSS (F3), находим нужную ветку, делаем настройки, а затем из текста CSS берем нужную строчку и дописываем ее к стилям модуля.

Настройка стилей модуля через SiteEdit

Кнопка "Назад" [.contOnNews.view .buttonSend]{margin-top:20px; float:right; vertical-align:bottom;}
Вернуться назад

Предварительная обработка

В Редакторе модулей перейдем на вкладку "Раздел", затем к PHP-(Pretreatment):

Предварительная php-обработка

Здесь мы задавали значение переменной $editobject. Изменим немного ее определение:

$moder = (isModerators("[param1]") || seUserGroup()==3);
  
if ($moder)
        $editobject = 'Y';
else
        $editobject='N';

Определяем, может ли текущий пользователь редактировать записи: если он модератор (isModerators()) или администратор (seUserGroup()), то может.
Здесь мы использовали функицю isModerators(). Сейчас она еще не определена. Добавим эту функцию в библиотеку PHP:

Библиотека PHP

Код функции:

if (!function_exists('isModerators')){
function isModerators($name)
{
   $name_array = explode(',', $name); //получим массив имен модераторов раздела из параметра SiteEdit
   foreach ($name_array as $name) {
    if (seUserLogin() == trim($name) && trim($name)!='' && seUserGroup()) {
        return true;
    }
   }
}
}

Если функиция isModerators не существует, тогда мы ее определим. Функция возвращает true, если логин текущего пользвателя равен имени  модератора  или группа пользователя больше 1. Функции seUserName() и seUserGroup() являются функциями ядра SiteEdit, подробнее о них можно узнать в разделе "Функции ядра" Справочного руководства. 

Продолжим предварительную настройку и определим здесь еще несколько переменных.

if (isRequest('show_to'))
{
   $__data->goSubName($section, 1);
   $id = getRequest('show_to', 1);
}
else
    $id = getRequest('id', 1);

Здесь определяется id новости для отображения в зависимости от того, по какой ссылке был переход = по внешней (через show_to), либо по внутренней.     

 Определим еще несколько переменных:

    $news = new seTable('news', 'n'); //свяжем переменную с таблицей 'news' и укажем ей псевдоним 'n'
    $pagen = "[param3]"; //число новостей на странице
    $newskod = "[param20]"; //идентификатор новостей
    $width = intval("[param4]"); //ширина изображения
    $thumbwdth = intval("[param5]"); //ширина превью-картинки
    $nchar = intval("[param17]"); //число символов краткого текста
    $moder = 0; //переменная, указывающая модератор ли пользователь

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

require_once("lib/lib_images.php");

Определяем язык сайта: 

$lang = se_getlang();
$mlang = utf8_substr($lang, 0, 2);

Определим директории для работы с изображениями:

$IMAGE_DIR = "/images/".$lang."/newsimg/"; // директория для хранения изображений

//если директории не существуют, создаем их    

if (!is_dir(getcwd()."/images")) 
          mkdir(getcwd()."/images");

    if (!is_dir(getcwd()."/images/".$lang))
          mkdir(getcwd()."/images/".$lang);

    if (!is_dir(getcwd().$IMAGE_DIR))
          mkdir(getcwd().$IMAGE_DIR);

Общий код предобработки выглядит так:

//определим модератора
$moder =  (seUserGroup()  > 1) || isModerator($modername);   
if ($moder)
        $editobject = 'Y';
else
        $editobject='N';
       
if (isRequest('show_to')){
   $__data->goSubName($section, 1);
   $id = getRequest('show_to', 1);
}
else
    $id = getRequest('id', 1);
                            
 $news = new seTable('news', 'n');
 $modername="[param1]";
 $pagen = "[param3]";
 $width = intval("[param4]");
 $thumbwdth = intval("[param5]");
 $newskod = "[param20]";
 $nchar =  intval("[param17]");
 $nn        = 0;
 $moder     = 0;
   
// Подгружаем библиотеку
require_once("lib/lib_images.php");

// Определяем язык сайта   
$lang = se_getlang();
$mlang = utf8_substr($lang, 0, 2);

// массив используемых строк 
$IMAGE_DIR = "/images/".$lang."/newsimg/";

if (!is_dir(getcwd()."/images"))
    mkdir(getcwd()."/images");

if (!is_dir(getcwd()."/images/".$lang))
    mkdir(getcwd()."/images/".$lang);

if (!is_dir(getcwd().$IMAGE_DIR))
    mkdir(getcwd().$IMAGE_DIR);

На этом предварительная обработка  завершена.

Вернуться назад

Обработчик страницы списка новостей

Приступим к написнаию обработчика для шаблона списка новостей. В Редакторе модулей откроем основной раздел и перейдем в режим PHP кода:

Режим написание PHP-кода

 Вытащим нужные нам для отображения данные, заполним массив раздела объектами:    

$thisdate = strtotime(gmdate('Y-m-d', time() + 86400));
$news->select("`n`.`id`, LEFT(`n`.`text`,600) as `text`, `n`.img, `n`.title, `n`.`news_date`");
$news->innerjoin("news_category nc", "`n`.id_category = `nc`.id");
$news->Where("nc.lang = '?'", $lang);
$news->AndWhere("n.pub_date < '$thisdate'");
$news->andWhere("n.active != 'N'");
$news->orderBy('news_date', 0);

Здесь мы получаем текущую дату, преобразуем ее, далее через запрос к базе получаем тексты, изображения, заголовки и даты добавления новостей. Затем так же через запрос связываем полученный массив объектов с категориями новостей по условию совпадения id_category таблицы новостей с id  таблицы категорий. Затем выбриаем те новости, язык которых совпадает с языком сайта, дата публикации меньше текущей даты и активность не равна 'N'. Затем сортируем новости для отображения в порядке убывания даты публикации (для сортировки в порядке возрастания 0 поменять на 1).

Далее, проверим, не пуста ли переменная $newskod (идентификатор новости, опреден параметром при предварительной обработке), если идентификатор определен, делаем еще отбор новостей по совпадению их идентификатора с нужным. 

    if (trim($newskod) != '')
    {
       $news->andWhere("`nc`.ident = '?'", $newskod);
    }

Теперь укажем переменной $MANYPAGE, откуда брать данные для построения переключателя страниц, получим список строк из массива объектов (новостей) и уничтожим предыдущий массив объектов, если он был создан:  

  $MANYPAGE = $news->pageNavigator($pagen);
    $newslist = $news->getList();
    unset($section->objects);

Затем нам нужно каждую полученную строку обработать. Для этого мы запустим цикл, внутри которого будет обрабатываться перемнная $line.

foreach($newslist as $line)
    {
       $line['edit'] = " ";
       $notetext = $line['text']; //помещаем в краткий текст текст новости
       $id = $line['id']; //в id помещаем id новости
       if ("[param30]" == 'N'){ //определяем формат вывода даты
            $line['date'] = date("d.m.Y H:i", $line['news_date']);
        } else {
            $lenr['date'] = date("d.m.Y", $line['news_date']);
        }
 }

Добавим в цикл очистку заголовка новости от лишнего:  

foreach($newslist as $line)
    {
       $line['edit'] = " ";
       $notetext = $line['text'];
       $id = $line['id'];
      
        if ("[param30]" == 'N'){
            $line['date'] = date("d.m.Y H:i", $line['news_date']);
        } else {
            $lenr['date'] = date("d.m.Y", $line['news_date']);
        }        
        $line['title'] = htmlspecialchars($line['title'], ENT_QUOTES);
}

Если у новости определено изображение, обработаем его:

foreach($newslist as $line)
    {
       $line['edit'] = " ";
       $notetext = $line['text'];
       $id = $line['id'];
      
        if ("[param30]" == 'N'){
            $line['date'] = date("d.m.Y H:i", $line['news_date']);
        } else {
            $lenr['date'] = date("d.m.Y", $line['news_date']);
        }
       
        $line['title'] = htmlspecialchars($line['title'], ENT_QUOTES);

        if (!empty($line['img']))
        {
            $_imnames = explode(".", $line['img']); //разобъем имя файла на строки, используя в качестве разделителя точку
            $_image = $_imnames[0] . "_prev." . $_imnames[1]; //получим имя файла превью
            $line['image_prev'] = $IMAGE_DIR . $_image; //получим путь к файлу превью
        }
}

Теперь добавим ссылку на подробный текст новости и обработаем краткий текст, если необходимо: 

foreach($newslist as $line)
    {
       $line['edit'] = " ";
       $notetext = $line['text'];
       $id = $line['id'];
      
        if ("[param30]" == 'N'){
            $line['date'] = date("d.m.Y H:i", $line['news_date']);
        } else {
            $lenr['date'] = date("d.m.Y", $line['news_date']);
        }
       
        $line['title'] = htmlspecialchars($line['title'], ENT_QUOTES);

        if (!empty($line['img']))
        {
            $_imnames = explode(".", $line['img']);
            $_image = $_imnames[0] . "_prev." . $_imnames[1];
            $line['image_prev'] = $IMAGE_DIR . $_image;
        }
        // ссылка на субстраницу, если есть подробный текст для новости
        $line['link'] = "<br><a class=\"newsLink\" href=\"/{$_page}/{$razdel}/sub1/id/{$id}/\">[param2]</a>";
            if (utf8_strlen($notetext) > $nchar && $nchar){
            $notetext = strip_tags($notetext); //очистим текст от HTML и PHP тэгов
            $notetext = str_replace("\n", ' ', $notetext); //замена символа конца строки на ' '
            $line['text'] = se_LimitString($notetext, $nchar, ' ..'); // обрежем краткий текст по кличству символов
        }
        $__data->setItemList($section,'objects', $line); //
    }

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

$delete_id = getRequest('delete', 1);

Подробнее о функции getRequest можно узнать в разделе  "Функции для работы с запросами POST и GET" Справочного руководства.

Удалять записи могут только пользователи с соответствующими правами, защитим новсти от несанкционированного удаления проверкой значения переменной $editobject.

 if (($editobject!='N')&& (!empty($delete_id))){
 } 

Найдем нужную новость по id и получим имя файла ее изображения:

if (($editobject!='N')&& (!empty($delete_id))){
            $news-> find($delete_id);
            $filename   = $news->img;
 }

Если имя файла изображения не пусто, получим  имя файла превью, свяжем имена файлов с их директориями и удалим, если они существуют:

if (($editobject!='N')&&(!empty($delete_id))){
            $news-> find($delete_id);
            $filename   = $news->img;
                  if (!empty($filename)){
                    $temp = explode(".",$filename);
                    $delprevimg = $temp[0]."_prev.".$temp[1];
                    $delprevimg = getcwd().$IMAGE_DIR.$delprevimg;
                    $filename   = getcwd().$IMAGE_DIR.$filename;
                    if (file_exists($delprevimg)) @unlink($delprevimg);
                    if (file_exists($filename)) @unlink($filename);
                }
  } 

Удалим новость из базы и перенаправим браузер эту же страницу :  

$delete_id = getRequest('delete', 1);
    if (($editobject!='N')&& (!empty($delete_id))){
            $news-> find($delete_id);
            $filename   = $news->img;
                  if (!empty($filename)){
                    $temp = explode(".",$filename);
                    $delprevimg = $temp[0]."_prev.".$temp[1];
                    $delprevimg = getcwd().$IMAGE_DIR.$delprevimg;
                    $filename   = getcwd().$IMAGE_DIR.$filename;
                    if (file_exists($delprevimg)) @unlink($delprevimg);
                    if (file_exists($filename)) @unlink($filename);
                }
                $news-> delete($delete_id );
                Header("Location: /".$_page.'/?'.time());

                exit();
    }

Итоговый текст обрабочика списка новостей:

// заполнить массив раздела объектами (новостями)
    $thisdate = strtotime(gmdate('Y-m-d', time() + 86400));
    $news->select("`n`.`id`, LEFT(`n`.`text`,600) as `text`, `n`.img, `n`.title, `n`.`news_date`");
    $news->innerjoin("news_category nc", "`n`.id_category = `nc`.id");
    $news->Where("nc.lang = '?'", $lang);
    $news->AndWhere("n.pub_date < '$thisdate'");
    $news->andWhere("n.active != 'N'");
    $news->orderBy('news_date', 0); //сортировка: 0 от большей даты к меньшей , 1 - наоборот
    
    if (trim($newskod) != '')
    {
       $news->andWhere("`nc`.ident = '?'", $newskod);
    }
   
    $MANYPAGE = $news->pageNavigator($pagen);
    $newslist = $news->getList();
    unset($section->objects);
   
    foreach($newslist as $line)
    {
       $line['edit'] = " ";
       $notetext = $line['text'];
       $id = $line['id'];
      
        if ("[param30]" == 'N'){
            $line['date'] = date("d.m.Y H:i", $line['news_date']);
        } else {
            $lenr['date'] = date("d.m.Y", $line['news_date']);
        }
       
        $line['title'] = htmlspecialchars($line['title'], ENT_QUOTES);

        if (!empty($line['img']))
        {
            $_imnames = explode(".", $line['img']);
            $_image = $_imnames[0] . "_prev." . $_imnames[1];
            $line['image_prev'] = $IMAGE_DIR . $_image;
        }
        // ссылка на субстраницу, если есть подробный текст для новости
        $line['link'] = "<br><a class=\"newsLink\" href=\"/{$_page}/{$razdel}/sub1/id/{$id}/\">[param2]</a>";
       
        if (utf8_strlen($notetext) > $nchar && $nchar){
           echo $notetext = strip_tags($notetext);
            $notetext = str_replace("\n", ' ', $notetext);
            $line['text'] = se_LimitString($notetext, $nchar, ' ...');
        }
        $__data->setItemList($section,'objects', $line);
    }
   //удаление новости через панель редактрования
    $delete_id = getRequest('delete', 1);
    if (($editobject!='N')&& (!empty($delete_id))){
            $news-> find($delete_id);
            $filename   = $news->img;
                  if (!empty($filename)){
                    $temp = explode(".",$filename);
                    $delprevimg = $temp[0]."_prev.".$temp[1];
                    $delprevimg = getcwd().$IMAGE_DIR.$delprevimg;
                    $filename   = getcwd().$IMAGE_DIR.$filename;
                    if (file_exists($delprevimg)) @unlink($delprevimg);
                    if (file_exists($filename)) @unlink($filename);
                }
                $news-> delete($delete_id );
                Header("Location: /".$_page.'/?'.time());
                exit();    

Вернуться назад

Обработчик субстраницы просмотра новости

Обработчик страницы просмотра новостей достаточно прост. Если id не пустой, начинаем обработку:        

if (!empty($id))
        {
            $news->select("id, title, short_txt, text, img, active");
            $news->find($id);
        }

Здесь мы вновь получаем из базы объекты новостей и ищем нужный нам по id.

Далее проверяем параметр активности, и если он равен 'N', перенаправляем браузер.

if (!empty($id)){
            $news->select("id, title, short_txt, text, img, active");
            $news->find($id);

          
  if ($news->active == 'N') {
                header("Location: /".$_page);
            }

 }

Затем формируем заголовок страницы из заголовка новости. Текст новости проверяем на наличие тэгов, если они есть, то в переменную $news_text помещаем текст новости сразу, если их нет, то символ конца строки в тексте заменяем на тэг "<br>". 

if (!empty($id)){
            $news->select("id, title, short_txt, text, img, active");
            $news->find($id);
           
            if ($news->active == 'N') {
                header("Location: /".$_page);
             }
            
             $__data->page->titlepage = htmlspecialchars($news->title);           
            $news_title = $news->title;
            if (strpos($news->text,'<') !== false && strpos($news->text,'>') !== false){
                $news_text = $news->text;
            }
            else {
                $news_text = str_replace("\n","<br>", $news->text);
            }

 }

Добавим обработку изображения новости:

  if (!empty($id)){
            $news->select("id, title, short_txt, text, img, active");
            $news->find($id);
           
            if ($news->active == 'N') {
                header("Location: /".$_page);
             }
           
            $__data->page->titlepage = htmlspecialchars($news->title);           
            $news_title = $news->title;

            if (strpos($news->text,'<') !== false && strpos($news->text,'>') !== false){
                $news_text = $news->text;
            }
            else {
                $news_text = str_replace("\n","<br>", $news->text);
            }
       
            if ($news->img != ''){
                $news_img = '<img class="viewImage" alt="'.htmlspecialchars($news->title).'"
                src="'. $IMAGE_DIR . strval($news->img) . '" border="0">';
            }
            else {
                $news_img = '';
            }

Если изображение новости определено, то выводим его.
На этом обработка вывода новости завершена.

Вернуться назад

Обработчик субстраницы добавления/редактирования новости

Приступим к написанию обработчика добавления и редактирования новостей. Здесь нам так же необходимо сделать проверку прав пользователя на добавелние/редактирование новостей:

if ($editobject='N') return; 

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

if (!empty($id)){
        $news-> find($id);
        // формируем дату           
         $_time = explode(".",date("d.m.Y", $news->news_date));
                        
        //получаем содержание новости
        $_title     = $news->title;
        $_text      = $news->text;
        $filename   = $news->img;
}
else {
        // формируем дату
        $_time = explode(".",date("d.m.Y",time()));
}
//разбиваем дату
$_day  = $_time[0];
$_month  = $_time[1];
$_year  = $_time[2];

Далее опишем действия при схранении:

if (isset($_POST['Save'])){ //если нажата кнопка сохранить
            $flag     = true;
            $file     = false;          

    if (empty($_POST['day']) && $flag){ //если пуст день и установлен флаг
            $flag = false;
            $errortext ="[param10]"; //текст ошибки
    }

    if (empty($_POST['month']) && $flag){  //если пуст месц и установлен флаг

            $flag = false;
            $errortext = "[param9]"; //текст ошибки
    }

    if (empty($_POST['year']) && $flag){  //если пуст год и установлен флаг

            $flag = false;
            $errortext = "[param11]"; //текст ошибки
    }
    if (! checkdate (intval($_POST['month']), intval($_POST['day']), intval($_POST['year'])) && flag){ //если дата не прошла проверку
            $flag = false;
            $errortext = "[param12]"; //текст ошибки
    }
    if (empty($_POST['title']) && $flag){  //если пуст заголовок и установлен флаг
            $flag = false;
            $errortext = "[param8]"; //текст ошибки
    }
    if (empty($_POST['text']) && $flag){  //если пуст заголовок и установлен флаг
            $flag = false;
            $errortext = "[param7]"; //текст ошибки
    }
}

Обработаем загрузку картинки:
if (isset($_POST['Save'])){ //если нажата кнопка сохранить
            $flag     = true;
            $file     = false;          

    if (empty($_POST['day']) && $flag){ //если пуст день и установлен флаг
            $flag = false;
            $errortext = "[param10]"; //текст ошибки
    }

    if (empty($_POST['month']) && $flag){  //если пуст месц и установлен флаг

            $flag = false;
            $errortext = "[param11]"; //текст ошибки
    }

    if (empty($_POST['year']) && $flag){  //если пуст год и установлен флаг

            $flag = false;
            $errortext = "[param12]"; //текст ошибки
    }
    if (! checkdate (intval($_POST['month']), intval($_POST['day']), intval($_POST['year'])) && flag){ //если дата не прошла проверку
            $flag = false;
            $errortext = "[param8]"; //текст ошибки
    }
    if (empty($_POST['title']) && $flag){  //если пуст заголовок и установлен флаг
            $flag = false;
            $errortext = "[param7]";//текст ошибки
    }
    if (is_uploaded_file($_FILES['userfile']['tmp_name'])){ //если загружается картинка              
            $userfile = $_FILES['userfile']['tmp_name']; //передаем имя файла
            $userfile_size = $_FILES['userfile']['size']; // передаем размер файла
            $user = strtolower(htmlspecialchars($_FILES['userfile']['name'], ENT_QUOTES)); // очистим имя файла от специальных
                                                                                                                 
 //символов, кавычек и приведем к нижнему регистру
    }
}

Добавим проверку файла:

if (isset($_POST['Save'])){ //если нажата кнопка сохранить
            $flag     = true;
            $file     = false;          

    if (empty($_POST['day']) && $flag){ //если пуст день и установлен флаг
            $flag = false;
            $errortext = "[param10]";//текст ошибки
    }

    if (empty($_POST['month']) && $flag){  //если пуст месц и установлен флаг

            $flag = false;
            $errortext = "[param9]"; //текст ошибки
    }

    if (empty($_POST['year']) && $flag){  //если пуст год и установлен флаг

            $flag = false;
            $errortext = "[param12]"; //текст ошибки
    }
    if (! checkdate (intval($_POST['month']), intval($_POST['day']), intval($_POST['year'])) && flag){ //если дата не прошла проверку
            $flag = false;
            $errortext = "[param11]";//текст ошибки
    }
    if (empty($_POST['title']) && $flag){  //если пуст заголовок и установлен флаг
            $flag = false;
            $errortext ="[param8]"; //текст ошибки
    }
 if (empty($_POST['text']) && $flag){  //если пуст заголовок и установлен флаг
            $flag = false;
            $errortext ="[param7]"; //текст ошибки
    }
    if (is_uploaded_file($_FILES['userfile']['tmp_name'])){ //если загружается картинка              
            $userfile = $_FILES['userfile']['tmp_name']; //передаем имя файла
            $userfile_size = $_FILES['userfile']['size']; // передаем размер файла
            $user = strtolower(htmlspecialchars($_FILES['userfile']['name'], ENT_QUOTES)); // очистим имя файла от специальных
                                                                                                                  //символов, кавычек и приведем к нижнему регистру
           
//Проверяем с помощью регулярного выражения, что загруженный файл - картинка
            $sz = GetImageSize($userfile); //получим размер файла   
            if (preg_match("/([^.]+)\.(gif|jpåg|jpg|png)$/", $user, $m) && ($sz[2]==1 || $sz[2]==2 || $sz[2]==3)) {
                $extendfile = $m[2]; //получим расширение файла
            } else {
                    $errortext =  "[param13]";
                    $flag = false;
            }                 
            //Если размер файла больше заданного
            if ($userfile_size > 1024000){
                    $errortext = "[param14]";
                    $flag = false;
            }
            $file = true; //если файл  является картинкой и соответствует размеру, то переменной $file присовоим истину 
    
      }

}


Теперь обработам полученный данные в зависимости от того, были ли ошибки при редактировании/добавлении: 
 
if (isset($_POST['Save'])){
            $flag     = true;   //нет ошибки
            $file     = false;

    if (empty($_POST['day']) && $flag){
            $flag = false;
            $errortext =  "[param10]";
    }

    if (empty($_POST['month']) && $flag){
            $flag = false;
            $errortext = "[param9]";
    }

    if (empty($_POST['year']) && $flag){
            $flag = false;
            $errortext =  "[param11]";
    }
    if (!checkdate(intval($_POST['month']), intval($_POST['day']), intval($_POST['year'])) && flag){
            $flag = false;
            $errortext =  "[param12]";
    }
    if (empty($_POST['title']) && $flag){
            $flag = false;
            $errortext =  "[param8]";
    }
    if (empty($_POST['text']) && $flag){
            $flag = false;
            $errortext =  "[param7]";
    }
   
    // если загружается картинка
    if (is_uploaded_file($_FILES['userfile']['tmp_name'])){                    
            $userfile = $_FILES['userfile']['tmp_name'];
            $userfile_size = $_FILES['userfile']['size'];
            $user = strtolower(htmlspecialchars($_FILES['userfile']['name'], ENT_QUOTES));

            //Проверяем, что загруженный файл - картинка
            $sz = GetImageSize($userfile);   
            if (preg_match("/([^.]+)\.(gif|jpåg|jpg|png)$/", $user, $m) && ($sz[2]==1 || $sz[2]==2 || $sz[2]==3)) {
                $extendfile = $m[2];
            } else {
                    $errortext =  "[param13]";
                    $flag = false;
            }            
            //Если размер файла больше заданного
            if ($userfile_size > 1024000){
                    $errortext =  "[param14]";
                    $flag = false;
            }
            $file = true; 
    } //конец обработки картинки
   
    //  если была ошибка - нет одного из полей
    if (!$flag){ //очистим от специальных символов значения полей
            $_day        = htmlspecialchars($_POST['day']);
            $_month      = htmlspecialchars($_POST['month']);
            $_year       = htmlspecialchars($_POST['year']);
            $_title      = htmlspecialchars($_POST['title']);
            $_text       = htmlspecialchars($_POST['text']);
    }
    else{ //если ошибок не было
            $time = mktime(date("G"),date("i"),date("s"), $_POST['month'],$_POST['day'],$_POST['year']);
            $title  = $_POST['title'];
            $text   = $_POST['text'];                  
            $imgname  = 'news'.$time;
            // если картинка есть
            if ($file){ 
                    $uploadfile     = getcwd().$IMAGE_DIR . $imgname . ".".$extendfile;
                    $uploadfileprev = getcwd().$IMAGE_DIR . $imgname . "_prev.".$extendfile;
                    $filename       = $imgname . '.' . $extendfile;
                
                     if ($sz[0]>$width){ //если ширина картинки превышает указанную в параметрах
                            $uploadfiletmp  = getcwd().$IMAGE_DIR . $imgname . ".temp";
                            move_uploaded_file($userfile, $uploadfiletmp);
                            ImgCreate($uploadfileprev,$uploadfile,$uploadfiletmp, $extendfile, $width, $thumbwdth);
                            @unlink($uploadfiletmp);
                    }
                else{
                            move_uploaded_file($userfile, $uploadfile);
                            ThumbCreate($uploadfileprev,$uploadfile, $extendfile,$thumbwdth);
                }
            }            
        } // конец if(!$flag)
}

При загрузке картинки мы обработали ее функциями ImgCreate и ThumbCreate подключенной нами в предобработке библиотеки - эти функции "подгоняют" загружаемое изображение под нужные размеры файла превью и основной картинки новости. Функция mktime() возвращает метку времени для заданной даты.

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

if (isset($_POST['Save'])){
            $flag     = true;   //нет ошибки
            $file     = false;

    if (empty($_POST['day']) && $flag){
            $flag = false;
            $errortext =  "[param10]";
    }

    if (empty($_POST['month']) && $flag){
            $flag = false;
            $errortext = "[param9]";
    }

    if (empty($_POST['year']) && $flag){
            $flag = false;
            $errortext =  "[param11]";
    }
    if (!checkdate(intval($_POST['month']), intval($_POST['day']), intval($_POST['year'])) && flag){
            $flag = false;
            $errortext =  "[param12]";
    }
    if (empty($_POST['title']) && $flag){
            $flag = false;
            $errortext =  "[param8]";
    }
    if (empty($_POST['text']) && $flag){
            $flag = false;
            $errortext =  "[param7]";
    }
   
    // если загружается картинка
    if (is_uploaded_file($_FILES['userfile']['tmp_name'])){                    
            $userfile = $_FILES['userfile']['tmp_name'];
            $userfile_size = $_FILES['userfile']['size'];
            $user = strtolower(htmlspecialchars($_FILES['userfile']['name'], ENT_QUOTES));

            //Проверяем, что загруженный файл - картинка
            $sz = GetImageSize($userfile);
            if (preg_match("/([^.]+)\.(gif|jpеg|jpg|png)$/", $user, $m) && ($sz[2]==1 || $sz[2]==2 || $sz[2]==3)) {
                $extendfile = $m[2];
            } else {
                    $errortext =  "[param13]";
                    $flag = false;
            }                 
            //Если размер файла больше заданного
            if ($userfile_size > 1024000){
                    $errortext =  "[param14]";
                    $flag = false;
            }
            $file = true; 
    } //конец обработки картинки
   
    //  если была ошибка - нет одного из полей
    if (!$flag){
            $_day        = htmlspecialchars($_POST['day']);
            $_month      = htmlspecialchars($_POST['month']);
            $_year       = htmlspecialchars($_POST['year']);
            $_title      = htmlspecialchars($_POST['title']);
            $_text       = htmlspecialchars($_POST['text']);
    }
    else{
            $time = mktime(date("G"),date("i"),date("s"), $_POST['month'],$_POST['day'],$_POST['year']);
            $title  = $_POST['title'];
            $text   = $_POST['text'];                  
            //$imgname  = 'news'.time();
            $imgname = 'news'.$time;
                   
            // если картинка есть
            if ($file){ 
                    $uploadfile     = getcwd().$IMAGE_DIR . $imgname . ".".$extendfile;
                    $uploadfileprev = getcwd().$IMAGE_DIR . $imgname . "_prev.".$extendfile;
                    $filename       = $imgname . '.' . $extendfile;
                
                     if ($sz[0]>$width){
                            $uploadfiletmp  = getcwd().$IMAGE_DIR . $imgname . ".temp";
                            move_uploaded_file($userfile, $uploadfiletmp);
                            ImgCreate($uploadfileprev,$uploadfile,$uploadfiletmp, $extendfile, $width, $thumbwdth);
                            @unlink($uploadfiletmp);
                    }
                else{
                            move_uploaded_file($userfile, $uploadfile);
                            ThumbCreate($uploadfileprev,$uploadfile, $extendfile,$thumbwdth);
                }
            }                                       
            if(empty($id)){ //при добавлении новости
                    $cat_name = "[param20]"; //получим имя категории из настроек модуля
                    $newscat = new seTable('news_category', 'nc'); //свяжем $newscat  с таблицей категорий
                    $newscat->where("nc.ident='$cat_name'"); // ищем нужную нам категорию
                    $newscat->fetchOne(); //получаем данные в массив
                    $id_cat = $newscat->id; // помещаем id найденной категории в $id_cat
                                 
                    if (!$id_cat){//если категория новости не найдена, создадим новую
                            $newscat->ident   = $cat_name;
                            $newscat->title   = $cat_name;
                            $newscat->lang    = $lang;
                            $id_cat = $newscat->save();
                    }               
                    $news->insert(); // укажем, что будет добавление
                    $news->id_category = $id_cat; // укажем новости категорию
           }
           else {
                $news->find($id);  //при редактировании новости найдем ее по id
           }        
           // определим переменные
           $news->news_date      = $time;
           $news->pub_date       = $time;
           $news->title          = $title;
           $news->text           = $text;
           $news->img            = $filename;
           //сохраним данные
           $news->save();
           Header("Location: /".$_page); 
        
        } // конец if(!$flag)
} //конец сохранения

Общий код обработчика:

if ($editobject=='N') return;  
     // редактирование новости
if (!empty($id)){
        $news-> find($id);
        // формируем дату           
         $_time = explode(".",date("d.m.Y", $news->news_date));
                        
        //получаем содержание новости
        $_title     = $news->title;
        $_text      = $news->text;
        $filename   = $news->img;
}
else {
        // формируем дату
        $_time = explode(".",date("d.m.Y",time()));
}
//разбиваем дату
$_day  = $_time[0];
$_month  = $_time[1];
$_year  = $_time[2];

//сохранение
if (isset($_POST['Save'])){
            $flag     = true;   //нет ошибки
            $file     = false;

    if (empty($_POST['day']) && $flag){
            $flag = false;
            $errortext =  "[param10]";
    }

    if (empty($_POST['month']) && $flag){
            $flag = false;
            $errortext = "[param9]";
    }

    if (empty($_POST['year']) && $flag){
            $flag = false;
            $errortext =  "[param11]";
    }
    if (!checkdate(intval($_POST['month']), intval($_POST['day']), intval($_POST['year'])) && flag){
            $flag = false;
            $errortext =  "[param12]";
    }
    if (empty($_POST['title']) && $flag){
            $flag = false;
            $errortext =  "[param8]";
    }
    if (empty($_POST['text']) && $flag){
            $flag = false;
            $errortext =  "[param7]";
    }
   
    // если загружается картинка
    if (is_uploaded_file($_FILES['userfile']['tmp_name'])){                    
            $userfile = $_FILES['userfile']['tmp_name'];
            $userfile_size = $_FILES['userfile']['size'];
            $user = strtolower(htmlspecialchars($_FILES['userfile']['name'], ENT_QUOTES));

            //проверяем, что загруженный файл - картинка
            $sz = GetImageSize($userfile);
            if (preg_match("/([^.]+)\.(gif|jpеg|jpg|png)$/", $user, $m) && ($sz[2]==1 || $sz[2]==2 || $sz[2]==3)) {
                $extendfile = $m[2];
            } else {
                    $errortext =  "[param13]";
                    $flag = false;
            }                 
            //если размер файла больше заданного
            if ($userfile_size > 1024000){
                    $errortext =  "[param14]";
                    $flag = false;
            }
            $file = true; 
    } //конец обработки картинки
   
    //  если была ошибка - нет одного из полей
    if (!$flag){
            $_day        = htmlspecialchars($_POST['day']);
            $_month      = htmlspecialchars($_POST['month']);
            $_year       = htmlspecialchars($_POST['year']);
            $_title      = htmlspecialchars($_POST['title']);
            $_text       = htmlspecialchars($_POST['text']);
    }
    else{
            $time = mktime(date("G"),date("i"),date("s"), $_POST['month'],$_POST['day'],$_POST['year']);
            $title  = $_POST['title'];
            $text   = $_POST['text'];                  
            //$imgname  = 'news'.time();
            $imgname = 'news'.$time;
                   
            // если картинка есть
            if ($file){ 
                    $uploadfile     = getcwd().$IMAGE_DIR . $imgname . ".".$extendfile;
                    $uploadfileprev = getcwd().$IMAGE_DIR . $imgname . "_prev.".$extendfile;
                    $filename       = $imgname . '.' . $extendfile;
                
                     if ($sz[0]>$width){
                            $uploadfiletmp  = getcwd().$IMAGE_DIR . $imgname . ".temp";
                            move_uploaded_file($userfile, $uploadfiletmp);
                            ImgCreate($uploadfileprev,$uploadfile,$uploadfiletmp, $extendfile, $width, $thumbwdth);
                            @unlink($uploadfiletmp);
                    }
                else{
                            move_uploaded_file($userfile, $uploadfile);
                            ThumbCreate($uploadfileprev,$uploadfile, $extendfile,$thumbwdth);
                }
            }                                       
            if(empty($id)){
                    //при добавлении
                    $cat_name = "[param20]";
                    $newscat = new seTable('news_category', 'nc');
                    $newscat->where("nc.ident='$cat_name'");
                    $newscat->fetchOne();
                    $id_cat = $newscat->id;
                                 
                    if (!$id_cat){
                            $newscat->ident   = $cat_name;
                            $newscat->title   = $cat_name;
                            $newscat->lang    = $lang;
                            $id_cat = $newscat->save();
                    }               
                    $news->insert();
                    $news->id_category = $id_cat;
           }
           else {
                $news->find($id);  //при редактировании найдем новость по ее id
           }
                   
           $news->news_date      = $time;
           $news->pub_date       = $time;
           $news->title          = $title;
           $news->text           = $text;
           $news->img            = $filename;
           $news->save();
           Header("Location: /".$_page);             
        } // конец if(!$flag)
} //конец сохранения

Вернуться назад

Тестирование модуля

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

Модуль новостей в работе без записей

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

Модуль новостей в работе, режим модерации

Чтобы видеть, какие ошибки на странице присутствуют, в адресной строке допишем "?err_rep", теперь мы видим сообщения - различные "notice" и "warning":

Сообщение содержит указание на строку кода модуля, где происходит сбой. При выгрузке модуля из Редактора на Сервер

Выгрузка модуля на сервер из Редактора модулей

в окне Редактора появится новая вкладка "Test". На эту страницу и ссылаются диагоностические сообщения со страницы сайта.

Наши сообщения (сообщения, связанные с работой модуля, выделены):

Notice: Undefined variable: objecttitle in /admin/update/business/3.9.1/www/lib/modules/mdl_mshop_special.php on line 200

Notice: Undefined variable: objectnote in /admin/update/business/3.9.1/www/lib/modules/mdl_mshop_special.php on line 211

Notice: Undefined variable: objecttext in /admin/update/business/3.9.1/www/lib/modules/mdl_mshop_special.php on line 213

Notice: Undefined index: group in /admin/update/business/3.9.1/www/system/main/classes/seData.class.php on line 162

Notice: Trying to get property of non-object in /admin/update/business/3.9.1/www/system/main/classes/seData.class.php on line 116

Notice: Undefined variable: news_title in /account/123test.e-stile.ru/www/modules/mdl_monlinenews3.php on line 363

Notice: Undefined variable: news_img in /account/123test.e-stile.ru/www/modules/mdl_monlinenews3.php on line 366

Notice: Undefined variable: news_text in /account/123test.e-stile.ru/www/modules/mdl_monlinenews3.php on line 369

Notice: Undefined variable: errortext in /account/123test.e-stile.ru/www/modules/mdl_monlinenews3.php on line 383

Notice: Undefined variable: _day in /account/123test.e-stile.ru/www/modules/mdl_monlinenews3.php on line 386

Notice: Undefined variable: _month in /account/123test.e-stile.ru/www/modules/mdl_monlinenews3.php on line 387

Notice: Undefined variable: _year in /account/123test.e-stile.ru/www/modules/mdl_monlinenews3.php on line 392

Notice: Undefined variable: _title in /account/123test.e-stile.ru/www/modules/mdl_monlinenews3.php on line 399

Notice: Undefined variable: _text in /account/123test.e-stile.ru/www/modules/mdl_monlinenews3.php on line 420

Notice: Undefined index: group in /admin/update/business/3.9.1/www/system/main/classes/seData.class.php on line 162

Warning: Cannot modify header information - headers already sent by (output started at /admin/update/business/3.9.1/www/lib/modules/mdl_mshop_special.php:200) in /admin/update/business/3.9.1/www/index.php on line 61

Warning: Cannot modify header information - headers already sent by (output started at /admin/update/business/3.9.1/www/lib/modules/mdl_mshop_special.php:200) in /admin/update/business/3.9.1/www/index.php on line 62

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

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

После тестирования и отлaдки модуль готов к внедрению. Не забудьте защитить модуль паролем!

Вернуться назад
 
Copyright © Edgestile Company, 2004-09
тел.:  8 (495) 229-45-50, 8 (812) 777-01-30, 8 (34241) 3-69-90
e-mail:  info@siteedit.ru - общие вопросы
icq: 268-447-867 - общие вопросы
все контакты