Powered by CodeIgniter

Шестеренка

(27)
18
18 голосов
В сообществе «Шестеренка» предлагаю публиковать свои шестеренки. Как готовые варианты, так и Alfa, Beta версии.
Раздел сайта «Новости».
Позволяет создавать разделы новостей с неограниченной вложенностью.
Создание разделов и новостей в Админке.
Прикрепление новостей к любому разделу.
Функционал комментариев. + в будущем добавлю рейтинг.
13:24 ← 11 июля 2010 Отправить в Твиттер dreycorpdreycorp  RSS comments 37

Здесь пока ничего нет.

Комментарии (37) ↓

inetlover inetlover time 10:26 ← 12 июля 2010 #
Спасибо!
Автор
dreycorp dreycorp time 12:55 ← 12 июля 2010 #
Незачто!
rismyk rismyk time 22:00 ← 12 сентября 2010 #
Создателю и знающим людям

cogear.ru/oshibka-pri-rabote-s-modulem-novosti-466.html
inetlover inetlover time 17:36 ← 13 сентября 2010 #
Установил, попробовал — понял, что шестеренка очень перспективна в плане организации каких-либо каталогов.

Только вот виджет ничего не показывает, пишет, что: Новостей нет.
Автор
dreycorp dreycorp time 17:54 ← 13 сентября 2010 #
Обновил.
Название архива news4.zip.
Обновлен файл widgets/news.php.
inetlover inetlover time 21:27 ← 13 сентября 2010 #
Спасибо!
Varhal Varhal time 02:46 ← 14 сентября 2010 #
спасибо работает!!!
inetlover inetlover time 01:46 ← 15 сентября 2010 #
Решил немного подредактировать модуль, что бы у меня вышел каталог.

Одна из задач, это выводить через переменную {$news} в главный файл темы header.tpl функцию tree_group_view — функция выводит дерево разделов, подобное дерево мне нужно на главной.

Создал файл _hooks.php куда поместил функцию которая будет решать поставленную задачу.

function news_header($CI){ $CI->content['news'] = $CI->news->tree_group_view(); }
В принципе задуманное работает, но терзают сомнения по поводу созданной мной функции, понимаю, что какие-нибудь плюшки для стабильной работы в ней отсутствуют.

Просьба, кто понимает, что необходимо дописать в эту функцию для стабильной и производительной работы, подскажите, пожалуйста.
Автор
dreycorp dreycorp time 15:50 ← 15 сентября 2010 #
все правильно сделал, только эта функция, для админки и все ссылки будут вести на редактирование определенной группы в админке.

можно сделать свою функцию в модели, для отображения дерева только ссылки переделать на страницы сайта,
Если выводимое дерево устраивает, можно сделать похожий шаблон и похожую функцию (скопировать и поменять немного).
исходный шаблон называется admin_tree.tpl, можно даже немного видоизменить шаблон.
Автор
dreycorp dreycorp time 15:52 ← 15 сентября 2010 #
функция с рекурсией, вернее рекурсия в шаблоне на вызов функции, это конечно не очень красиво, но нормально
inetlover inetlover time 15:59 ← 15 сентября 2010 #
Спасибо, за ценные советы!
Более подробно по этой теме написал в личку.
Varhal Varhal time 02:58 ← 16 сентября 2010 #
На основе твоего кода, сделал, что бы выводились сегодняшние новости на главной. Они выводятся, но сортируются наоборот.

$this->builder->h2(t('news today_news'),false,true); $today = date('Y-m-d', mktime(0, 0, 0, date("m") , date("d") + 0, date("Y"))); $this->db->select('news.*',FALSE); $this->db->select('users.avatar,users.url_name as author_url_name,users.name as author'); $this->db->join('users','users.id = news.aid','inner'); $this->db->where('news.published','true'); $this->db->where('news.created_date > ',$today); $this->db->order_by('news.position','asc'); $news=$this->db->get('news')->result(); foreach ($news as $num=>$item) { $this->show($item,'short'); } Вчерашние то выводятся, но вместе с ними и сегодняшние. Сортируются так же — наоборот:

