Друзья, как и обещал, продолжаю цикл уроков статьей про создание виджетов. Быть может кто-нибудь еще не до конца понимает смысл этого слова, поэтому давайте обозначим понятие для всех. Виджет — это функциональный блок сайта, который несет минимальную смысловую нагрузку. Виджеты живут в боковой панели или, как ее принято назвать, в сайдбаре (от англ. «sidebar» — боковая панель). Система управления сайтами cogear предоставляет необходимый набор виджетов в базовой комплектации: «Сообщества», «Кто сейчас на сайте», «Комментарии», «Облако тегов», «Поиск». Тем не менее вы вольны создавать собственные виджеты для наращивания функционала вашего сайта.- Код виджета, представленный функцией следующего вида (условимся называть виджет top_users):
/** * Top users widget * * @param object $CI * @param object $config * @return string */ function top_users_widget($CI,$config){ .... if($config->some_param){ $data = $CI->db->get('some_table'); } ... return "Обратно отдается строка, которая по сути и является виджетом"; } - Файл конфигурации виджета. Опционально.
some_param = TRUE - Языковые переменные виджета. Входят в языковой файл шестеренки.
Файл с кодом виджета
Создаем папку "/gears/points/widgets/" и в ней — файл "/gears/points/widgets/top_users.php". Обратите внимание, что файл должен иметь точно такое же имя, как и сам виджет.Функционал виджета прост — берем данные об n (определяется параметром в файле конфигурации) пользователях и выводим их в табличке. Попутно кешируем данные на определенное время, например, на 1 час.
<?php
/**
* Users rating widget
*
* @author Dmitriy Belyaev <admin@cogear.ru>
* @copyright Copyright © 2009, Dmitriy Belyeav
* @license http://cogear.ru/license.html
* @link http://cogear.ru
* @package Points
* @version $Id$
*/
/**
* Top users widget
*
* @param object $CI
* @param object $config
* @return string
*/
function top_users_widget($CI,$config){
$top_users = retrieve('sidebar/widgets/top_users');
if($top_users === FALSE){
$users = $CI->db->select('users.name,users.url_name,users.points,users.avatar')->limit($config->limit)->order_by('points','desc')->get('users')->result();
$output = array();
foreach($users as $user){
$CI->breadcrumb->set('sidebar/widgets/top_users')->data($user);
$avatar = make_icons($user->avatar);
$CI->breadcrumb->add('<td align="center"><a href="'.l('/user/'.$user->url_name).'"><img src="'.$avatar['24x24'].'" width="24" border="0" alt="'.$user->name.'" class="avatar"></a></td>');
$CI->breadcrumb->add('<td align="center"><a href="'.l('/user/'.$user->url_name).'">'.$user->name.'</a></td>');
$class = $user->points >= 0 ? ($user->points > 0 ? 'good' : 'zero') : 'bad';
$CI->breadcrumb->add('<td align="center"><span class="'.$class.'">'.$user->points.'</td>');
$output[] = '<tr>'.$CI->breadcrumb->compile().'</tr>';
}
$top_users = '<table cellpadding="0" cellspacing="5" width="100%" border="0">
<thead><tr><td></td><td align="center">'.t('gears user').'</td><td align="center">'.t('points top_rating').'</td></tr></thead>
'.implode('',$output).'
</table>';
$top_users .= '<p style="margin:0 5px;" align="right"><small><a href="'.l('/points/').'">'.t('points show_all').'</a></small></p>';
store('sidebar/widgets/top_users',$top_users,3600);
}
return $top_users;
} Файл конфигурации
Здесь все просто — нам требуется лишь один параметр, количество пользователей, отображаемых в табличке.Создадим файл "/gears/points/widgets/top_users.info" со следующим содержимым:
limit = 10
Языковые переменные
Добавим пару строчек в файл "/gears/points/lang/ru.lng".
...
[points]
...
show_all = "все пользователи"
...
[widgets]
top_users = "Рейтинг пользователей"
Заключение
Собственно все. Не забудьте сделать виджет активным в панели управления.


и в активных тоже