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

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

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

Код PHP:
CREATE TABLE IF NOT EXISTS `cms_clubs_cat` (
  `id` int(3) NOT NULL AUTO_INCREMENT,
  `cat_name` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=9 ;

--
-- Dumping data for table `cms_clubs_cat`
--

INSERT INTO `cms_clubs_cat` (`id`, `cat_name`) VALUES
(1, 'Категория 1'),
(2, 'Категория 2'),
(3, 'Категория 3'),
(4, 'Категория 4'),
(5, 'Категория 5'),
(6, 'Категория 6'),
(7, 'Категория 7'),
(8, 'Категория8');
2. Добавляем в cms_clubs новое поле cat_id [int(3)]

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

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

Код PHP:
$_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{
бла-бла-бла
...
СЮДА!
}


Код PHP:
	public function getClubCat($catId) {
		$sql = "SELECT cat_name FROM cms_clubs_cat WHERE id = $catId"; // формируем запрос
		$result = $this->inDB->query($sql);	  // выполняем запрос
		if ($this->inDB->error()) { return false; }	// Контролим ошибки
        if (!$this->inDB->num_rows($result)) { return false; }	// если  результат запроса пуст
		$result = $this->inDB->fetch_assoc($result);	// загружаем в массив результат
		return $result[cat_name];
	}
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 компонента клубы

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

Код PHP:
////////// VIEW ALL CLUBS CAT ////////////////////////////////////////////////////////////////////////////////////////
if ($do=='viewcat'){

	//PAGINATION
    $perpage    = isset($cfg['perpage']) ? $cfg['perpage'] : 10;
	$page       = $inCore->request('page', 'int', 1);
	$cat_id       = $inCore->request('cat_id', 'int');
	
	$clubs      = array();
    $clubs_list = $model->getClubsCat($page, $perpage,$cat_id);
	
	$total = 0;

	if ($clubs_list){
		foreach ($clubs_list as $club){
			if (!$club['imageurl']) { $club['imageurl'] = 'nopic.jpg'; } else {
				if (!file_exists(PATH.'/images/clubs/small/'.$club['imageurl'])){
					$club['imageurl'] = 'nopic.jpg';
				}
			}
			$clubs[] = $club;
		}
		$total      = $model->getClubsCount();
        $pagination = cmsPage::getPagebar($total, $page, $perpage, '/clubs/page-%page%', array());
	}

	$smarty = $inCore->initSmarty('components', 'com_clubs_view.tpl');
	$smarty->assign('pagetitle', $pagetitle);
	$smarty->assign('clubid', $id);
	// Ссылку на создание клуба показываем всем авторизованным
	$smarty->assign('can_create', $inUser->id);
	$smarty->assign('clubs', $clubs);
	$smarty->assign('total', $total);
	$smarty->assign('pagination', $pagination);
	$smarty->display('com_clubs_view.tpl');

}
12. Передаем список существующих категорий. В frontend.php

if ($do == 'create'){

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

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

запрос

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

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

Код PHP:
    public function getCatsList() {
        $cats  = array();

        $sql =  "SELECT * FROM cms_clubs_cat";

        $rs  = $this->inDB->query($sql) or die(mysql_error());

        if (!$this->inDB->num_rows($rs)){ return false;	}

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

        $cats = cmsCore::callEvent('GET_CATSLIST', $cats);
		
        return $cats;
    }
15. Добавляем функцию получения названия категориии по её идентификатору (model.php)

Код PHP:
    public function getClubName($club_id) {

        global $_LANG;
        $sql =  "SELECT *
                 FROM cms_clubs_cat
                 WHERE id = $club_id";
        $result = $this->inDB->query($sql);
        if (!$this->inDB->num_rows($result)){ return false;	}
        $club = $this->inDB->fetch_assoc($result);
        $club = cmsCore::callEvent('GET_CLUB', $club);
        return $club;
    }
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.
Буду рада, если кому-то пригодится, и еще раз прошу прощения за сумбурность изложения.
Комментарии (7)
picaboo 6 декабря 2011 в 19:46 0
оберните плиз весь код тегом [ code]
krz 6 декабря 2011 в 19:59 +1
это очееень не реально когда много кода. Кода добавлял тоже много кода , то - кода берешь код в тег то после этого страница опять вас поднимает на верх, и так после каждого раза, и из-за этого допускается много ошибок, потому что постоянно ищешь где последний раз был тег, это можно когда кода 5-10 строк, а когда так много - это страницу надо будет делать пол дня, и вторую проверять или нет там ошибок
Search 6 декабря 2011 в 20:22 0
+1
Очень неудобно! иногда не хочется посты писать из-за этой фичи.
Zau4man 7 декабря 2011 в 08:14 0
кто мешает их вручную ставить
Код PHP:
 ??
автору плюс, ничего не понял)) демо бы
nedoriko 6 декабря 2011 в 22:23 +2
+
засуну пока в закладки, может и пригодится.
Dexel 3 февраля 2014 в 17:06 0
Спасибо.
А скажите, какая задумка была в CSS:
Код PHP:
  1.  
  2. float: left;
  3. width: 48%;
  4.  
В итоге правая половина будет свободная. Зачем?

""
Изображение уменьшено. Щелкните, чтобы увидеть оригинал.


PS. У меня версия 1.10.1, может в Вашей дизайн другой был
Петр 4 февраля 2014 в 07:05 0
предполагалось в две колонки, на дефолте не работает видимо.