WebGUI хостинг Документация по WebGUI Запустить персональную демо версию Форум
WebGUI по-русски

WebGUI по-русски

SQL отчёт

 

SQL report

Автор статьи: Владимир Витковский

www.webgui.uanet.biz, www.transport.su
При перепечатке ссылка на оригинал обязательна  

WebGUI - это инструмент,  позволяющий не имея специальных навыков самостоятельно создать сайт, который может иметь произвольную структуру, настаиваемый внешний вид и множество функциональных возможностей.

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

Один из модулей, который открывает широкие возможности профессионалам - это SQLreport (SQL отчёт).

Для того, чтобы воспользоваться им Вам необходимо знание структуры базы данных WebGUI и навыки в составлении SQL запросов. Вы можеете в один экземпляр модуля включить до 5 запросов, при этом каждый последующий запрос может использовать данные, полученные при выполнении всех предыдущих. Данные из запроса в запрос передаются с помощью плейсхолдеров. Каждый последующий запрос выполняется каждый раз при обработке предыдущим одной записи. Другими словами, если первый запрос получил три строки результатов, то второй запрос выпоолняется 3 раза (по результатам каждой из строк).

Полученные результаты  могут подставляться в отображаемую страницу с помощью переменных шаблона модуля SQLreport.

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

Ниже предостаавлены несколько примеров практического прменения.

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

"Последние обсуждения на форумах" для версий 6.2.11 и 6.8.*
Позволяет показывать последние высказывания сразу с нескольких форумов, обсуждения статей и новостей.

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

  • Тема обсуждения
  • Имя пользователя
  • Дата и время ответа
  • Ссылка на текст сообщения

"Последние новости" для версий 6.2.11 и 6.8.*
Позволяет отображать последние новости сразу с нескольких новостных лент сайта.

По каждой из последних новостей выводится информация:

  • Заголовок новости
  • Название новостного раздела
  • Краткое описание
  • Миниатюра присоединённого изображения (если есть)
  • Ссылка на полный текст новости

"Последние обсуждения на форумах" для версии 6.2.11

SQL запрос:

SELECT
  forumPost.forumPostId as forumPostId,
  forumPost.dateOfPost as dateOfPost,
  forumPost.username as username,
  forumPost.subject as subject,
  forumPost.forumThreadId as forumThreadId,
  forumThread.forumId as forumId,
  page.urlizedTitle as urlizedTitle,
  wobject.wobjectId as wobjectId
FROM
  forumPost
LEFT JOIN
forumThread
ON
forumThread.forumThreadId=forumPost.forumThreadId
 
LEFT JOIN
MessageBoard_forums
ON
MessageBoard_forums.forumId=forumThread.forumId

LEFT JOIN
USS_submission
ON
USS_submission.forumId=forumThread.forumId

LEFT JOIN
wobject
ON
wobject.wobjectId=MessageBoard_forums.wobjectId OR
wobject.forumId=forumThread.forumId
LEFT JOIN
page
ON
page.pageId=wobject.pageId OR
page.pageId=USS_submission.pageId
WHERE
  forumPost.status = "approved"
 AND page.groupIdView = "7"
ORDER BY
  forumPost.dateOfPost desc
limit 3

Шаблон:

<a name="<tmpl_var assetId>"></a>
<tmpl_if session.var.adminOn>
 <p><tmpl_var controls></p>
</tmpl_if> 
  <tmpl_if displayTitle>
    <h1><tmpl_var title></h1>
</tmpl_if>

<tmpl_if description>
    <tmpl_var description><p />
</tmpl_if>


<tmpl_if debugMode>
 <ul>
 <tmpl_loop debug_loop>
  <li><tmpl_var debug.output></li>
 </tmpl_loop>
 </ul>
</tmpl_if>


<table width="95%" cellpadding=2 cellspacing=1 border=0>

<tmpl_loop rows_loop>

<tr><td>

<a href="/<tmpl_var row.field.urlizedTitle.value>?func=view&wid=<tmpl_var row.field.wobjectId.value>&forumId=<tmpl_var row.field.forumId.value>&forumOp=viewThread&forumPostId=<tmpl_var row.field.forumPostId.value>#<tmpl_var row.field.forumPostId.value>"><div class="tableHeader"><tmpl_var row.field.subject.value></div></a>
Написал: <tmpl_var row.field.username.value><br /> (^ DateTime(<tmpl_var row.field.dateOfPost.value>);)
<p/>
</td></tr>

</tmpl_loop>

</table>
<tmpl_if pagination.pageCount.isMultiple>
  <div class="pagination">
    <tmpl_var pagination.previousPage>   <tmpl_var pagination.pageList.upTo20>  <tmpl_var pagination.nextPage>
  </div>
