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
|