$this->builder->h2(t('news last_news'),false,true); $yesterday = date('Y-m-d', mktime(0, 0, 0, date("m") , date("d") - 1, date("Y"))); $this->db->select('news.*',FALSE); $this->db->select('users.avatar,users.url_name as author_url_name,users.name as author'); $this->db->join('users','users.id = news.aid','inner'); $this->db->where('news.published','true'); $this->db->where('news.created_date > ',$yesterday); $this->db->order_by('news.position','asc'); $news=$this->db->get('news')->result(); foreach ($news as $num=>$item) { $this->show($item,'short'); }
Еще как на главной выводить только title новостей и news_info?
Автор
dreycorp dreycorp time 14:06 ← 16 сентября 2010 #
Сортировка
если по позиции
$this->db->order_by('news.position','asc'); - по возрастанию $this->db->order_by('news.position','desc'); - по убыванию аналогично по дате
$this->db->order_by('news.created_date','asc'); - по возрастанию $this->db->order_by('news.created_date','desc'); - по убыванию
По выводу на главной.
если в данном коде закончить
$news=$this->db->get('news')->result(); а затем вывести шаблон в котором будут выводится новости в нужном виде в шаблон передать объект $news.
$this->_template('news news_main_new(название шаблона)', array('news' => $news), false); и внутри самого шаблона foreach.

можно еще перед выводом шаблона обработать объект news через foreach и присвоить нужные дополнительные поля (link, и т.д.)

а можно в этом же foreach выводить шаблон не всех новостей сразу, а шаблон для отдельной новости, тогда соответственно второго foreach в шаблоне не надо
Varhal Varhal time 16:24 ← 16 сентября 2010 #
окей, вроде все ок… было бы не плохо листалку страниц на главную новостей втыкнуть)) кстати количество топиков на странце не нашел где выставляется, или берется с шестеренки nodes?
Автор
dreycorp dreycorp time 18:01 ← 16 сентября 2010 #
как задано в установках движка, файл global.info
Varhal Varhal time 19:44 ← 16 сентября 2010 #
спс, и последний вопрос, все же как на главной новостей сделать листалку страниц…?
Автор
dreycorp dreycorp time 20:12 ← 16 сентября 2010 #
надо в функцию передать переменную page, взять ее значение можно например из URI. или описать как параметр для функции в файле index.php.

затем в самой функции сделать
$page = $CI->pager($page, $count); $count - заранее вычисляется и содержит количество всех новостей для вывода (необходимых) теперь page это массив который содержит( в зависимости от настроек количества новостей на странице) элементы limit и start.
далее при формировании запросов к БД сделать
$this->db->limit($page['limit'],$page['start']);
пример можно посмотреть в nodes/models/nodes.php -> get(...) и у меня в шестеренке новости в антологичной функции

список страниц со ссылками появиться автоматом в низу
Автор
dreycorp dreycorp time 20:15 ← 16 сентября 2010 #
cogear.ru/user_guide/gears/pagination/ еще в документации
Varhal Varhal time 21:45 ← 16 сентября 2010 #
Спасибо за помощщщ)
Graid Graid time 20:17 ← 16 сентября 2010 #
cogear.ru/user_guide/html/ Ищи «Постраничная навигация» Опоздал =)
Varhal Varhal time 21:46 ← 16 сентября 2010 #
буду искать
Varhal Varhal time 23:33 ← 16 сентября 2010 #
Вот пытался сделать постраничную навигацию, сама навигация не отображается, но количество топиков на странице обрезается до нужного. Код:

elseif($type=='main') { $CI =& get_instance(); $count=$this->db->query("select count(id) as counter from news where published =true and gid=$id")->row(); $count=$count->counter; $page = $CI->pager($page, $count); $all_node = date('Y-m-d',time()-24*60*60); $this->db->select('news.*',FALSE); $this->db->select('users.avatar,users.url_name as author_url_name,users.name as author'); $this->db->join('users','users.id = news.aid','inner'); $this->db->where('news.published','true'); $this->db->order_by('news.created_date','desc'); $this->db->limit($page['limit'],$page['start']); $this->db->where('news.created_date != ',$all_node); $news=$this->db->get('news')->result(); foreach ($news as $num=>$item) { $this->show($item,'short'); } } что я не правильно делаю??
Varhal Varhal time 23:36 ← 16 сентября 2010 #
это функция get, в models/news.php
Автор
dreycorp dreycorp time 12:29 ← 18 сентября 2010 #
надо вместо
select count(id) as counter from news where published =true and gid=$id сделать запрос похожий на нужный

$this->db->select('count(news.id) as counter'); $this->db->where('news.published','true'); $this->db->where('news.created_date > ',$all_node); $count=$this->db->get('news')->row(); $count=$count->counter;
или в sql это
select count(id) as counter from news where published = true and created_date > $all_node
а дальше все правильно
Varhal Varhal time 15:11 ← 18 сентября 2010 #
тво, что получилось:

elseif($type=='main') { $all_node = date('Y-m-d',time()-24*60*60); $CI =& get_instance(); $count=$this->db->query("select count(id) as counter from news where published = true and created_date != $id")->row(); $count=$count->counter; $page = $CI->pager($page, $count); $this->db->select('news.*',FALSE); $this->db->select('users.avatar,users.url_name as author_url_name,users.name as author'); $this->db->join('users','users.id = news.aid','inner'); $this->db->where('news.published','true'); $this->db->order_by('news.created_date','desc'); $this->db->limit($page['limit'],$page['start']); $this->db->where('news.created_date != ',$all_node); $news=$this->db->get('news')->result(); foreach ($news as $num=>$item) { $this->show($item,'short'); } } Постраничная навигация появилась, но при нажатии на номер странички, 404((
Автор
dreycorp dreycorp time 12:31 ← 21 сентября 2010 #
надо будет немного мой роутер подправить, который в шестеренке, чтобы он определял, что на главной странице тоже могут передаваться страницы
Varhal Varhal time 17:31 ← 21 сентября 2010 #
что бы роутер подправить, много времени нада?
Автор
dreycorp dreycorp time 18:36 ← 21 сентября 2010 #
в модели шестеренки есть функция router
надо после строки
if ($uri_count===1) {return array('main',0,array(),0);}; вставить
if ($uri_count==2 && is_numeric($uri[2])) {return array('main',0,array(),$uri[2]);};
в функции get переменная page будет содержать номер страницы, по умолчанию 0.
Varhal Varhal time 19:14 ← 21 сентября 2010 #
все работает, большое человеское спасибо! я оформлю отдельный топик и подробно распишу, как вывести все новости на главную в шестеренке «Новости»
Автор
dreycorp dreycorp time 20:13 ← 21 сентября 2010 #
ОК, было бы хорошо!
inetlover inetlover time 16:53 ← 18 октября 2010 #
Может кто-нибудь знает причину по которой я не могу увеличить количество символов в поле через phpMyAdmin.

Таблица: news_group CREATE TABLE IF NOT EXISTS `news_group` ( `id` smallint(5) unsigned NOT NULL auto_increment, `name` varchar(30) NOT NULL, `url_name` varchar(20) NOT NULL, `description` varchar(255) NOT NULL, `icon` varchar(255) NOT NULL, `created_date` timestamp NOT NULL default CURRENT_TIMESTAMP, `main` int(11) default NULL, `position` smallint(5) default NULL, PRIMARY KEY (`id`), KEY `name` (`name`,`url_name`,`description`), KEY `main` (`main`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Хочу всего лишь сделать, что бы поля name и url_name вмещали по 70 символов:
`name` varchar(70) NOT NULL, `url_name` varchar(70) NOT NULL, Но почему-то phpMyAdmin поле name позволяет увеличить только до 56 символов, а дальше выдает ошибку: #1071 - Specified key was too long; max key length is 1000 bytes — голову сломал почему так получается, ведь в этой таблице присутствуют поля с такими же параметрами содержащие в себе по 255 символов?

Подскажите, пожалуйста, кто что знает на этот счет?
Автор
dreycorp dreycorp time 17:55 ← 18 октября 2010 #
Надо сначала убрать поля `name`,`url_name` из одного индекса, а может для каждого свой сделать, тогда можно будет изменить размер поля
inetlover inetlover time 20:13 ← 18 октября 2010 #
dreycorp, а не подскажешь, что это за индекс такой и где он находиться или дай, пожалуйста, наводку, как можно сделать свой?
Автор
dreycorp dreycorp time 20:55 ← 18 октября 2010 #
В phpmyadmin, выбрать таблицу, потом вкладка «Структура», внизу Индексы. Удалить индекс «name», и для каждого из этих полей `name`,`url_name`,`description` создать индекс, для этого в таблице со структурой нажать напротив каждого(нужного) поля на кнопку «Индекс»
inetlover inetlover time 20:58 ← 18 октября 2010 #
Ух ты — спасибо!!!

Пошел делать.
inetlover inetlover time 22:39 ← 18 октября 2010 #
Спасибо большущие!

Все получилось! :-)
Автор
dreycorp dreycorp time 00:26 ← 19 октября 2010 #
незачто!