</tmpl_if>

"Последние новости" для версии 6.2.11

SQL запрос:

SELECT
page.title as pageTitle,
page.urlizedTitle as urlizedTitle,
wobject.title as wobjectTitle,
USS_submission.title,
USS_submission.dateSubmitted as dateSubmitted,
USS.wobjectId,
USS_submission.USS_submissionId,
USS_submission.image,
USS_submission.userDefined1
FROM
USS_submission
LEFT JOIN
USS
ON
USS_submission.USS_Id=USS.USS_Id
LEFT JOIN
wobject
ON
USS.wobjectId=wobject.wobjectId
LEFT JOIN
page
ON
USS_submission.pageId=page.pageId
WHERE
wobject.wobjectId in ("XXXXXXXXXXXXXXXXXXXXXX","YYYYYYYYYYYYYYYYYYYYYY")
# в скобках вместо иксов и игреков проставьте ID повостных лент, с которых вы хотите получать сообщения
# Если Вы хотите получать со всех без исключения, то эту строчку можно убрать.
ORDER BY
USS_submission.dateSubmitted desc
LIMIT 3

Шаблон:

<a name="<tmpl_var assetId>"></a>
<tmpl_if session.var.adminOn>
 <p><tmpl_var controls></p>
</tmpl_if> 
  <tmpl_if displayTitle>
    <h1><tmpl_var title></h1>
</tmpl_if>

<tmpl_if description>
    <tmpl_var description><p />
</tmpl_if>


<tmpl_if debugMode>
 <ul>
 <tmpl_loop debug_loop>
  <li><tmpl_var debug.output></li>
 </tmpl_loop>
 </ul>
</tmpl_if>


<table width="95%" cellpadding=2 cellspacing=1 border=0>

<tmpl_loop rows_loop>

<tr><td>

<a href="<tmpl_var row.field.urlizedTitle.value>"><div class="tableHeader"><tmpl_var row.field.pageTitle.value></div></a>
 <tmpl_if row.field.image.value>
    <a href="<tmpl_var row.field.urlizedTitle.value>"><img class="thumbnail" vspace="5" hspace="15"
 src="/uploads/<tmpl_var row.field.wobjectId.value>/<tmpl_var row.field.USS_submissionId.value>/thumb-<tmpl_var row.field.image.value>" border="0" align="left"/></a>
   </tmpl_if>
<tmpl_var row.field.userDefined1.value>

<div align="left">
^ DateTime(<tmpl_var row.field.dateSubmitted.value>);</div>
(<tmpl_var row.field.wobjectTitle.value>)
<div align="right">  ( <a href="<tmpl_var row.field.urlizedTitle.value>">Подробнее</a>
         )</div><p />
</td></tr>

</tmpl_loop>

</table>
<tmpl_if pagination.pageCount.isMultiple>
  <div class="pagination">
    <tmpl_var pagination.previousPage>   <tmpl_var pagination.pageList.upTo20>  <tmpl_var pagination.nextPage>
  </div>
</tmpl_if>

"Последние обсуждения на форумах" для версии 6.8.*

SQL запрос:

SELECT
assetData.url,
assetData.title,
assetData.assetId,
assetData.groupIdView,
Post.username,
Post.dateUpdated,
assetData.status,
Post.assetId,
assetData.revisionDate,
asset.state
FROM
assetData
LEFT JOIN
Post ON assetData.assetId=Post.assetId
LEFT JOIN
asset ON assetData.assetId=asset.assetId
WHERE status = 'approved'
AND asset.state = 'published'
AND !(assetData.url LIKE 'news/%' AND asset.className = 'WebGUI::Asset::Post::Thread')
AND !(assetData.url LIKE 'photos/%' AND asset.className = 'WebGUI::Asset::Post::Thread')
# Внимание! Предыдущие две строчки измените в соответствии с содержимым Вашего сайта
AND assetData.groupIdView = 7
AND assetData.revisionDate=(SELECT max(assetData.revisionDate) FROM assetData WHERE assetData.assetId=asset.assetId)
AND Post.revisionDate=assetData.revisionDate
GROUP BY assetData.assetId, Post.assetId
ORDER BY Post.dateUpdated DESC
LIMIT 5

Шаблон:

<a name="<tmpl_var assetId>"></a>
<tmpl_if session.var.adminOn>
 <p><tmpl_var controls></p>
</tmpl_if> 
  <tmpl_if displayTitle>
    <h1><tmpl_var title></h1>
</tmpl_if>

<tmpl_if description>
    <tmpl_var description><p />
</tmpl_if>


<tmpl_if debugMode>
 <ul>
 <tmpl_loop debug_loop>
  <li><tmpl_var debug.output></li>
 </tmpl_loop>
 </ul>
