Добавление типа клуба для возможности сортировки

+27
1.47K
Обращалась на форуме за помощью в доработке компонента "Клубы", но никто не откликнулся. Реализовать задумку помог брат. Делюсь полученным — вдруг кому-то будет полезным. Так как брат видел InstantCMS первый раз, поэтому просьба сильно ногами не пинать, если что-то сделано вопреки стандартной логике движка.
Что мне было нужно:
1. Добавить возможность выбора категории при создании клуба
2. Сделать, чтобы на странице клуба под названием ссылкой высвечивалась категория данного клуба, при нажатии на нее выводился список всех клубов данной категории.
Что для этого нужно изменить

1. Создаем новую таблицу с требующимися категориями клубов:

  1. CREATE TABLE IF NOT EXISTS `cms_clubs_cat` (
  2. `id` int(3) NOT NULL AUTO_INCREMENT,
  3. `cat_name` text NOT NULL,
  4. PRIMARY KEY (`id`)
  5. ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=9 ;
  6.  
  7. --
  8. -- Dumping data for table `cms_clubs_cat`
  9. --
  10.  
  11. INSERT INTO `cms_clubs_cat` (`id`, `cat_name`) VALUES
  12. (1, 'Категория 1'),
  13. (2, 'Категория 2'),
  14. (3, 'Категория 3'),
  15. (4, 'Категория 4'),
  16. (5, 'Категория 5'),
  17. (6, 'Категория 6'),
  18. (7, 'Категория 7'),
  19. (8, 'Категория8');
2. Добавляем в cms_clubs новое поле cat_id [int(3)]

3. В существующий файл шаблона (com_clubs_create.tpl) добавляем строку таблицы с новым элементом формы

  1. <tr>
  2. <td><strong>{$LANG.SELECT_CLUB_CAT}: </strong></td>
  3. <td>
  4. <select name="clubcat" id="clubcat" style="width:300px">
  5. {foreach key=id item=clubcat from=$clubcats}
  6. <option value="{$clubcat.id}">{$clubcat.cat_name}</option>
  7. {/foreach}
  8. </select>
  9. </td>
  10. </tr>
  11. <tr>
  12.  
4. Добавляем новую запись в языковой файл \languages\ru\components\clubs.php

  1. $_LANG['SELECT_CLUB_CAT'] ='Выберите категорию конкурса';
5. Заменяем функцию создания нового клуба, для этого в components\clubs\frontend.php
в части //////////// CREATE CLUB /////////////////////
( if(!$errors) )

заменяем
$created_id = $model->addClub(array('user_id'=>$inUser->id, 'title'=>$title, 'clubtype'=>$clubtype, $cfg);

на

$created_id = $model->addClub(array('user_id'=>$inUser->id, 'title'=>$title, 'clubtype'=>$clubtype, 'clubcat'=>$clubcat), $cfg);

и после
$clubtype = $inCore->request('clubtype', 'str');
добавляем
$clubcat = $inCore->request('clubcat', 'str');

6. В файле components\clubs\model.php добавляем публичную функцию внутри класса cms_model_clubs

class cms_model_clubs{
бла-бла-бла
...
СЮДА!
}


  1. public function getClubCat($catId) {
  2. $sql = "SELECT cat_name FROM cms_clubs_cat WHERE id = $catId"; // формируем запрос
  3. $result = $this->inDB->query($sql); // выполняем запрос
  4. if ($this->inDB->error()) { return false; } // Контролим ошибки
  5. if (!$this->inDB->num_rows($result)) { return false; } // если результат запроса пуст
  6. $result = $this->inDB->fetch_assoc($result); // загружаем в массив результат
  7. return $result[cat_name];
  8. }
7. В файле components\clubs\frontend.php в части ////////// VIEW SINGLE CLUB //////
получаем значение поля cat_id
после
$pagetitle = $club['title'];
добавляем
$clubcat = $club['cat_id'];
и передаем в шаблон
после
$smarty->assign('pagetitle', $pagetitle);
добавляем
$smarty->assign('clubcat', $model->getClubCat($clubcat));

8. В файле текущего шаблона сайта компонента вывода текущего клуба templates\*******\components\com_clubs_view_club.tpl

выбираем место для вывода названия категории (в дальнейшем ссылка на список всех клубов этой категории)
((в нашем случае под названием клуба, а именно второй строкой свершу))

<div class="clubcat"><a href="cat{$clubcat_id}">{$clubcat}</a></div>

9. Разбиваем список клубов на две колонки. Правим файл color.css в вашем шаблоне

div.club_entry,
div.club_entry_vip{
border-bottom:1px solid #ccc;
}

заменяем на

div.club_entry,
div.club_entry_vip{
border-bottom:1px solid #ccc;
float: left;
width: 48%;
}

10. Правим файл router.php компонента клубы

после
  1. $routes[] = array(
  2. '_uri' => '/^clubs\/page\-([0-9]+)$/i',
  3. 'do' => 'view',
  4. 1 => 'page'
  5. );
добавляем
  1. $routes[] = array(
  2. '_uri' => '/^clubs\/cat([0-9]+)$/i',
  3. 'do' => 'viewcat',
  4. 1 => 'cat_id'
  5. );
11. в файл frontend.php добавляем новое

  1. ////////// VIEW ALL CLUBS CAT ////////////////////////////////////////////////////////////////////////////////////////
  2. if ($do=='viewcat'){
  3.  
  4. //PAGINATION
  5. $perpage = isset($cfg['perpage']) ? $cfg['perpage'] : 10;
  6. $page = $inCore->request('page', 'int', 1);
  7. $cat_id = $inCore->request('cat_id', 'int');
  8.  
  9. $clubs = array();
  10. $clubs_list = $model->getClubsCat($page, $perpage,$cat_id);
  11.  
  12. $total = 0;
  13.  
  14. if ($clubs_list){
  15. foreach ($clubs_list as $club){
  16. if (!$club['imageurl']) { $club['imageurl'] = 'nopic.jpg'; } else {
  17. if (!file_exists(PATH.'/images/clubs/small/'.$club['imageurl'])){
  18. $club['imageurl'] = 'nopic.jpg';
  19. }
  20. }
  21. $clubs[] = $club;
  22. }
  23. $total = $model->getClubsCount();
  24. $pagination = cmsPage::getPagebar($total, $page, $perpage, '/clubs/page-%page%', array());
  25. }
  26.  
  27. $smarty = $inCore->initSmarty('components', 'com_clubs_view.tpl');
  28. $smarty->assign('pagetitle', $pagetitle);
  29. $smarty->assign('clubid', $id);
  30. // Ссылку на создание клуба показываем всем авторизованным
  31. $smarty->assign('can_create', $inUser->id);
  32. $smarty->assign('clubs', $clubs);
  33. $smarty->assign('total', $total);
  34. $smarty->assign('pagination', $pagination);
  35. $smarty->display('com_clubs_view.tpl');
  36.  
  37. }
  38.  
12. Передаем список существующих категорий. В frontend.php

if ($do == 'create'){

после
$smarty->assign('confirm', $confirm);
добавим
$smarty->assign('clubcats', $model->getCatsList());

13. Добавляем сортировку по категории (model.php)

запрос

  1. $sql = "SELECT c.*, (COUNT(uc.user_id)+1) as members, c.pubdate as pubdate
  2. FROM cms_clubs c
  3. LEFT JOIN cms_user_clubs uc ON uc.club_id = c.id
  4. WHERE c.published = 1
  5. GROUP BY c.id
  6. ORDER BY is_vip DESC, members DESC
  7. LIMIT ".(($page-1)*$perpage).", $perpage";
меняем на

  1. $sql = "SELECT c.*, (COUNT(uc.user_id)+1) as members, c.pubdate as pubdate
  2. FROM cms_clubs c
  3. LEFT JOIN cms_user_clubs uc ON uc.club_id = c.id
  4. WHERE c.published = 1
  5. GROUP BY c.id
  6. ORDER BY cat_id ASC, is_vip DESC, members DESC
  7. LIMIT ".(($page-1)*$perpage).", $perpage";
14. Добавляем функцию получения списка существующих категорий (model.php)

  1. public function getCatsList() {
  2. $cats = array();
  3.  
  4. $sql = "SELECT * FROM cms_clubs_cat";
  5.  
  6. $rs = $this->inDB->query($sql) or die(mysql_error());
  7.  
  8. if (!$this->inDB->num_rows($rs)){ return false; }
  9.  
  10. while ($cat = $this->inDB->fetch_assoc($rs)){
  11. $cats[] = $cat;
  12. }
  13.  
  14. $cats = cmsCore::callEvent('GET_CATSLIST', $cats);
  15.  
  16. return $cats;
  17. }
15. Добавляем функцию получения названия категориии по её идентификатору (model.php)

  1. public function getClubName($club_id) {
  2.  
  3. global $_LANG;
  4. $sql = "SELECT *
  5. FROM cms_clubs_cat
  6. WHERE id = $club_id";
  7. $result = $this->inDB->query($sql);
  8. if (!$this->inDB->num_rows($result)){ return false; }
  9. $club = $this->inDB->fetch_assoc($result);
  10. $club = cmsCore::callEvent('GET_CLUB', $club);
  11. return $club;
  12. }
16. Добавляем в функцию getClubs запрос на доп инфо (model.php)

while ($club = $this->inDB->fetch_assoc($rs)){
$clubs[] = $club;
}

заменяем на

while ($club = $this->inDB->fetch_assoc($rs)){
$club[cat_id] = $this ->getClubName($club[cat_id]);
$clubs[] = $club;
}

17. В шаблон вывода списка клубов (com_clubs_view.tpl) добавляем название категории, к которой принадлежит каждый клуб и ссылку на список всех клубов этой категории

после
<span class="members"><strong>{$club.members|spellcount:$LANG.USER:$LANG.USER2:$LANG.USER10}</strong></span>

добавляем
<span class="category"><strong><a href="/clubs/cat{$club.cat_id.id}">{$club.cat_id.cat_name}</a></strong></span>


Готово. Сделано для версии 1.8.
Буду рада, если кому-то пригодится, и еще раз прошу прощения за сумбурность изложения.
0
picaboo picaboo 12 лет назад #
оберните плиз весь код тегом [ code]
+1
bondar bondar 12 лет назад #
это очееень не реально когда много кода. Кода добавлял тоже много кода , то - кода берешь код в тег то после этого страница опять вас поднимает на верх, и так после каждого раза, и из-за этого допускается много ошибок, потому что постоянно ищешь где последний раз был тег, это можно когда кода 5-10 строк, а когда так много - это страницу надо будет делать пол дня, и вторую проверять или нет там ошибок
0
Search Search 12 лет назад #
+1
Очень неудобно! иногда не хочется посты писать из-за этой фичи.
0
Zau4man Zau4man 12 лет назад #
кто мешает их вручную ставить
Код PHP:
 ??
автору плюс, ничего не понял)) демо бы
+2
nedoriko nedoriko 12 лет назад #
+
засуну пока в закладки, может и пригодится.
0
Dexel Dexel 10 лет назад #
Спасибо.
А скажите, какая задумка была в CSS:
Код PHP:
  1. float: left;
  2. width: 48%;
В итоге правая половина будет свободная. Зачем?

""


PS. У меня версия 1.10.1, может в Вашей дизайн другой был
0
Петр Петр 10 лет назад #
предполагалось в две колонки, на дефолте не работает видимо.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.