Шестеренка
(27)В сообществе «Шестеренка» предлагаю публиковать свои шестеренки. Как готовые варианты, так и Alfa, Beta версии.
Позволяет создавать разделы новостей с неограниченной вложенностью.
Создание разделов и новостей в Админке.
Прикрепление новостей к любому разделу.
Функционал комментариев. + в будущем добавлю рейтинг.


cogear.ru/oshibka-pri-rabote-s-modulem-novosti-466.html
Только вот виджет ничего не показывает, пишет, что: Новостей нет.
Название архива news4.zip.
Обновлен файл widgets/news.php.
Одна из задач, это выводить через переменную {$news} в главный файл темы header.tpl функцию tree_group_view — функция выводит дерево разделов, подобное дерево мне нужно на главной.
Создал файл _hooks.php куда поместил функцию которая будет решать поставленную задачу.
function news_header($CI){ $CI->content['news'] = $CI->news->tree_group_view(); }В принципе задуманное работает, но терзают сомнения по поводу созданной мной функции, понимаю, что какие-нибудь плюшки для стабильной работы в ней отсутствуют.
Просьба, кто понимает, что необходимо дописать в эту функцию для стабильной и производительной работы, подскажите, пожалуйста.
можно сделать свою функцию в модели, для отображения дерева только ссылки переделать на страницы сайта,
Если выводимое дерево устраивает, можно сделать похожий шаблон и похожую функцию (скопировать и поменять немного).
исходный шаблон называется admin_tree.tpl, можно даже немного видоизменить шаблон.
Более подробно по этой теме написал в личку.
$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?
если по позиции
$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 в шаблоне не надо
затем в самой функции сделать
$page = $CI->pager($page, $count); $count - заранее вычисляется и содержит количество всех новостей для вывода (необходимых)теперь page это массив который содержит( в зависимости от настроек количества новостей на странице) элементы limit и start.далее при формировании запросов к БД сделать
$this->db->limit($page['limit'],$page['start']);пример можно посмотреть в nodes/models/nodes.php -> get(...) и у меня в шестеренке новости в антологичной функции
список страниц со ссылками появиться автоматом в низу
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'); } }что я не правильно делаю??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а дальше все правильно
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((надо после строки
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.
Таблица: 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 символов?Подскажите, пожалуйста, кто что знает на этот счет?
Пошел делать.
Все получилось! :-)