function getBBSCategories($aSelectedID = array(), $bOptions = false) { if (!is_array($aSelectedID)) { $aSelectedID = array($aSelectedID); } bff::i()->GetModule('bbs'); $aCats = $this->db->select('SELECT id, title, 0 as disabled FROM ' . TABLE_BBS_CATEGORIES . ' WHERE numlevel=1 ORDER BY numleft'); if ($bOptions) { $sOptions = ''; array_unshift($aCats, array('id' => 0, 'title' => 'любой', 'disabled' => 0), array('id' => -2, 'title' => '------------------------', 'disabled' => 1), array('id' => 1, 'title' => 'Все разделы сайта', 'disabled' => 0)); foreach ($aCats as $v) { $sOptions .= '<option value="' . $v['id'] . '" class="' . ($v['id'] == 0 || $v['id'] == 1 ? 'bold' : '') . '" ' . ($v['id'] == -2 ? 'disabled' : '') . ' ' . (in_array($v['id'], $aSelectedID) ? ' selected="selected"' : '') . '>' . $v['title'] . '</option>'; } } else { array_unshift($aCats, array('id' => 1, 'title' => 'Все разделы сайта')); $sCheckbox = ''; foreach ($aCats as $v) { $sCheckbox .= '<label><input type="checkbox" name="cat[]" class="catcheck ' . ($v['id'] == 1 ? 'all bold' : 'cat') . '" value="' . $v['id'] . '"' . (in_array($v['id'], $aSelectedID) ? ' checked="checked"' : '') . '/> ' . $v['title'] . '</label><br/>'; } } $aCats = func::array_transparent($aCats, 'id', true); return array('cats' => $aCats, 'options' => !empty($sOptions) ? $sOptions : '', 'checks' => !empty($sCheckbox) ? $sCheckbox : ''); }
function edit() { if (bff::$isAjax) { $this->input->postm(array('id' => TYPE_UINT, 'reg' => TYPE_ARRAY_UINT, 'contacts' => TYPE_ARRAY_NOHTML, 'descr' => TYPE_NOTAGS, 'info' => TYPE_NOTAGS, 'img' => TYPE_ARRAY_NOHTML, 'imgfav' => TYPE_NOHTML, 'imo' => TYPE_NOHTML, 'price' => TYPE_NUM, 'price_torg' => TYPE_BOOL, 'price_bart' => TYPE_BOOL, 'video' => TYPE_NOHTML, 'period' => TYPE_UINT), $p); $sqlCheck = ' WHERE id = ' . $p['id']; if ($this->security->isMember()) { $sqlCheck .= ' AND user_id = ' . $this->security->getUserID(); } else { if (!$this->isEditPassGranted($p['id'])) { $this->ajaxResponse(Errors::ACCESSDENIED); } } $aData = $this->db->one_array('SELECT id, status, cat1_id, cat2_id, cat_id, cat_type, descr FROM ' . TABLE_BBS_ITEMS . $sqlCheck); if (empty($aData)) { $this->ajaxResponse(Errors::ACCESSDENIED); } $this->input->clean_array($p['reg'], array(1 => TYPE_UINT, 2 => TYPE_UINT, 3 => TYPE_UINT)); $aDynpropsData = $this->input->post('dp', TYPE_ARRAY); if (!empty($aDynpropsData)) { $dp = $this->initDynprops(); $aDynpropsData = $dp->prepareSaveDataByID($aDynpropsData, $dp->getByID(array_keys($aDynpropsData)), 'update'); } $sRegionsTitle = ''; if (!empty($p['reg'])) { $aRegions = $this->db->select('SELECT title, numlevel FROM ' . TABLE_BBS_REGIONS . ' WHERE id IN(' . join(',', $p['reg']) . ') ORDER BY numlevel'); if (!empty($aRegions)) { $aRegions = func::array_transparent($aRegions, 'numlevel', true); $nRegionStart = 1; if (sizeof($aRegions) == 1) { $sRegionsTitle = $aRegions[$nRegionStart]['title']; } else { if (sizeof($aRegions) == 3) { $nRegionStart = 2; } $sRegionsTitle = $aRegions[$nRegionStart]['title'] . ($aRegions[$nRegionStart + 1] ? ', ' . $aRegions[$nRegionStart + 1]['title'] : ''); } } } if ($this->errors->no()) { $p['contacts']['site'] = str_replace(array('http://', 'https://', 'ftp://'), '', $p['contacts']['site']); if (empty($p['contacts']['site'])) { $p['contacts']['site'] = ''; } $adtxtLimit = config::get('bbs_adtxt_limit'); if (!empty($adtxtLimit)) { $p['descr'] = mb_substr($p['descr'], 0, $adtxtLimit); } $p['descr'] = func::cleanComment($p['descr']); $p['info'] = func::cleanComment($p['info']); $sqlNOW = $this->db->getNOW(); $sqlStatus = ''; $isModified = $p['imo'] != md5('(*&^%$+_)578' . join(',', $p['img'])) || $aData['descr'] != $p['descr']; if ($isModified) { $sqlStatus = ', moderated = 0'; } $res = $this->db->execute('UPDATE ' . TABLE_BBS_ITEMS . ' SET country_id = ' . $p['reg'][1] . ', region_id = ' . $p['reg'][2] . ', city_id = ' . $p['reg'][3] . ', img = :img, imgcnt = ' . sizeof($p['img']) . ', imgfav = :imgfav, price = ' . $p['price'] . ', price_torg = ' . $p['price_torg'] . ', price_bart = ' . $p['price_bart'] . ', contacts_name = :c_name, contacts_email = :c_email, contacts_phone = :c_phone, contacts_skype = :c_skype, contacts_site = :c_site, video = :video, descr = :descr, descr_regions = :descr_regions, info = :info, mkeywords = :mkeywords, mdescription = :mdescription, modified = ' . $sqlNOW . ' ' . (!empty($aDynpropsData) ? $aDynpropsData : '') . $sqlStatus . ' WHERE id = ' . $p['id'] . ' ', array(array(':img', join(',', $p['img']), PDO::PARAM_STR), array(':imgfav', $p['imgfav'], PDO::PARAM_STR), array(':c_name', isset($p['contacts']['name']) ? $p['contacts']['name'] : '', PDO::PARAM_STR), array(':c_email', isset($p['contacts']['email']) ? $p['contacts']['email'] : '', PDO::PARAM_STR), array(':c_phone', isset($p['contacts']['phone']) ? $p['contacts']['phone'] : '', PDO::PARAM_STR), array(':c_skype', isset($p['contacts']['skype']) ? $p['contacts']['skype'] : '', PDO::PARAM_STR), array(':c_site', isset($p['contacts']['site']) ? $p['contacts']['site'] : '', PDO::PARAM_STR), array(':video', $p['video'], PDO::PARAM_STR), array(':descr', $p['descr'], PDO::PARAM_STR), array(':descr_regions', $sRegionsTitle, PDO::PARAM_STR), array(':info', $p['info'], PDO::PARAM_STR), array(':mkeywords', $p['descr'], PDO::PARAM_STR), array(':mdescription', $p['descr'], PDO::PARAM_STR))); $success = $res === 1; $this->ajaxResponse(array('res' => $success)); } $this->ajaxResponse(null); } $nItemID = $this->input->id('id'); if (!$nItemID) { func::JSRedirect('/'); } $nUserID = $this->security->getUserID(); $dp = $this->initDynprops(); $aData = $this->db->one_array('SELECT I.id, ' . $this->security->decodeBBSEditPass('I.pass') . ', I.user_id, I.status, I.moderated, I.cat_id, C.regions as cat_regions, C.prices as cat_prices, C.prices_sett as cat_prices_sett, I.country_id, I.region_id, I.city_id, I.img, I.imgfav, I.imgcnt, I.descr, I.info, I.price, I.price_torg, I.price_bart, I.video, I.contacts_name, I.contacts_email, I.contacts_phone, I.contacts_skype, I.contacts_site , I.f' . join(', I.f', range($dp->datafield_int_first, $dp->datafield_text_last)) . ' FROM ' . TABLE_BBS_ITEMS . ' I, ' . TABLE_BBS_CATEGORIES . ' C WHERE I.id = ' . $nItemID . ' AND I.cat_id = C.id '); if (empty($aData)) { func::JSRedirect('/'); } if ($aData['user_id'] == 0) { //доступ только по паролю if (!$this->isEditPassGranted($nItemID)) { $aData = array('item_id' => $nItemID, 'user_id' => $nUserID); return $this->tplFetchPHP($aData, 'item.edit.pass.php'); } } else { if ($aData['user_id'] != $nUserID) { //не является владельцем объявления return $this->showForbidden('Вы не являетесь владельцем данного объявления.'); } } if ($aData['status'] == BBS_STATUS_BLOCKED && $aData['moderated'] == 0) { return $this->showForbidden('Объявление ожидает проверки модератора.'); } $aDynprops = $dp->form($aData['cat_id'], $aData, true, array(), 'dp', 'dynprops.form.edit.php', $this->module_dir_tpl); $aData['dp'] = $aDynprops['form']; unset($aDynprops); $aData['regions'] = $this->db->select('SELECT R.id, R.pid, R.title FROM ' . TABLE_BBS_REGIONS . ' R, ' . TABLE_BBS_REGIONS . ' R2 WHERE R.numlevel IN(1,2) AND R.enabled = 1 AND (R.pid = 0 OR (R.pid = R2.id AND R2.enabled = 1)) ORDER BY R.main DESC, R.num, R.title'); $aData['regions'] = $this->db->transformRowsToTree($aData['regions'], 'id', 'pid', 'sub'); if ($aData['country_id'] && $aData['region_id'] && $aData['city_id']) { $aData['cities'] = $this->db->select('SELECT R.id, R.title FROM ' . TABLE_BBS_REGIONS . ' R WHERE R.pid = ' . $aData['region_id'] . ' AND R.enabled = 1 ORDER BY R.main DESC, R.num, R.title'); } if ($nUserID) { $aData['items_status'] = $this->db->one_array('SELECT SUM(I.status = ' . BBS_STATUS_PUBLICATED . ') as active, SUM(I.status = ' . BBS_STATUS_PUBLICATED_OUT . ') as notactive, SUM(I.status = ' . BBS_STATUS_BLOCKED . ') as blocked FROM ' . TABLE_BBS_ITEMS . ' I WHERE I.user_id = ' . $nUserID . ' AND I.status !=' . BBS_STATUS_NEW); } $aConfig = array('adtxt_limit'); $aConfig[] = 'images_limit' . ($this->security->isMember() ? '_reg' : ''); $aData['config'] = config::get($aConfig, false, $this->module_name . '_'); $aData['redirect'] = !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : SITEURL . '/item/' . $nItemID; config::get('tpl_bbs_item_edit', 1); config::set('userMenuCurrent', 2); config::set('bbsCurrentCategory', $aData['cat_id']); $this->includeJS(array('bbs.txt', 'bbs.edit')); $this->includeJS(array('swfupload/swfupload'), false, true); return $this->tplFetchPHP($aData, 'item.edit.php'); }
function cities_listing($nOnlyMain = 0) { if (!$this->haveAccessTo('cities')) { return $this->showAccessDenied(); } if (bff::$isAjax) { //$cache = Cache::singleton(); switch (func::GET('act')) { case 'toggle-enabled': if (!($nRecordID = $this->input->id())) { $this->ajaxResponse(Errors::UNKNOWNRECORD); } $res = $this->db->execute('UPDATE ' . TABLE_CITY . ' SET enabled=(1-enabled) WHERE city_id=' . $nRecordID); if ($res) { //$cache->delete('geo-сities-all'); //$cache->delete('geo-сities-main'); } $this->ajaxResponse($res ? Errors::SUCCESS : Errors::IMPOSSIBLE); break; case 'toggle-main': if (!($nRecordID = $this->input->id())) { $this->ajaxResponse(Errors::UNKNOWNRECORD); } $res = $this->db->execute('UPDATE ' . TABLE_CITY . ' SET main=(1-main) WHERE city_id=' . $nRecordID); if ($res) { //$cache->delete('geo-сities-main'); } $this->ajaxResponse($res ? Errors::SUCCESS : Errors::IMPOSSIBLE); break; case 'main-add': if (!($nRecordID = $this->input->id('city', 'p'))) { $this->ajaxResponse(Errors::UNKNOWNRECORD); } $res = $this->db->execute('UPDATE ' . TABLE_CITY . ' SET main=1 WHERE city_id=' . $nRecordID); if ($res) { //$cache->delete('geo-сities-main'); } $this->ajaxResponse($res ? Errors::SUCCESS : Errors::IMPOSSIBLE); break; case 'rotate': $f = func::GET('f'); $f = $f == 'num' ? 'num' : 'numreg'; $res = $this->db->rotateTablednd(TABLE_CITY, '', 'city_id', $f); if ($res) { //$cache->delete('geo-сities-all'); //$cache->delete('geo-сities-main'); $this->ajaxResponse(Errors::SUCCESS); } else { $this->ajaxResponse(Errors::IMPOSSIBLE); } break; case 'notmain-list': $sQ = func::POST('q', true); //получаем список подходящих по названию городов, исключая //- основные города $aResult = $this->db->select('SELECT C.city_id as id, C.title FROM ' . TABLE_CITY . ' C WHERE C.main=0 AND C.title LIKE (' . $this->db->str2sql($sQ . '%') . ') ORDER BY C.title'); $aCities = array(); foreach ($aResult as $c) { $aCities[$c['id']] = $c['title']; } unset($aResult); $this->ajaxResponse($aCities); break; } $this->ajaxResponse(Errors::IMPOSSIBLE); } $aData = array('main' => $nOnlyMain, 'users' => func::GET('users'), 'region' => func::GET('region', false, true)); $aData['rotate'] = ($aData['main'] || $aData['region']) && !($aData['main'] && $aData['region']) && !$aData['users'] ? 1 : 0; $aData['rotate_field'] = $aData['rotate'] ? $aData['main'] ? 'num' : 'numreg' : 'title'; $aData['cities'] = $this->db->select('SELECT C.*, C.city_id as id, COUNT(U.user_id) as users FROM ' . TABLE_CITY . ' C LEFT JOIN ' . TABLE_USERS . ' U ON U.city_id=C.city_id WHERE 1=1 ' . ($aData['region'] ? ' AND C.region_id = ' . $aData['region'] . ' ' : '') . ' ' . ($aData['main'] ? ' AND C.main = 1 ' : '') . ' GROUP BY C.city_id ' . ($aData['users'] ? ' HAVING users > 0 ' : '') . ' ORDER BY C.' . $aData['rotate_field']); $aData['regions_options'] = $this->geoOblastOptions($aData['region'], $aRegions); $aData['regions'] = func::array_transparent($aRegions, 'region_id', true); $this->tplAssignByRef('aData', $aData); $this->includeJS(array('tablednd', 'autocomplete')); return $this->tplFetch('admin.cities.listing.tpl'); }
function items_edit() { if (!$this->haveAccessTo('items-edit')) { return $this->showAccessDenied(); } if (bff::$isAjax) { $this->input->postm(array('id' => TYPE_UINT, 'reg' => TYPE_ARRAY_UINT, 'contacts' => TYPE_ARRAY_STR, 'descr' => TYPE_STR, 'info' => TYPE_STR, 'price' => TYPE_NUM, 'price_torg' => TYPE_BOOL, 'price_bart' => TYPE_BOOL, 'video' => TYPE_STR, 'mkeywords' => TYPE_STR, 'mdescription' => TYPE_STR), $p); $this->input->clean_array($p['reg'], array(1 => TYPE_UINT, 2 => TYPE_UINT, 3 => TYPE_UINT)); $aDynpropsData = $this->input->post('dp', TYPE_ARRAY); if (!empty($aDynpropsData)) { $dp = $this->initDynprops(); $aDynpropsData = $dp->prepareSaveDataByID($aDynpropsData, $dp->getByID(array_keys($aDynpropsData)), 'update'); } $sRegionsTitle = ''; if (!empty($p['reg'])) { $aRegions = $this->db->select('SELECT title, numlevel FROM ' . TABLE_BBS_REGIONS . ' WHERE id IN(' . join(',', $p['reg']) . ') ORDER BY numlevel'); if (!empty($aRegions)) { $aRegions = func::array_transparent($aRegions, 'numlevel', true); $nRegionStart = 1; if (sizeof($aRegions) == 1) { $sRegionsTitle = $aRegions[$nRegionStart]['title']; } else { if (sizeof($aRegions) == 3) { $nRegionStart = 2; } $sRegionsTitle = $aRegions[$nRegionStart]['title'] . ($aRegions[$nRegionStart + 1] ? ', ' . $aRegions[$nRegionStart + 1]['title'] : ''); } } } if ($this->errors->no()) { if (!empty($p['contacts']['site']) && $p['contacts']['site'] == 'http://') { $p['contacts']['site'] = ''; } $adtxtLimit = config::get('bbs_adtxt_limit'); if (!empty($adtxtLimit)) { $p['descr'] = mb_substr($p['descr'], 0, $adtxtLimit); } $sqlNOW = $this->db->getNOW(); $res = $this->db->execute('UPDATE ' . TABLE_BBS_ITEMS . ' SET country_id = ' . $p['reg'][1] . ', region_id = ' . $p['reg'][2] . ', city_id = ' . $p['reg'][3] . ', price = ' . $p['price'] . ', price_torg = ' . $p['price_torg'] . ', price_bart = ' . $p['price_bart'] . ', contacts_name = :c_name, contacts_email = :c_email, contacts_phone = :c_phone, contacts_skype = :c_skype, contacts_site = :c_site, video = :video, descr = :descr, descr_regions = :descr_regions, info = :info, mkeywords = :mkeywords, mdescription = :mdescription, modified = ' . $sqlNOW . ' ' . (!empty($aDynpropsData) ? $aDynpropsData : '') . ' WHERE id = ' . $p['id'] . ' ', array(array(':c_name', isset($p['contacts']['name']) ? $p['contacts']['name'] : '', PDO::PARAM_STR), array(':c_email', isset($p['contacts']['email']) ? $p['contacts']['email'] : '', PDO::PARAM_STR), array(':c_phone', isset($p['contacts']['phone']) ? $p['contacts']['phone'] : '', PDO::PARAM_STR), array(':c_skype', isset($p['contacts']['skype']) ? $p['contacts']['skype'] : '', PDO::PARAM_STR), array(':c_site', isset($p['contacts']['site']) ? $p['contacts']['site'] : '', PDO::PARAM_STR), array(':video', $p['video'], PDO::PARAM_STR), array(':descr', $p['descr'], PDO::PARAM_STR), array(':descr_regions', $sRegionsTitle, PDO::PARAM_STR), array(':info', $p['info'], PDO::PARAM_STR), array(':mkeywords', $p['mkeywords'], PDO::PARAM_STR), array(':mdescription', $p['mdescription'], PDO::PARAM_STR))); $this->ajaxResponse(array('res' => $res === 1)); } $this->ajaxResponse(null); } $sFilter = $this->input->get('f', TYPE_STR); // listing filter $sRedirect = 'items_listing&' . $sFilter; $sFilter = rawurlencode($sFilter); $nRecordID = $this->input->id(); if (!$nRecordID) { $this->adminRedirect(Errors::IMPOSSIBLE, $sRedirect); } $dp = $this->initDynprops(); $aData = $this->db->one_array('SELECT I.*, C.regions as cat_regions, C.prices as cat_prices, C.prices_sett as cat_prices_sett, CT.title as cat_type_title FROM ' . TABLE_BBS_ITEMS . ' I LEFT JOIN ' . TABLE_BBS_CATEGORIES_TYPES . ' CT ON I.cat_type = CT.id, ' . TABLE_BBS_CATEGORIES . ' C WHERE I.id = ' . $nRecordID . ' AND I.cat_id = C.id'); if (empty($aData)) { $this->adminRedirect(Errors::IMPOSSIBLE, $sRedirect); } $aDynprops = $dp->form($aData['cat_id'], $aData, true, array(), 'dp', 'dynprops.form.edit.php', $this->module_dir_tpl); $aData['dp'] = !empty($aDynprops['form']) ? $aDynprops['form'] : 0; unset($aDynprops); $aData['regions'] = $this->db->select('SELECT R.id, R.pid, R.title FROM ' . TABLE_BBS_REGIONS . ' R, ' . TABLE_BBS_REGIONS . ' R2 WHERE R.numlevel IN(1,2) AND R.enabled = 1 AND (R.pid = 0 OR (R.pid = R2.id AND R2.enabled = 1)) ORDER BY R.main DESC, R.num, R.title'); $aData['regions'] = $this->db->transformRowsToTree($aData['regions'], 'id', 'pid', 'sub'); if ($aData['country_id'] && $aData['region_id'] && $aData['city_id']) { $aData['cities'] = $this->db->select('SELECT R.id, R.title FROM ' . TABLE_BBS_REGIONS . ' R WHERE R.pid = ' . $aData['region_id'] . ' AND R.enabled = 1 ORDER BY R.main DESC, R.num, R.title'); } if ($this->items_images) { $aData['img'] = !empty($aData['img']) ? explode(',', $aData['img']) : array(); $this->items_images_limit = config::get('bbs_images_limit' . ($aData['user_id'] > 0 ? '_reg' : '')); } $aData['cats_path'] = ''; $aParentsID = $this->tree_getNodeParentsID($aData['cat_id']); $aParentsID[] = $aData['cat_id']; if (!empty($aParentsID)) { $sQuery = 'SELECT C.title FROM ' . TABLE_BBS_CATEGORIES . ' C WHERE ' . $this->db->prepareIN('C.id', $aParentsID) . ' ORDER BY C.numleft'; $aData['cats_path'] = join(' <img src="/img/arrowRightSmall.png" /> ', $this->db->select_one_column($sQuery)); } $aData['f'] =& $sFilter; $this->includeJS(array('bbs.txt', 'admin.bbs.edit'), false, false); $this->includeJS(array('swfupload/swfupload')); return $this->tplFetchPHP($aData, 'admin.items.edit.php'); }
/** * Подготовка запроса сохранения значений свойств по ID владельцев * @param mixed id владельца * @param array значения свойств: array(id владельца=>значения, ...) * @param array параметры свойств: без группировки по id владельца * @param string тип запроса: 'insert', 'update' * @return array @see prepareSaveDataByOwner */ public function prepareSaveDataByOwner($mOwnerID, $aDynpropsData, $aDynprops, $sQueryType = 'insert') { if (!empty($mOwnerID) && !empty($aDynpropsData) && !empty($aDynprops)) { if (!is_array($mOwnerID)) { $mOwnerID = array($mOwnerID); } $aDynprops = func::array_transparent($aDynprops, $this->ownerColumn); $aResult = array(); foreach ($mOwnerID as $ownerID) { if ($ownerID > 0) { $aResult[$ownerID] = $this->prepareSaveData(isset($aDynpropsData[$ownerID]) ? $aDynpropsData[$ownerID] : array(), isset($aDynprops[$ownerID]) ? $aDynprops[$ownerID] : array(), $sQueryType); } } return $aResult; } return array(); }