Друзья, данной статьей открываю новое сообщество. Как вы уже догадались, в нем будут публиковаться «туториалы» (от англ. «tutorials»), т.е. уроки.Как и обещал, но несколько ранее, мы с вами вместе создадим систему рейтингов и фильтрации контента, чему будет посвящен цикл статей.
Первым делом внесем изменения в уже существующую шестеренку «index».
Создадим поле «promoted» типа «enum» (два возможных значения — true и NULL). Можно, конечно, было использовать тип «tinyint», но нам лишние значения не нужны — только все самое необходимое. Также создадим индекс на данном поле для того, чтобы база данных отдавала предпочтение хранению информацию в оперативной памяти более, чем на диске.
ALTER TABLE `nodes` ADD `promoted` ENUM( 'true' ) NULL AFTER `published` ,
ADD INDEX ( `promoted` )
Обратимся к контроллеру "/gears/index/index.php" и добавим новое условие выборки на 68 (для счетчиков) и 77 (для запроса) строки.$this->db->where('promoted','true');
Теперь было бы здорово дать администратору возможность снимать и назначать топики на главную страницу вручную.Для этого добавим после заголовка «галочку», видимую лишь тем пользователям, которым это будет разрешено через шестеренку «Права доступа» (админу можно все).
Откроем файл хуков "/gears/index/_hooks.php". Создадим новый хук в виде функции «index_breadcrumb_compile_». Заголовок топика представлен моделью «хлебных крошек» для того, чтобы обеспечить расширяемость, и мы этим воспользуемся.
Название хука состоит из трех частей:
- index — хуком заведует шестеренка «index».
- breadcrumb — хук адресован модели (суффикс "_" в конце названия функции указывает на то, что хук действует на модель) «хлебных крошек».
- compile — хук действует на метод compile (в классе он назван _compile для обеспечения возможности работы с хуками).
Также обратимся к модели ноды "/gears/nodes/models/node.php" с целью выяснить, какое имя носит объект «breadcrumb», участвующий в создании заголовка топика.
/**
* Add checkbox to node title breadcrumb
*
* @param object Breadcrumb
* @return void
*/
function index_breadcrumb_compile_($Breadcrumb){
if($Breadcrumb->name == 'node_title' && acl('index promote')){
$node =& $Breadcrumb->data;
// If node is already on index page — checbox will be checked
$value = empty($node->promoted) ? '' : 'value="checked"';
$Breadcrumb->add('<input type="checkbox" class="index-promote" id="index-promote-'.$node->id.'"'.$value.'>');
}
}
Отлично, около названия топика появился checkbox, причем с главной все топики исчезли.
Теперь следует прицепить на клик по чекбоксу скрипт и добавить языковую переменную.
Откроем файл "/gears/index/lang/ru.lng" и добавим строчки:
[acl]
promote = "Выводить топики на главную"
Помните, что все изменения в языковых файлах фиксируются автоматически при отключенном кеше.Создадим файл "/gears/index/js/promote.js", который будет ответственным по данному вопросу.
window.addEvent('domready',function(){
$$('input.index-promote').each(function(checkbox){
checkbox.addEvent('click',function(){
var nid = this.get('id').split('-').getLast();
new Request.JSON({
url: "/ajax/index/promote/",
data: 'nid='+nid,
method: 'post',
onComplete: function(re){
msg(re.msg);
}
}).post();
});
});
});
Помните, что js-файлы также подключаются автоматически.Конечно, данный запрос кто-то должен обрабатывать, поэтому добавим метод «promote» в контроллер "/gears/index/index.php".
/**
* Promote node to index
*
* @return json
*/
public function promote(){
// Check access level
if(!acl('index promote')) return _403();
// Catch node id and some kind of filter it
$nid = (int)$this->input->post('nid');
// Predefine results in case of errors
$success = FALSE;
$msg = t('promote_error');
// Get node
if($node = $this->db->get_where('nodes',array('id'=>$nid))->row()){
// Set i18n section/department
d('index');
$promote = empty($node->promoted) ? 'true' : NULL;
if($this->db->update('nodes',array('promoted'=> $promote),array('id'=>$node->id))){
$this->cache->tags('nodes/'.$node->id)->clear();
$success = TRUE;
$msg = empty($promote) ? t('depromoted') : t('promoted');
}
}
ajax($success,$msg);
}
Обновим языковой файл.[acl]
promote = "Выводить топики на главную"
always_on_index = "Топики пользователя всегда выводятся на главную"
[index]
promoted = "Топик отправлен на главную страницу."
depromoted = "Топик снят с главной страницы."
promote_error = "Не удалось изменить статус топика."
Последний штрих — сделаем так, чтобы топики админа и других пользователей, обладающих соответствующими правами, всегда выводились на главную. Для этого создадим хук, который будет срабатывать при сохранении данных формой создания топика.
/**
* Add node to index after topic is created
*
* @param object Form
* @param boolean result
* @return void
*/
function index_form_save_after_($Form,$result){
if($Form->name == 'node_createdit' && acl('index always_on_index') && !empty($result)){
$Form->db->update('nodes',array('promoted'=>'true'),array('id'=>$Form->insert_id));
}
}
Обратите внимание, поскольку мы хотим, чтобы хук сработал после метода «save», то задаем суффикс «after» в названии хука. В этом случае вторым аргументом принимается результат, а после него — параметры адресуемого метода (в данном случае они опущены в силу ненадобности).Дистрибутив обновлен.


Спасибо большое за «how to» сообщество, это очередная гениальная и очень нужная идея. Спасибо!
Понял важную вещь — если ты что-то придумал интересное, то нельзя и желать, что бы другие люди сразу же осознали твои идеи. Следует донести до них путеводную нить — информацию, которая поможет им встать на путь осмысления твоих идей.
Надеюсь, что из данного топика понятно, насколько у движка гибкая архитектура.
Приятный урок =)
и выдало ошибку:
что это значит? И на главной выскакивает сообщение:
Можно капчу CodeIgniter заменить на reCaptcha.
Переработал обычную капчу, убрав из нее контрольные слова по-умолчанию. Теперь капча генерируется произвольным образом.
Хорошо, тогда следующим уроком будет переход на reCaptcha, а после уже — рейтинги.
Инвайты по любому :)
Решил для начала разобраться с виджетами, как они устроены (внешний вид, заголовки), попробовал повторить виджет Stats и вот возник вопрос. А именно, хочу уточнить количество созданных файлов в этом примере. Я насчитал 3:
- stats/widgets/stats.php
- stats/widgets/stats.info
- stats/lang/ru.lng
Но как минимум, в папке stats должен быть еще один файл stats.info, что бы в админке в боковой панели мы увидели созданный виджет stats /*Скриншот*/Вот хотелось попросить, а нельзя ли сделать простенький урок по виджетам?
Содержание урока:
- На примере виджета Stats показать, как можно визуально сделать его похожим на виджет На сайте или Сообщества в рамочке и как сделать без нее как у виджетов Поиск или Теги
- Как можно расположить виджеты с правой стороны, а не с левой как сейчас
- Как в низ виджета добавить ссылку, например: все сообщества или все комментарии.
P.S. Если это все просто и не заслуживает урока, то можно тогда выложить архив с самым простым виджетом, хотя бы тот же StatsС уважением.