</tmpl_if>


<table width="95%" cellpadding=2 cellspacing=1 border=0>

<tmpl_loop rows_loop>

<tr><td>

<a href="/<tmpl_var row.field.url.value>#<tmpl_var row.field.assetId.value>"><div class="tableHeader"><tmpl_var row.field.title.value></div></a>
Написал: <b><tmpl_var row.field.username.value></b><br /> (^ D("%D.%m.%y %j:%m",<tmpl_var row.field.dateUpdated.value>);)
<p/>
</td></tr>

</tmpl_loop>

</table>
<tmpl_if pagination.pageCount.isMultiple>
  <div class="pagination">
    <tmpl_var pagination.previousPage>   <tmpl_var pagination.pageList.upTo20>  <tmpl_var pagination.nextPage>
  </div>
</tmpl_if>

"Последние новости" для версии 6.8.*

SQL запрос:

SELECT
assetData.url,
assetData.title,
assetData.assetId,
assetData.groupIdView,
assetData.synopsis,
Post.storageId,
Post.dateSubmitted,
assetData.status,
Post.assetId,
assetData.revisionDate,
asset.state,
asset.parentId,
p.title AS parent
FROM assetData
LEFT JOIN
Post ON assetData.assetId=Post.assetId
LEFT JOIN
asset ON assetData.assetId=asset.assetId
LEFT JOIN
assetData AS p ON p.assetId = asset.parentId
WHERE assetData.status = 'approved'
AND asset.state = 'published'
AND asset.className = 'WebGUI::Asset::Post::Thread'
AND (assetData.url LIKE 'news/%' OR assetData.url LIKE 'photos/%')
# Предыдущую строчку следует изменить в зависимости от реальных путей у Вас на сайте.
AND assetData.groupIdView = 7
AND assetData.revisionDate=(SELECT MAX(assetData.revisionDate) FROM assetData WHERE assetData.assetId=asset.assetId)
AND Post.revisionDate=assetData.revisionDate
GROUP BY assetData.assetId, Post.assetId
ORDER BY Post.dateSubmitted DESC
LIMIT 5

Шаблон:

<a name="<tmpl_var assetId>"></a>
<tmpl_if session.var.adminOn>
 <p><tmpl_var controls></p>
</tmpl_if> 
  <tmpl_if displayTitle>
    <h1><tmpl_var title></h1>
</tmpl_if>

<tmpl_if description>
    <tmpl_var description><p />
</tmpl_if>


<tmpl_if debugMode>
 <ul>
 <tmpl_loop debug_loop>
  <li><tmpl_var debug.output></li>
 </tmpl_loop>
 </ul>
</tmpl_if>


<table width="95%" cellpadding=2 cellspacing=1 border=0>

<tmpl_loop rows_loop>
<tr><td>

<a href="/<tmpl_var row.field.url.value>#<tmpl_var row.field.assetId.value>"><div class="tableHeader"><tmpl_var row.field.title.value></div></a>
    <a href="/<tmpl_var row.field.url.value>#<tmpl_var row.field.assetId.value>"><img class="thumbnail" vspace="5" hspace="15"
 src="^ ThumbURL(<tmpl_var row.field.storageId.value>);" border="0" align="left"/></a>
<div align="justify">
<tmpl_var row.field.synopsis.value>
</div><br>

<div align="left">
^ D("%D.%m.%y %j:%m",<tmpl_var row.field.dateSubmitted.value>);</div>
(<b>Раздел:</b> <i><tmpl_var row.field.parent.value></i>)
<div align="right">  ( <a href="/<tmpl_var row.field.url.value>#<tmpl_var row.field.assetId.value>">Подробнее</a>)</div><p />
</td></tr>
</tmpl_loop>
</table>
<tmpl_if pagination.pageCount.isMultiple>
  <div class="pagination">
    <tmpl_var pagination.previousPage>   <tmpl_var pagination.pageList.upTo20>  <tmpl_var pagination.nextPage>
  </div>
</tmpl_if>

Дополнительный макрос "ThumbURL":

package WebGUI::Macro::ThumbURL;

use strict;
use WebGUI::Session;
use WebGUI::Storage;
use WebGUI::Storage::Image;

#-------------------------------------------------------------------
sub process {
 my $storageId = shift;

 my $storage = WebGUI::Storage::Image->get($storageId);

 my $url;
 foreach my $filename (@{$storage->getFiles}) {
  if ($storage->isImage($filename)) {
   $url = $storage->getThumbnailUrl($filename);
   last;
  }
 }
  if ($url eq '')  {$url = '/extras/spacer.gif';}
 return  $url;
}
1;




На сайте установлена версия WebGUI:
7.8.24