
Рассматривая доску объявлений первой ветки приходишь к выводу, что она не совсем "неудобна" - в одном поле необходимо описать всю суть объявления. Однако все крупные сайты досок объявлений уже давно приучили пользователей к тому, что для каждой записи есть свое поле (телефон, цена, и т.д.)
Сегодня будем расширять доску объявлений, добавив поле номер телефона
И так приступим, изменения коснуться следующих файлов:
componentsoard rontend.php
languages
ucomponentsoard.php
emplates_default_componentscom_board_edit.tpl
emplates_default_componentscom_board_item.tpl
Далее выкладываю код изменяемых файлов с комментариями, дабы избавить Вас от пресловутых "находим..." "далее вставляем.."
Для начала необходимо выполнить запрос к БД для создания поля phone
Код PHP:
1. Вносим изменения в файл componentsoard rontend.php
ALTER TABLE `cms_board_items` ADD `phone` TEXT NOT NULL AFTER `content`
Смотреть
[code=php]
<?php
/******************************************************************************/
// //
// InstantCMS v1.10.6 //
// http://www.instantcms.ru/ //
// //
// written by InstantCMS Team, 2007-2015 //
// produced by InstantSoft, (www.instantsoft.ru) //
// //
// LICENSED BY GNU/GPL v2 //
// //
/******************************************************************************/
function board(){
$inCore = cmsCore::getInstance();
$inPage = cmsPage::getInstance();
$inDB = cmsDatabase::getInstance();
$inUser = cmsUser::getInstance();
global $_LANG;
define('IS_BILLING', $inCore->isComponentInstalled('billing'));
if (IS_BILLING) { cmsCore::loadClass('billing'); }
$model = new cms_model_board();
$do = $inCore->do;
$pagetitle = $inCore->getComponentTitle();
$pagekeys = $pagedesc = '';
$inPage->setTitle($pagetitle);
$inPage->addPathway($pagetitle, '/board');
/////////////////////////////// VIEW CATEGORY ///////////////////////////////////////////////////////////////////////////////////////////
if ($do=='view'){
//Получаем текущую категорию
$category = $model->getCategory($model->category_id);
if (!$category) { cmsCore::error404(); }
if ($category['id'] != $model->root_cat['id']) {
$pagetitle = $category['pagetitle'] ? $category['pagetitle'] : $category['title'];
$pagekeys = $category['meta_keys'];
$pagedesc = $category['meta_desc'];
$category_path = $inDB->getNsCategoryPath('cms_board_cats', $category['NSLeft'], $category['NSRight']);
if($category_path){
foreach($category_path as $pcat){
$inPage->addPathway($pcat['title'], '/board/'.$pcat['id']);
}
}
} else {
$category['title'] = $pagetitle = $inCore->menuTitle();
$category['description'] = $model->config['root_description'];
$pagekeys = $model->config['meta_keys'];
$pagedesc = $model->config['meta_desc'];
}
// rss в адресной строке
$rss_cat_id = $category['id'] == $model->root_cat['id'] ? 'all' : $category['id'];
$inPage->addHead('<link rel="alternate" type="application/rss+xml" title="'.$_LANG['BOARD'].'" href="'.HOST.'/rss/board/'.$rss_cat_id.'/feed.rss">');
//Формируем категории
$cats = $model->getSubCats($category['id']);
// Формируем список объявлений
// Устанавливаем категорию
if ($category['id'] != $model->root_cat['id']) {
$model->whereThisAndNestedCats($category['NSLeft'], $category['NSRight']);
}
//Город
if ($model->city) {
$model->whereCityIs($model->city);
$pagetitle .= ' :: '.$model->city;
}
// Типы объявлений
if ($model->obtype && mb_stristr(icms_ucfirst($category['obtypes']), $model->obtype)) {
$model->whereTypeIs($model->obtype);
$pagetitle .= ' :: '.$model->obtype;
}
// модератор или админ
$is_moder = $inUser->is_admin || $model->is_moderator_by_group;
// Общее количество объявлений по заданным выше условиям
$total = $model->getAdvertsCount($is_moder, true);
//устанавливаем сортировку
$orderby = $model->getOrder('orderby', $category['orderby']);
$orderto = $model->getOrder('orderto', $category['orderto']);
$inDB->orderBy('is_vip DESC, '.$orderby, $orderto);
//устанавливаем номер текущей страницы и кол-во объявлений на странице
$inDB->limitPage($model->page, $category['perpage']);
// Получаем объявления
$items = $model->getAdverts($is_moder, true, false, true);
// Если объявлений на странице большей чем 1 нет, 404
if(!$items && $model->page > 1){ cmsCore::error404(); }
// если не указаны ключевые слова, формируем их из названий рубрик и типов
if(!$pagekeys && $cats){
foreach($cats as $c){
$keys[] = $c['title'];
foreach (explode("
", $c['obtypes']) as $obtype) {
$keys[] = trim($obtype);
}
}
$pagekeys = implode(',', $keys);
} elseif(!$cats) {
$pagekeys = $category['title'];
}
// если не указано описание, формируем из текущих объявлений
if(!$pagedesc && $items){
foreach($items as $i){
$desc[] = $i['title'];
}
$pagedesc = implode('. ', $desc);
} elseif(!$items && $category['description']){
$pagedesc = crop($category['description']);
}
// Проставляем заголовки страницы и описание согласно выборки
$inPage->setDescription(crop($pagedesc));
$inPage->setKeywords($pagekeys);
$inPage->setTitle($pagetitle);
// Отдаем в шаблон категории
cmsPage::initTemplate('components', 'com_board_cats')->
assign('cats', $cats)->
assign('category', $category)->
assign('root_id', $model->root_cat['id'])->
assign('is_user', $inUser->id)->
assign('maxcols', $model->config['maxcols'])->
display('com_board_cats.tpl');
$pagebar = cmsPage::getPagebar($total, $model->page, $category['perpage'], '/board/%catid%-%page%', array('catid'=>$category['id']));
$order_form = $category['orderform'] ? $model->orderForm($orderby, $orderto, $category) : '';
// Отдаем в шаблон объявления
cmsPage::initTemplate('components', 'com_board_items')->
assign('order_form', $order_form)->
assign('cfg', $model->config)->
assign('root_id', $model->root_cat['id'])->
assign('items', $items)->
assign('cat', $category)->
assign('maxcols', $category['maxcols'])->
assign('colwidth', round(100/$category['maxcols']))->
assign('pagebar', $pagebar)->
display('com_board_items.tpl');
}
/////////////////////////////// VIEW USER ADV ///////////////////////////////////////////////////////////////////////////////////////
if ($do=='by_user'){
// логин пользователя
$login = cmsCore::request('login', 'str', ''.$inUser->login.'');
// получаем данные пользователя
$user = cmsUser::getShortUserData($login);
if (!$user) { cmsCore::error404(); }
$myprofile = $model->checkAccess($user['id']);
$inPage->addPathway($user['nickname']);
$inPage->setTitle($_LANG['BOARD'].' - '.$user['nickname']);
$inPage->setDescription($_LANG['BOARD'].' - '.$user['nickname']);
// Формируем список объявлений
$model->whereUserIs($user['id']);
// Общее количество объявлений по заданным выше условиям
$total = $model->getAdvertsCount($myprofile);
//устанавливаем сортировку
$inDB->orderBy('pubdate', 'DESC');
//устанавливаем номер текущей страницы и кол-во объявлений на странице
$inDB->limitPage($model->page, 15);
// Получаем объявления
$items = $model->getAdverts($myprofile, true, false, true);
// Если объявлений на странице большей чем 1 нет, 404
if(!$items && $model->page > 1){ cmsCore::error404(); }
// Пагинация
$pagebar = cmsPage::getPagebar($total, $model->page, 15, '/board/by_user_'.$login.'/page-%page%');
// Показываем даты
$category['showdate'] = 1;
cmsPage::initTemplate('components', 'com_board_items')->
assign('cfg', $model->config)->
assign('page_title', $_LANG['BOARD'].' - '.$user['nickname'])->
assign('root_id', $model->root_cat['id'])->
assign('items', $items)->
assign('cat', $category)->
assign('maxcols', 1)->
assign('colwidth', 100)->
assign('pagebar', $pagebar)->
display('com_board_items.tpl');
}
/////////////////////////////// VIEW ITEM ///////////////////////////////////////////////////////////////////////////////////////////
if($do=='read'){
// получаем объявление
$item = $model->getRecord($model->item_id);
if (!$item){ cmsCore::error404(); }
// неопубликованные показываем админам, модераторам и автору
if (!$item['published'] && !$item['moderator']) { cmsCore::error404(); }
// для неопубликованного показываем инфо: просрочено/на модерации
if (!$item['published']) {
$info_text = $item['is_overdue'] ? $_LANG['ADV_IS_EXTEND'] : $_LANG['ADV_IS_MODER'];
cmsCore::addSessionMessage($info_text, 'info');
} else {
// увеличиваем кол-во просмотров
$inDB->setFlag('cms_board_items', $model->item_id, 'hits', $item['hits']+1);
}
// формируем заголовок и тело сообщения
$item['title'] = $item['obtype'].' '.$item['title'];
$item['content'] = nl2br($item['content']);
$item['content'] = $model->config['auto_link'] ? $inCore->parseSmiles($item['content']) : $item['content'];
$category_path = $inDB->getNsCategoryPath('cms_board_cats', $item['NSLeft'], $item['NSRight']);
if($category_path){
foreach($category_path as $pcat){
$inPage->addPathway($pcat['title'], '/board/'.$pcat['id']);
}
}
$inPage->addPathway($item['title']);
$pagetitle = $item['pagetitle'] ? $item['pagetitle'] : $item['title'];
$pagekeys = $item['meta_keys'] ? $item['meta_keys'] : $item['title'];
$pagedesc = $item['meta_desc'] ? $item['meta_desc'] : $item['content'];
$inPage->setTitle($pagetitle);
$inPage->setDescription(crop($pagedesc));
$inPage->setKeywords($pagekeys);
cmsPage::initTemplate('components', 'com_board_item')->
assign('item', $item)->
assign('cfg', $model->config)->
assign('user_id', $inUser->id)->
assign('is_admin', $inUser->is_admin)->
assign('formsdata', cmsForm::getFieldsValues($item['form_id'], $item['form_array']))->
assign('is_moder', $model->is_moderator_by_group)->
display('com_board_item.tpl');
}
/////////////////////////////// NEW BOARD ITEM /////////////////////////////////////////////////////////////////////////////////////////
if ($do=='additem'){
// Получаем категории, в которые может загружать пользователь
$catslist = $model->getPublicCats($model->category_id);
if(!$catslist) {
cmsCore::addSessionMessage($_LANG['YOU_CANT_ADD_ADV_ANY'], 'error');
$inCore->redirect('/board');
}
$cat['is_photos'] = 1;
$formsdata = array();
if ($model->category_id && $model->category_id != $model->root_cat['id']) {
$cat = $model->getCategory($model->category_id);
$formsdata = cmsForm::getFieldsHtml($cat['form_id']);
}
$inPage->addPathway($_LANG['ADD_ADV']);
if ( !cmsCore::inRequest('submit') ) {
if (IS_BILLING) { cmsBilling::checkBalance('board', 'add_item'); }
$inPage->setTitle($_LANG['ADD_ADV']);
$item = cmsUser::sessionGet('item');
if ($item) { cmsUser::sessionDel('item'); }
$item['city'] = !empty($item['city']) ? $item['city'] : $inUser->city;
cmsPage::initTemplate('components', 'com_board_edit')->
assign('action', "/board/add.html")->
assign('form_do', 'add')->
assign('cfg', $model->config)->
assign('cat', $cat)->
assign('item', $item)->
assign('pagetitle', $_LANG['ADD_ADV'])->
assign('formsdata', $formsdata)->
assign('is_admin', $inUser->is_admin)->
assign('is_user', $inUser->id)->
assign('catslist', $catslist)->
assign('is_billing', IS_BILLING)->assign('balance', $inUser->balance)->
display('com_board_edit.tpl');
cmsUser::sessionClearAll();
return;
}
if ( cmsCore::inRequest('submit') ) {
// проверяем на заполненость скрытое поле
$title_fake = cmsCore::request('title_fake', 'str', '');
// если оно заполнено, считаем что это бот, 404
if ($title_fake) { cmsCore::error404(); }
$errors = false;
// проверяем наличие категории
if (!$cat['id']) { cmsCore::addSessionMessage($_LANG['NEED_CAT_ADV'], 'error'); $errors = true; }
// Проверяем количество добавленных за сутки
if (!$model->checkLoadedByUser24h($cat)){
cmsCore::addSessionMessage($_LANG['MAX_VALUE_OF_ADD_ADV'], 'error'); $errors = true;
}
// Можем ли добавлять в эту рубрику
if (!$model->checkAdd($cat)){
cmsCore::addSessionMessage($_LANG['YOU_CANT_ADD_ADV'], 'error'); $errors = true;
}
// входные данные
$obtype = icms_ucfirst(cmsCore::request('obtype', 'str', ''));
$title = trim(str_ireplace($obtype, '', cmsCore::request('title', 'str', '')));
$content = cmsCore::request('content', 'str', '');
// входные данные номер телефона
$phone = cmsCore::request('phone', 'str', '');
// входные данные номер телефона
$city = cmsCore::request('city', 'str', '');
$pagetitle = cmsCore::request('pagetitle', 'str', '');
$meta_keys = cmsCore::request('meta_keys', 'str', '');
$meta_desc = cmsCore::request('meta_desc', 'str', '');
$form_input = cmsForm::getFieldsInputValues($cat['form_id']);
$formsdata = $inDB->escape_string(cmsCore::arrayToYaml($form_input['values']));
$vipdays = cmsCore::request('vipdays', 'int', 0);
$published = $model->checkPublished($cat);
if ($model->config['srok']){ $pubdays = (cmsCore::request('pubdays', 'int') <= 50) ? cmsCore::request('pubdays', 'int') : 50; }
if (!$model->config['srok']){ $pubdays = isset($model->config['pubdays']) ? $model->config['pubdays'] : 14; }
// Проверяем значения
if (!$title) { cmsCore::addSessionMessage($_LANG['NEED_TITLE'], 'error'); $errors = true; }
if (!$content) { cmsCore::addSessionMessage($_LANG['NEED_TEXT_ADV'], 'error'); $errors = true; }
// Проверяем значение поля номер телефона
if (!$phone) { cmsCore::addSessionMessage($_LANG['NEED_PHONE_ADV'], 'error'); $errors = true; }
// Проверяем значение поля номер телефона
if (!$city) { cmsCore::addSessionMessage($_LANG['NEED_CITY'], 'error'); $errors = true; }
if (!$inUser->id && !cmsPage::checkCaptchaCode()) { cmsCore::addSessionMessage($_LANG['ERR_CAPTCHA'], 'error'); $errors = true; }
// Проверяем значения формы
foreach ($form_input['errors'] as $field_error) {
if($field_error){ cmsCore::addSessionMessage($field_error, 'error'); $errors = true; }
}
if ($errors){
$item['content'] = htmlspecialchars(stripslashes($_REQUEST['content']));
// Проверяем значения формы номер телефона
$item['phone'] = stripslashes($phone);
// Проверяем значения формы номер телефона
$item['city'] = stripslashes($city);
$item['title'] = stripslashes($title);
$item['obtype'] = $obtype;
cmsUser::sessionPut('item', $item);
cmsCore::redirect('/board/'.$model->category_id.'/add.html');
}
if($cat['is_photos']){
// Загружаем фото
$file = $model->uploadPhoto('', $cat);
} else {
$file['filename'] = '';
cmsCore::addSessionMessage($_LANG['INFO_CAT_NO_PHOTO'], 'info');
}
$add = array(
'category_id'=>$model->category_id,
'user_id'=>$inUser->id,
'obtype'=>$obtype,
'title'=>$title,
'content'=>$content,
// Добавляем запись номер телефона
'phone'=>$phone,
// Добавляем запись номер телефона
'formsdata'=>$formsdata,
'city'=>$city,
'pubdays'=>$pubdays,
'published'=>$published,
'pagetitle'=>((($model->config['seo_user_access'] && $inUser->id) || $inUser->is_admin) ? $pagetitle : ''),
'meta_keys'=>((($model->config['seo_user_access'] && $inUser->id) || $inUser->is_admin) ? $meta_keys : ''),
'meta_desc'=>((($model->config['seo_user_access'] && $inUser->id) || $inUser->is_admin) ? $meta_desc : ''),
'file'=>$file['filename']
);
$add['id'] = $model->addRecord($add);
if ($inUser->is_admin && $vipdays){
$model->setVip($add['id'], $vipdays);
}
if (IS_BILLING) {
cmsBilling::process('board', 'add_item');
if ($model->config['vip_enabled'] && $vipdays && $model->config['vip_day_cost']){
if ($vipdays > $model->config['vip_max_days']) { $vipdays = $model->config['vip_max_days']; }
$summ = $vipdays * $model->config['vip_day_cost'];
if ($inUser->balance >= $summ){
cmsBilling::pay($inUser->id, $summ, $_LANG['VIP_ITEM']);
$model->setVip($add['id'], $vipdays);
}
}
}
cmsUser::sessionClearAll();
if ($published) {
//регистрируем событие
cmsActions::log('add_board', array(
'object' => $obtype.' '.$title,
'object_url' => '/board/read'.$add['id'].'.html',
'object_id' => $add['id'],
'target' => $cat['title'],
'target_url' => '/board/'.$cat['id'],
'target_id' => $cat['id'],
'description' => ''
));
cmsCore::addSessionMessage($_LANG['ADV_IS_ADDED'], 'success');
cmsCore::callEvent('ADD_BOARD_DONE', $add);
cmsCore::redirect('/board/read'.$add['id'].'.html');
}
if (!$published) {
$link = '<a href="/board/read'.$add['id'].'.html">'.$obtype.' '.$title.'</a>';
if($inUser->id){
$user = '<a href="'.cmsUser::getProfileURL($inUser->login).'">'.$inUser->nickname.'</a>';
} else {
$user = $_LANG['BOARD_GUEST'].', ip: '.$inUser->ip;
}
$message = str_replace('%user%', $user, $_LANG['MSG_ADV_SUBMIT']);
$message = str_replace('%link%', $link, $message);
cmsUser::sendMessage(USER_UPDATER, 1, $message);
cmsCore::addSessionMessage($_LANG['ADV_IS_ADDED'].'<br>'.$_LANG['ADV_PREMODER_TEXT'], 'success');
cmsCore::redirect('/board/'.$model->category_id);
}
}
}
/////////////////////////////// EDIT BOARD ITEM /////////////////////////////////////////////////////////////////////////////////////////
if ($do=='edititem'){
$item = $model->getRecord($model->item_id);
$cat = $model->getCategory($item['category_id']);
if (!$cat) { cmsCore::error404(); }
if (!$item) { cmsCore::error404(); }
$inPage->setTitle($_LANG['EDIT_ADV']);
$inPage->addPathway($item['category'], '/board/'.$item['cat_id']);
$inPage->addPathway($_LANG['EDIT_ADV']);
if (!$item['moderator']){
cmsCore::addSessionMessage($_LANG['YOU_HAVENT_ACCESS'], 'error');
cmsCore::redirect('/board/read'.$item['id'].'.html');
}
$errors = false;
if (!cmsCore::inRequest('submit')){
cmsPage::initTemplate('components', 'com_board_edit')->
assign('action', "/board/edit{$item['id']}.html")->
assign('form_do', 'edit')->
assign('cfg', $model->config)->
assign('cat', $cat)->
assign('item', $item)->
assign('pagetitle', $_LANG['EDIT_ADV'])->
assign('is_admin', $inUser->is_admin)->
assign('catslist', $model->getPublicCats($item['category_id'], true))->
assign('formsdata', cmsForm::getFieldsHtml($cat['form_id'], $item['form_array']))->
assign('is_user', $inUser->id)->
assign('is_billing', IS_BILLING)->assign('balance', $inUser->balance)->
display('com_board_edit.tpl');
cmsUser::sessionClearAll();
}
if (cmsCore::inRequest('submit')){
$new_cat_id = cmsCore::request('category_id', 'int', 0);
if ($new_cat_id){ $item['category_id'] = $new_cat_id; }
$form_input = cmsForm::getFieldsInputValues($cat['form_id']);
$formsdata = $inDB->escape_string(cmsCore::arrayToYaml($form_input['values']));
if ($item['is_overdue'] && !$item['published']) {
if ($model->config['srok']){
$pubdays = (cmsCore::request('pubdays', 'int') <= 50) ? cmsCore::request('pubdays', 'int') : 50;
}
if (!$model->config['srok']){
$pubdays = isset($model->config['pubdays']) ? $model->config['pubdays'] : 14;
}
$pubdate = date("Y-m-d H:i:s");
} else {
$pubdays = $item['pubdays'];
$pubdate = $item['fpubdate'];
}
$update['obtype'] = icms_ucfirst(cmsCore::request('obtype', 'str'));
$update['title'] = trim(str_ireplace($update['obtype'], '', cmsCore::request('title', 'str', '')));
$update['category_id'] = $item['category_id'];
$update['content'] = cmsCore::request('content', 'str', '');
// Обновляем запись номер телефона
$update['phone'] = cmsCore::request('phone', 'str', '');
// Обновляем запись номер телефона
$update['formsdata'] = $formsdata;
$update['city'] = cmsCore::request('city', 'str', '');
$update['pubdate'] = $pubdate;
$update['pubdays'] = $pubdays;
$update['published'] = $model->checkPublished($cat, true);
if(($model->config['seo_user_access'] && $inUser->id) || $inUser->is_admin){
$update['pagetitle'] = cmsCore::request('pagetitle', 'str', '');
$update['meta_keys'] = cmsCore::request('meta_keys', 'str', '');
$update['meta_desc'] = cmsCore::request('meta_desc', 'str', '');
}
if (!$update['title']) { cmsCore::addSessionMessage($_LANG['NEED_TITLE'], 'error'); $errors = true; }
if (!$update['content']) { cmsCore::addSessionMessage($_LANG['NEED_TEXT_ADV'], 'error'); $errors = true; }
// Проверяем запись номер телефона
if (!$update['phone']) { cmsCore::addSessionMessage($_LANG['NEED_PHONE_ADV'], 'error'); $errors = true; }
// Проверяем запись номер телефона
if (!$update['city']) { cmsCore::addSessionMessage($_LANG['NEED_CITY'], 'error'); $errors = true; }
// Проверяем значения формы
foreach ($form_input['errors'] as $field_error) {
if($field_error){ cmsCore::addSessionMessage($field_error, 'error'); $errors = true; }
}
if ($errors){ $inCore->redirect('/board/edit'.$item['id'].'.html'); }
if($cat['is_photos']){
// Загружаем фото
$file = $model->uploadPhoto($item['file'], $cat);
}
$update['file'] = $file['filename'] ? $file['filename'] : $item['file'];
// обновляем объявление
$model->updateRecord($item['id'], $update);
// обновляем запись в ленте активности
cmsActions::updateLog('add_board', array('object' => $update['obtype'].' '.$update['title']), $item['id']);
$vipdays = cmsCore::request('vipdays', 'int', 0);
if ($inUser->is_admin){
if($vipdays>0){
$model->setVip($item['id'], $vipdays);
}
if($vipdays == -1){
$model->deleteVip($item['id']);
}
}
if (IS_BILLING) {
if ($model->config['vip_enabled'] && $model->config['vip_prolong'] && $vipdays && $model->config['vip_day_cost']){
if ($vipdays > $model->config['vip_max_days']) { $vipdays = $model->config['vip_max_days']; }
$summ = $vipdays * $model->config['vip_day_cost'];
if ($inUser->balance >= $summ){
cmsBilling::pay($inUser->id, $summ, $_LANG['VIP_ITEM']);
$model->setVip($item['id'], $vipdays);
}
}
}
cmsUser::sessionClearAll();
if (!$update['published']) {
$link = '<a href="/board/read'.$item['id'].'.html">'.$update['obtype'].' '.$update['title'].'</a>';
$user = '<a href="'.cmsUser::getProfileURL($inUser->login).'">'.$inUser->nickname.'</a>';
$message = str_replace(array('%link%','%user%'), array($link,$user), $_LANG['MSG_ADV_EDITED']);
cmsUser::sendMessage(USER_UPDATER, 1, $message);
cmsCore::addSessionMessage($_LANG['ADV_EDIT_PREMODER_TEXT'], 'info');
}
cmsCore::addSessionMessage($_LANG['ADV_MODIFIED'], 'success');
cmsCore::redirect('/board/read'.$item['id'].'.html');
}
}
///////////////////////// PUBLISH BOARD ITEM /////////////////////////////////////////////////////////////////////////////
if ($do == 'publish'){
$item = $model->getRecord($model->item_id);
if (!$item){ cmsCore::error404(); }
// если уже опубликовано, 404
if ($item['published']) { cmsCore::error404(); }
// публиковать могут админы и модераторы доски
if(!$inUser->is_admin && !$model->is_moderator_by_group) { cmsCore::error404(); }
// публикуем
$inDB->setFlag('cms_board_items', $model->item_id, 'published', 1);
cmsCore::callEvent('ADD_BOARD_DONE', $item);
if($item['user_id']){
//регистрируем событие
cmsActions::log('add_board', array(
'object' => $item['obtype'].' '.$item['title'],
'user_id' => $item['user_id'],
'object_url' => '/board/read'.$item['id'].'.html',
'object_id' => $item['id'],
'target' => $item['category'],
'target_url' => '/board/'.$item['cat_id'],
'target_id' => $item['cat_id'],
'description' => ''
));
$link = '<a href="/board/read'.$item['id'].'.html">'.$item['obtype'].' '.$item['title'].'</a>';
$message = str_replace('%link%', $link, $_LANG['MSG_ADV_ACCEPTED']);
cmsUser::sendMessage(USER_UPDATER, $item['user_id'], $message);
}
cmsCore::addSessionMessage($_LANG['ADV_IS_ACCEPTED'], 'success');
cmsCore::redirect('/board/read'.$item['id'].'.html');
}
/////////////////////////////// DELETE BOARD ITEM /////////////////////////////////////////////////////////////////////////////////////////
if ($do == 'delete'){
$item = $model->getRecord($model->item_id);
if (!$item){ cmsCore::error404(); }
if (!$item['moderator']){
cmsCore::addSessionMessage($_LANG['YOU_HAVENT_ACCESS'], 'error');
cmsCore::redirect('/board/'.$item['cat_id']);
}
if (!cmsCore::inRequest('godelete')){
$inPage->setTitle($_LANG['DELETE_ADV']);
$inPage->addPathway($item['category'], '/board/'.$item['cat_id']);
$inPage->addPathway($_LANG['DELETE_ADV']);
$confirm['title'] = $_LANG['DELETING_ADV'];
$confirm['text'] = $_LANG['YOU_SURE_DELETE_ADV'].' "'.$item['title'].'"?';
$confirm['action'] = $_SERVER['REQUEST_URI'];
$confirm['yes_button']['name'] = 'godelete';
cmsPage::initTemplate('components', 'action_confirm')->
assign('confirm', $confirm)->
display('action_confirm.tpl');
}
if (cmsCore::inRequest('godelete')){
$model->deleteRecord($model->item_id);
cmsCore::addSessionMessage($_LANG['ADV_IS_DELETED'], 'success');
cmsCore::redirect('/board/'.$item['cat_id']);
}
}
}
[/code]
ucomponentsoard.php для внесения языковых констант - в конец файла вставляем:
Код PHP:
3. Подключаем плангин, задаем маску и выводим поле для заполнения и редактирования в emplates_default_componentscom_board_edit.tpl:
$_LANG['TEXT_PHONE'] ='Номер телефона'; $_LANG['NEED_PHONE_ADV'] ='Необходимо указать номер телефона!';
Смотреть
[code=php]
<!-- Подключаем плангин и задаем маску -->
<script src="/includes/jquery/jquery.maskedinput.min.js"></script>
<script type="text/javascript">
jQuery(function($){
$.mask.definitions['9']='[0-9]';
$('#phone').mask('+7(999)999-99-99');
});
</script>
<!-- Подключаем плангин и задаем маску -->
<h1 class="con_heading">{$pagetitle}</h1>
<form action="{$action}" method="post" enctype="multipart/form-data">
<table cellpadding="5">
<tr>
<td width="220"><span>{$LANG.CAT_BOARD}:</span></td>
<td>
<select name="category_id" id="category_id" class="text-input" style="width:407px" onchange="getRubric();">
<option value="0">-- {$LANG.SELECT_CAT} --</option>
{$catslist}
</select>
</td>
</tr>
<tr>
<td>
<span>{$LANG.TITLE}:</span>
</td>
<td height="35">
<select name="obtype" id="obtype" style="width:160px">
<option value="0">-- {$LANG.SELECT_CAT} --</option>
</select>
<input name="title" type="text" id="title" class="text-input" style="width:240px" maxlength="250" value="{$item.title|escape:'html'}"/>
</td>
</tr>
<tr id="from_search">
<td></td>
<td height="35">
<input name="title_fake" type="text" id="title_fake" maxlength="250" value=""/>
</td>
</tr>
<tr class="proptable">
<td>
<span>{$LANG.CITY}:</span>
</td>
<td height="35" valign="top">
{city_input value=$item.city name="city" width="403px"}
</td>
</tr>
<tr id="before_form">
<td valign="top">
<span>{$LANG.TEXT_ADV}:</span>
</td>
<td height="100" valign="top">
<textarea name="content" class="text-input" style="width:403px" rows="5" id="content">{$item.content|escape:'html'}</textarea>
</td>
</tr>
{if $formsdata}
{foreach key=tid item=form from=$formsdata}
<tr class="cat_form">
<td valign="top">
<span>{$form.title}:</span>
{if $form.description}
<div style="color:gray">{$form.description}</div>
{/if}
</td>
<td valign="top">
{$form.field}
</td>
</tr>
{/foreach}
{/if}
<!-- Выводим поле номер телефона для заполнения-->
<tr id="before_form">
<td valign="top">
<span>{$LANG.TEXT_PHONE}:</span>
</td>
<td height="100" valign="top">
<textarea name="phone" class="text-input" style="width:400px" rows="1" id="phone" placeholder="+7(999) 999-9999">{$item.phone|escape:'html'}</textarea>
</td>
</tr>
<!-- Выводим поле номер телефона для заполнения-->
{if $cfg.photos && $cat.is_photos}
<tr>
<td><span>{$LANG.PHOTO}:</span></td>
<td><input name="Filedata" type="file" id="picture" style="width:407px;" /></td>
</tr>
{/if}
{if $form_do == 'edit'}
<tr>
<td height="35"><span>{$LANG.PERIOD_PUBL}:</span></td>
<td height="35">{$item.pubdays} {$LANG.DAYS}, {$LANG.DAYS_TO} {$item.pubdate}.</td>
</tr>
{elseif $cfg.srok}
<tr>
<td><span>{$LANG.PERIOD_PUBL}:</span></td>
<td>
<select name="pubdays" id="pubdays">
<option value="5">5</option>
<option value="10" selected="selected">10</option>
<option value="14">14</option>
<option value="30">30</option>
<option value="50">50</option>
</select> {$LANG.DAYS}
</td>
</tr>
{/if}
{if $cfg.extend && $form_do == 'edit' && !$item.published && $item.is_overdue}
{if $cfg.srok}
<tr>
<td height="35"><span>{$LANG.ADV_EXTEND}:</span></td>
<td height="35">
<select name="pubdays" id="pubdays">
<option value="5">5</option>
<option value="10" selected="selected">10</option>
<option value="14">14</option>
<option value="30">30</option>
<option value="50">50</option>
</select> {$LANG.DAYS}</td>
</tr>
{else}
<tr>
<td height="35"><span>{$LANG.ADV_EXTEND}:</span></td>
<td height="35">{$LANG.ADV_EXTEND_SROK} {$item.pubdays} {$LANG.DAYS}</td>
</tr>
{/if}
{/if}
{if $form_do == 'edit' && $item.is_vip}
<tr>
<td height="35"><span>{$LANG.VIP_STATUS}:</span></td>
<td height="35">{$LANG.UNTIL} {$item.vipdate}</td>
</tr>
{/if}
{if $is_admin || ($is_billing && $cfg.vip_enabled && ($form_do=='add' || ($form_do=='edit' && $cfg.vip_prolong)))}
<tr>
<td>
<span>{if $form_do=='add' || !$item.is_vip}{$LANG.MARK_AS_VIP}{else}{$LANG.EXTEND_MARK_AS_VIP}{/if}:</span>
<div style="color:gray">
{$LANG.VIP_STATUS_HINT}
</div>
</td>
<td valign="top" style="padding-top:5px">
<select id="vipdays" name="vipdays" {if !$is_admin}onchange="calculateVip()"{/if}>
<option value="0">{if $form_do=='add' || !$item.is_vip}{$LANG.DO_NOT_DO}{else}{$LANG.LEAVE_AS_IS}{/if}</option>
{if $form_do=='edit' && $item.is_vip}
<option value="-1">{$LANG.DELETE_MARK_AS_VIP}</option>
{/if}
{section name=vipdays start=1 loop=$cfg.vip_max_days+1 step=1}
<option value="{$smarty.section.vipdays.index}">
{$smarty.section.vipdays.index|spellcount:$LANG.DAY1:$LANG.DAY2:$LANG.DAY10}
</option>
{/section}
</select>
{if !$is_admin}
<input type="hidden" id="vip_day_cost" name="vip_day_cost" value="{$cfg.vip_day_cost}" />
<input type="hidden" id="balance" name="balance" value="{$balance}" />
<div id="vip_cost" style="margin-top:10px;display: none">
{$LANG.BILLING_COST}: <span>0</span> {$LANG.BILLING_POINT10}
</div>
<script type="text/javascript">
var LANG_BUY_ERROR = '{$LANG.VIP_BUY_ERROR}';
var LANG_ERROR = '{$LANG.ERROR}';
function calculateVip(){
var days = $('#vipdays').val();
var cost = $('#vip_day_cost').val();
if (Number(days)==0){
$('#vip_cost').hide().find('span').html('0');
} else {
var summ = days * cost;
$('#vip_cost').show().find('span').html(summ);
}
}
function checkBalance(){
var cost = Number($('#vip_cost span').html());
var balance = Number($('#balance').val());
if (balance < cost){
core.alert(LANG_BUY_ERROR, LANG_ERROR);
return false;
} else {
return true;
}
}
</script>
{/if}
</td>
</tr>
{/if}
{if !$is_user}
<tr>
<td valign="top" class="">
<div><strong>{$LANG.SECUR_SPAM}: </strong></div>
<div><small>{$LANG.SECUR_SPAM_TEXT}</small></div>
</td>
<td valign="top" class="">{captcha}</td>
</tr>
{/if}
{if ($cfg.seo_user_access && $is_user) || $is_admin}
<tr>
<td valign="top">{$LANG.SEO_PAGETITLE}<div class="hint">{$LANG.SEO_PAGETITLE_HINT}</div></td>
<td>
<input name="pagetitle" style="width:407px" class="text-input" value="{$item.pagetitle|escape:'html'}" />
</td>
</tr>
<tr>
<td valign="top">{$LANG.SEO_METAKEYS}</td>
<td>
<input name="meta_keys" style="width:407px" class="text-input" value="{$item.meta_keys|escape:'html'}" />
</td>
</tr>
<tr>
<td valign="top">{$LANG.SEO_METADESCR}<div class="hint">{$LANG.SEO_METADESCR_HINT}</div></td>
<td>
<textarea name="meta_desc" rows="3" style="width:407px" class="text-input">{$item.meta_desc|escape:'html'}</textarea>
</td>
</tr>
{/if}
<tr>
<td height="40" colspan="2" valign="middle">
<input name="submit" type="submit" id="submit" value="{$LANG.SAVE_ADV}" {if $is_admin || ($is_billing && $cfg.vip_enabled)}onclick="if(!checkBalance())return false;"{/if} />
</td>
</tr>
</table>
</form>
<script type="text/javascript">
function getRubric(){
$("#category_id").prop("disabled", false);
$("#obtype").prop("disabled", true);
var category_id = $('select[name=category_id]').val();
if(category_id != 0){
$.post("/components/board/ajax/get_rubric.php", { value: category_id, obtype: '{$item.obtype}' }, function(data) {
$("#obtype").prop("disabled", false);
$("#obtype").html(data);
});
{if $form_do == 'add'}
$.post("/components/board/ajax/get_form.php", { value: category_id }, function(dataform) {
if(dataform!=1){
$('.cat_form').remove();
$("#before_form").after(dataform);
}else{
$('.cat_form').remove();
}
});
{/if}
} else {
$("#obtype").html('<option value="0">-- {$LANG.SELECT_CAT} --</option>');
$("#obtype").prop("disabled", true);
$('.cat_form').remove();
}
}
$(document).ready(function() {
$('#title').focus();
$('#from_search').hide();
getRubric();
});
</script>
[/code]
Смотреть
[code=php]
{$item.plugins_output_before}
<h1 class="con_heading">{$item.title}</h1>
<div class="bd_item_details_full">
{if $item.is_vip}
<span class="bd_item_is_vip">{$LANG.VIP_ITEM}</span>
{/if}
<span class="bd_item_date">{$item.pubdate}</span>
<span class="bd_item_hits">{$item.hits}</span>
{if $item.city}
<span class="bd_item_city">
<a href="/board/city/{$item.enc_city}">{$item.city}</a>
</span>
{/if}
{if $item.user}
<span class="bd_item_user">
<a href="{profile_url login=$item.user_login}">{$item.user}</a>
</span>
{else}
<span class="bd_item_user">{$LANG.BOARD_GUEST}</span>
{/if}
{if $item.moderator}
<span class="bd_item_edit"><a href="/board/edit{$item.id}.html">{$LANG.EDIT}</a></span>
{if !$item.published && ($is_admin || $is_moder)}
<span class="bd_item_publish"><a href="/board/publish{$item.id}.html">{$LANG.PUBLISH}</a></span>
{/if}
<span class="bd_item_delete"><a href="/board/delete{$item.id}.html">{$LANG.DELETE}</a></span>
{/if}
{if $item.is_overdue}
<span class="bd_item_status_bad">{$LANG.ADV_IS_EXTEND}</span>
{/if}
</div>
<table width="100%" height="" cellspacing="" cellpadding="0" class="bd_item_full">
<tr>
{if $item.file && $cfg.photos}
<td width="64">
<img class="bd_image_small" src="/images/board/medium/{$item.file}" border="0" alt="{$item.title|escape:'html'}"/>
</td>
{/if}
<td valign="top">
<div class="bd_text_full">
<p>{$item.content}</p>
{if $formsdata}
<table width="100%" cellspacing="0" cellpadding="2" style="border-top:1px solid #C3D6DF; margin:5px 0 0 0">
{foreach key=tid item=form from=$formsdata}
{if $form.field}
<tr>
<td valign="top" width="140px">
<strong>{$form.title}:</strong>
</td>
<td valign="top">
{$form.field}
</td>
</tr>
{/if}
{/foreach}
</table>
{/if}
</div>
<!-- Выводим поле номер телефона -->
<div class="bd_text_full">
<p>{$LANG.TEXT_PHONE}: {$item.phone}</p>
</div>
<!-- Выводим поле номер телефона -->
</td>
</tr>
</table>
<div class="bd_links">
{if $user_id}
{if $item.user && !$item.user_is_deleted && $item.user_id != $user_id}
{add_js file='components/users/js/profile.js'}
<span class="bd_message"><a class="ajaxlink" title="{$LANG.WRITE_MESS_TO_AVTOR}" href="javascript:void(0)" onclick="users.sendMess('{$item.user_id}', 0, this);return false;">{$LANG.WRITE_MESS_TO_AVTOR}</a></span>
{/if}
{/if}
{if $item.user_login}
<span class="bd_author"><a href="/board/by_user_{$item.user_login}">{$LANG.ALL_AVTOR_ADVS}</a></span>
{/if}
</div>
{$item.plugins_output_after}
{if $cfg.comments}
{$can_delete = ($item.user_id == $user_id)}
{comments target='boarditem' target_id=$item.id can_delete=$can_delete}
{/if}
[/code]
Скачать измененные файлы можно здесь
По тому же принципу Вы можете создавать и другие необходимые Вам поля.