instantCMS

Продолжая тему приложений начинающихся на In, расскажу немного о движке InstantCMS. Это свободный опен-сорс движок на PHP для создания социальных сетей. Понятно, что она реализует классический набор функций типа групп, друзей, блогов, галерей, форумов, барахолок и даже интернет-магазин. На базе такого движка было решено делать один студенческий сайт (ссылки нет, поскольку еще в разработке), но очень нужен был компонент “Работа”. Раз его нет, надо написать, а вернее, взять готовый модуль Барахолки и сделать из него эту самую биржу.

Вступление

Да, похоже что эта запись в очередной раз делает из людей товар, но в действительности разницы мало, между продажей телевизора и продажей себя в качестве ценного работника.

Тем не менее, у движка пока что есть большой минус — нет механизма добавления компонентов (хотя компоненты есть), по этому приходится все делать руками. По этому пока я его писал, пришлось пол движка перелопатить (т.е. перечитать). Впрочем, в этом я могу и ошибаться, если у кого-то есть мысли на этот счёт — буду рад модифицировать код.

SQL

Начнём с самого простого: таблиц и записей.Для начала создадим таблицы нужные нашему модулю:

CREATE TABLE IF NOT EXISTS `cms_vacancy_cats` (
  `id` int(11) NOT NULL auto_increment,
  `parent_id` int(11) NOT NULL default '0',
  `ordering` int(11) NOT NULL default '1',
  `NSLeft` int(11) NOT NULL default '0',
  `NSRight` int(11) NOT NULL default '0',
  `NSDiffer` varchar(15) NOT NULL default '',
  `NSIgnore` int(11) NOT NULL default '0',
  `NSLevel` int(11) NOT NULL default '0',
  `title` varchar(100) NOT NULL default '',
  `description` varchar(100) NOT NULL default '',
  `published` int(11) NOT NULL default '0',
  `orderform` int(11) default '1',
  `showdate` int(11) NOT NULL default '1',
  `pubdate` datetime NOT NULL default '0000-00-00 00:00:00',
  `orderby` varchar(20) NOT NULL default 'title',
  `orderto` varchar(4) NOT NULL default 'asc',
  `public` int(11) NOT NULL default '0',
  `perpage` int(11) NOT NULL default '15',
  `maxcols` int(11) NOT NULL default '1',
  `thumb1` int(11) NOT NULL default '64',
  `thumb2` int(11) NOT NULL default '400',
  `thumbsqr` int(11) NOT NULL default '0',
  `uplimit` int(11) NOT NULL default '10',
  `is_photos` int(11) NOT NULL default '1',
  `icon` varchar(25) default 'folder_grey.png',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=29 ;
 
--
-- Дамп данных таблицы `cms_vacancy_cats`
--
 
INSERT INTO `cms_vacancy_cats` (`id`, `parent_id`, `ordering`, `NSLeft`, `NSRight`, `NSDiffer`, `NSIgnore`, `NSLevel`, `title`, `description`, `published`, `orderform`, `showdate`, `pubdate`, `orderby`, `orderto`, `public`, `perpage`, `maxcols`, `thumb1`, `thumb2`, `thumbsqr`, `uplimit`, `is_photos`, `icon`) VALUES
(1, 0, 1, 1, 22, '', 0, 0, '-- Корневая рубрика --', '', 1, 1, 1, '2008-09-22 13:39:32', 'title', 'asc', 0, 15, 1, 64, 400, 0, 10, 1, 'folder_grey.png'),
(21, 1, 4, 8, 9, '', 0, 1, ' Производство / Инженеры / Технологи', '', 1, 1, 1, '2009-02-27 01:19:20', 'pubdate', 'desc', -1, 20, 1, 64, 400, 0, 10, 1, 'folder_grey.png'),
(22, 1, 5, 10, 11, '', 0, 1, ' Маркетинг / Реклама / PR', '', 1, 1, 1, '2009-02-27 01:19:27', 'pubdate', 'desc', -1, 20, 1, 64, 400, 0, 10, 1, 'folder_grey.png'),
(23, 1, 6, 12, 13, '', 0, 1, ' Бухгалтерия / Налоги / Финансы предприятия', '', 1, 1, 1, '2009-02-27 01:19:33', 'pubdate', 'desc', -1, 20, 1, 64, 400, 0, 10, 1, 'folder_grey.png'),
(20, 1, 3, 6, 7, '', 0, 1, ' IT / Интернет', '', 1, 1, 1, '2009-02-27 01:19:13', 'pubdate', 'desc', -1, 20, 1, 64, 400, 0, 10, 1, 'folder_grey.png'),
(18, 1, 1, 2, 3, '', 0, 1, ' Продажи (клиент-менеджмент)', '', 1, 1, 1, '2009-02-27 01:18:55', 'pubdate', 'desc', -1, 20, 1, 64, 400, 0, 10, 1, 'folder_grey.png'),
(19, 1, 2, 4, 5, '', 0, 1, ' Торговля', '', 1, 1, 1, '2009-02-27 01:19:06', 'pubdate', 'desc', -1, 20, 1, 64, 400, 0, 10, 1, 'folder_grey.png'),
(25, 1, 8, 14, 15, '', 0, 1, ' HR специалисты / Бизнес-тренеры', '', 1, 1, 1, '2009-02-27 01:19:58', 'pubdate', 'desc', -1, 20, 1, 64, 400, 0, 10, 1, 'folder_grey.png'),
(26, 1, 9, 16, 17, '', 0, 1, ' Автобизнес / Сервисное обслуживание', '', 1, 1, 1, '2009-02-27 01:20:15', 'pubdate', 'desc', -1, 20, 1, 64, 400, 0, 10, 1, 'folder_grey.png'),
(27, 1, 10, 18, 19, '', 0, 1, ' Административный персонал / Водители / Курьеры', '', 1, 1, 1, '2009-02-27 01:20:28', 'pubdate', 'desc', -1, 20, 1, 64, 400, 0, 10, 1, 'folder_grey.png'),
(28, 1, 11, 20, 21, '', 0, 1, ' Банки / Инвестиции / Лизинг', '', 1, 1, 1, '2009-02-27 01:20:39', 'pubdate', 'desc', -1, 20, 1, 64, 400, 0, 10, 1, 'folder_grey.png');
CREATE TABLE IF NOT EXISTS `cms_vacancy_items` (
  `id` int(11) NOT NULL auto_increment,
  `category_id` int(11) NOT NULL default '0',
  `user_id` int(11) NOT NULL default '0',
  `obtype` varchar(50) NOT NULL default '',
  `title` varchar(250) NOT NULL default '',
  `content` text NOT NULL,
  `city` varchar(100) NOT NULL default '',
  `pubdate` datetime default NULL,
  `pubdays` int(11) NOT NULL default '0',
  `published` int(11) NOT NULL default '0',
  `file` varchar(250) NOT NULL default '',
  `hits` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=27 ;
 
--
-- Дамп данных таблицы `cms_vacancy_items`
--
 
INSERT INTO `cms_vacancy_items` (`id`, `category_id`, `user_id`, `obtype`, `title`, `content`, `city`, `pubdate`, `pubdays`, `published`, `file`, `hits`) VALUES
(26, 27, 1, 'Вакансии', 'Вакансии Вожатые, персонал лагерей США', 'a:16:{s:6:"obtype";s:8:"Вакансии";s:5:"title";s:29:"Вожатые, персонал лагерей США";s:7:"city_ed";s:6:"Донецк";s:4:"city";s:0:"";s:11:"category_id";s:2:"27";s:9:"education";s:1:"3";s:6:"gender";s:0:"";s:3:"age";s:11:"От 18 до 26";s:7:"jobtype";s:0:"";s:7:"payment";s:4:"500$";s:7:"zp_type";s:1:"1";s:11:"description";s:457:"!Внимание!!!Внимание!!!Внимание!!!\r\nПрограмма Camp Counselors USA (Вожатые лагерей США)продолжает набор на 2008 год !!!Если Вам уже есть 18 (на 1.06.2008) и еще не исполнилось 28, Вы любите работать с детьми, общение на английском для Вас просто удовольствие, и Вы желаете провести следующее лето в США - мы приглашаем Вас принять участие в нашей программе\r\nССUSA (summer-2008)!!! Спешите ! Сезон 2008 закрывается 28 февраля 2008 г и начинается в сентябре !";s:3:"exp";s:17:"не имеет значения";s:7:"phoneno";s:32:"(062) 386 40 40, 8 050 625 27 06";s:5:"email";s:23:"mail@mail.ua";s:3:"url";s:27:"http://localhost";}', 'Донецк', '2009-02-27 12:29:09', 5, 1, '', 24);
 
--
-- Дамп данных таблицы `cms_components`
--
 
INSERT INTO `cms_components` (`id`, `title`, `link`, `config`, `internal`, `author`) VALUES (25, 'Вакансии', 'vacancy', 'a:8:{s:7:"maxcols";s:1:"1";s:7:"obtypes";s:16:"Вакансии\r\nРезюме";s:7:"showlat";N;s:6:"public";s:1:"2";s:6:"photos";s:1:"0";s:4:"srok";s:1:"1";s:7:"pubdays";s:2:"14";s:9:"watermark";s:1:"0";}', 0, 'Mee');

Прошу заметить, что последний запрос добавляет наш свежий модуль к списку уже существующих. В дамп я добавил свои данные для примера, несколько категорий и одну вакансию.

.htaccess

Теперь добавим модуль в .htaccess чтобы к нему можно было иметь доступ через красивые ссылки:

#COMPONENT "BULLETIN VACANCIES"
RewriteRule ^vacancy/$ /index.php?view=vacancy
RewriteRule ^vacancy/([0-9]*)/([0-9]*)$ /index.php?view=vacancy&id=$2&menuid=$1
RewriteRule ^vacancy/([0-9]*)/([0-9]*)/type/(.*)$ /index.php?view=vacancy&id=$2&menuid=$1&obtype=$3
RewriteRule ^vacancy/([0-9]*)/([0-9]*)-([0-9]*)$ /index.php?view=vacancy&id=$2&menuid=$1&page=$3
RewriteRule ^vacancy/([0-9]*)/latest.html$ /index.php?view=vacancy&menuid=$1&do=latest
RewriteRule ^vacancy/([0-9]*)/([0-9]*)/add.html$ /index.php?view=vacancy&id=$2&menuid=$1&do=additem
RewriteRule ^vacancy/([0-9]*)/edit([0-9]*).html$ /index.php?view=vacancy&id=$2&menuid=$1&do=edititem
RewriteRule ^vacancy/([0-9]*)/edititem([0-9]*).html$ /index.php?view=vacancy&id=$2&menuid=$1&do=edititem
RewriteRule ^vacancy/([0-9]*)/moveitem([0-9]*).html$ /index.php?view=vacancy&id=$2&menuid=$1&do=moveitem
RewriteRule ^vacancy/([0-9]*)/delete([0-9]*).html$ /index.php?view=vacancy&id=$2&menuid=$1&do=delete
RewriteRule ^vacancy/([0-9]*)/read([0-9]*).html$ /index.php?view=vacancy&do=read&id=$2&menuid=$1
RewriteRule ^vacancy/([0-9]*)/city/(.*)$ /index.php?view=vacancy&do=city&menuid=$1&city=$2
RewriteRule ^vacancy/([0-9]*)$ /index.php?view=vacancy&menuid=$1

Собственно файлы

Загрузим файлы модуля и распакуем прямо в корень сайта.

В корне создадим директории:
/images/vacancy

/images/vacancy/medium

/images/vacancy/small

Теперь мы стоим перед выбором: дело в том, что некоторые функции “барахолки” разработчики почему-то положили в ядро (cms.php). Я не знаю зачем это было сделано, поэтому аналогичные функции “вакансий” я решил положить туда же. Если у вас есть желание попробовать перенести их в другое место – можете поэксперементировать. /core/cms.php:

function cmsVacancyCities($selected='', $none_label = '??? ??????'){
	$sql = "SELECT city FROM cms_board_items WHERE published = 1 GROUP BY city";
	$result = mysql_query($sql) ;
 
	$html = '<select name="city">';
	$html .= '<option value="">'.$none_label.'</option>';
 
	while($c = mysql_fetch_assoc($result)){
		if (strtolower($selected)==strtolower($c['city'])){
			$s = 'selected';
		} else {
			$s = '';
		}		
		$pretty = ucfirst(strtolower($c['city']));
		$html .= '<option value="'.$pretty.'" '.$s.'>'.$pretty.'</option>';
	}
 
	$html .= '</select>';
 
	return $html;
}
 
 
function cmsVacancyTypesList($selected){
	$sql = "SELECT config FROM cms_components WHERE link = 'vacancy'";
	$result = mysql_query($sql) ;
 
	$html = '';
 
 
	if (mysql_num_rows($result)){	
		$conf = mysql_fetch_assoc($result);
		if ($conf){
			$cfg = unserialize($conf['config']);
			$types = explode("\n", $cfg['obtypes']);
			foreach($types as $id=>$type){
				$type = trim($type);
				if (strtolower($selected) == strtolower($type)) { $sel = 'selected="selected"'; } else { $sel =''; }
				$html .= '<option value="'.ucfirst($type).'" '.$sel.'>'.ucfirst($type).'</option>';
			}		
		}
	}
 
	return $html;
}
 
 
function cmsVacancyCatsList($selected=0, $myleft=0){
	$html = '';
 
	$nested_sets = cmsNestedSetsInit('cms_vacancy_cats');
 
	$rootid = dbGetField('cms_vacancy_cats', 'parent_id=0', 'id');
 
	$rs_rows = $nested_sets->SelectSubNodes($rootid);
 
	while($cat = mysql_fetch_assoc($rs_rows)){
		if (@$selected==$cat['id']){
			$s = 'selected';
		} else {
			$s = '';
		}		
		$otstup = str_repeat('--', $cat['NSLevel']);
		$html .= '<option value="'.$cat['id'].'" '.$s.'>'.$otstup.' '.$cat['title'].'</option>';
	}
	return $html;
}

Вот в общем-то и всё. Работает компонент таким образом: поля вакансий сериализируются и записываются в поле content, откуда потом и отбираются. В перспективе можно посмотроить тот самый конструктор форм,практически без изменения кода, чтобы любой владелец сайта, мог бы задать поля такие как хочет.

Очень надеюсь, что я ничего не забыл указать. Если у вас не будет работать, или вы найдёте ошибки, или вообще, просто так – обязательно коментируйте :)

Да, заходить, если что, надо по ссылке /vacancy/

Скриншоты

p2_3411d

p1_3411d

form1

This entry was posted on Friday, March 6th, 2009 and is filed under PHP-разработка, Плагіни. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

4 Responses to “Компонент “Биржа труда” для InstantCMS”

  1. Спасибо.
    За статью на днях попробую сделать что описанно !

  2. Instant CMS установил. Заходя по ссылке на /vacancy/ выдает ошибку: Fatal error: Call to undefined function cmsaddpathway() in /www/salonrab/users/salonrab-test3/www/htdocs/components/vacancy/frontend.php on line 78. Что бы это могло быть?

  3. Инстант уже обновили до 1,6,2 и там можно устанавливать компоненты, может выпустите компонент «Работа» для народа?) Буду очень благодарен.

  4. Поддерживаю! Если будет компонент биржа труда будут многие признательны!

Leave a Reply

free counters

Designed by Gabfire
Rambler's Top100