public function indexAction() { global $structure; if (!cot_module_active('rss')) { cot_die_message(404, TRUE); } $c = cot_import('c', 'G', 'TXT'); if (!empty($c)) { if (!isset($structure['advboard'][$c])) { cot_die_message(404, TRUE); } list(cot::$usr['auth_read'], cot::$usr['auth_write'], cot::$usr['isadmin']) = cot_auth('advboard', $c); cot_block(cot::$usr['auth_read']); } $rss_title = cot::$L['advboard_rss_feed'] . cot::$cfg['maintitle']; $rss_link = cot::$cfg['mainurl']; $rss_description = cot::$cfg['subtitle']; $domain = cot::$sys['domain']; $condition = array(array('state', advboard_model_Advert::PUBLISHED), array('begin', cot::$sys['now'], '<='), array('SQL', "expire = 0 OR expire > " . cot::$sys['now'])); if (!empty($c)) { $rss_title = cot::$L['advboard_rss_feed'] . $structure['advboard'][$c]['title'] . ' - ' . cot::$cfg['maintitle']; $condition[] = array('category', $c); } $advertisement = advboard_model_Advert::find($condition, cot::$cfg['rss']['rss_maxitems'], 0, array(array('sort', 'desc'))); $t = new XTemplate(cot_tplfile('rss')); $now = cot::$sys['now']; $now += cot::$usr['timezone'] * 3600; $t->assign(array('RSS_ENCODING' => cot::$cfg['rss']['rss_charset'], 'RSS_TITLE' => htmlspecialchars($rss_title), 'RSS_LINK' => $rss_link, 'RSS_LANG' => cot::$cfg['defaultlang'], 'RSS_DESCRIPTION' => htmlspecialchars($rss_description), 'RSS_DATE' => $this->fixPubDate(date("r", $now)))); if (!empty($advertisement)) { foreach ($advertisement as $advert) { $url = $advert->url; if (!cot_url_check($url)) { $url = COT_ABSOLUTE_URL . $url; } $date = ''; if (!empty($advert->created)) { $date = strtotime($advert->created); $date += cot::$usr['timezone'] * 3600; $date = date('r', $date); $date = $this->fixPubDate($date); } $text = $advert->text; $textlength = intval(cot::$cfg['rss']['rss_pagemaxsymbols']); if ($textlength > 0 && mb_strlen($text) > $textlength) { $text = cot_string_truncate($text, $textlength, true, false, cot::$R['advboard_cuttext']); } $t->assign(array('RSS_ROW_TITLE' => htmlspecialchars($advert->title), 'RSS_ROW_DESCRIPTION' => $this->convertRelativeUrls($text), 'RSS_ROW_DATE' => $date, 'RSS_ROW_LINK' => $url)); $t->parse('MAIN.ITEM_ROW'); } } $t->parse('MAIN'); // ob_clean(); header('Content-type: text/xml; charset=UTF-8'); echo $t->text('MAIN'); exit; }
[BEGIN_COT_EXT] Hooks=comments.send.new [END_COT_EXT] ==================== */ /** * Ads board module for Cotonti Siena * * @package Advboard * @author Kalnov Alexey <*****@*****.**> * @copyright (c) 2015 Portal30 Studio http://portal30.ru */ defined('COT_CODE') or die('Wrong URL.'); require_once cot_incfile('advboard', 'module'); $adv_cat = ''; if ($comarray['com_area'] == 'advboard' && cot::$cfg['advboard']['notifyUserNewComment'] == 1 && $comarray['com_code'] > 0) { $advert = advboard_model_Advert::getById($comarray['com_code']); if ($advert && $advert->issetEmail(true)) { // Очистить кеш // todo очистка кеша в одном файле с мультихуком // if (ab_inBoardCat($adv_cat) && $cache && $cfg['plugin']['advboard']['recentAdvCacheTime'] > 0) { // /** @var Memcache_driver $ab_CacheDrv */ // $ab_CacheDrv = ab_getCacheDrv(); // $cache_key = 'RECENT_ADVS'; // $advRealm = COT_DEFAULT_REALM; // $ab_CacheDrv->remove($cache_key, $advRealm); // } //Очистить кеш $advertUrl = $advert->getUrl(); if (!cot_url_check($advertUrl)) { $advertUrl = COT_ABSOLUTE_URL . $advertUrl; }
public function ajxAddAction() { $ret = array('error' => '', 'added' => array(), 'addedIds' => array(), 'removedIds' => array()); $ids = null; if (isset($_POST['ids'])) { if (is_array($_POST['ids'])) { $ids = cot_import('ids', 'P', 'ARR'); $ids = array_unique(array_map('intval', $ids)); } elseif (is_int($_POST['ids']) || ctype_digit($_POST['ids'])) { $tmp = cot_import('ids', 'P', 'INT'); if ($tmp) { $ids = array($tmp); } } } if (!$ids) { $ret['error'] = cot::$L['advboard_not_found']; echo json_encode($ret); exit; } $advertisement = advboard_model_Advert::find(array(array('id', $ids))); if (!$advertisement) { $ret['error'] = cot::$L['advboard_not_found']; echo json_encode($ret); exit; } foreach ($advertisement as $advRow) { if ($tmp = $this->addToCompare($advRow)) { $ret['added'][] = $tmp; } } $ret['count'] = count($_SESSION['advboard_compare'][cot::$sys['site_id']]); echo json_encode($ret); exit; }
/** * Рассылка уведомлений об истечении сроков публикации объявления */ public static function sendExpireNotify() { global $L; $cacheFileName = cot::$cfg["modules_dir"] . '/advboard/inc/send.txt'; if (file_exists($cacheFileName)) { $adv_send = file_get_contents($cacheFileName); } else { $adv_send = 0; } $tmp = getdate(cot::$sys['now']); $today = mktime(0, 0, 0, $tmp["mon"], $tmp["mday"], $tmp["year"]); // Рассылаем раз в сутки if ($today - $adv_send >= 86400) { // Период за который рассылаем if ($adv_send == 0) { // не разу не рассылали еще $adv_sendPer = cot::$cfg['advboard']['expNotifyPeriod']; } else { $adv_sendPer = floor(($today - $adv_send) / 86400); } // Уведомляем об истечении // Пока тупо шлем напоминание всем объявлениям у которых дата истечения // Больше той, когда заходили последний раз, но меньше текущей минус <уведомить за> $stDay = $tmp["mday"] + cot::$cfg['advboard']['expNotifyPeriod'] - $adv_sendPer; $periodStart = mktime(0, 0, 0, $tmp["mon"], $stDay, $tmp["year"]); if ($periodStart < cot::$sys['now']) { $periodStart = cot::$sys['now']; } $periodEnd = mktime(0, 0, 0, $tmp["mon"], $tmp["mday"] + cot::$cfg['advboard']['expNotifyPeriod'], $tmp["year"]); $condition = array(array('expire', $periodStart, '>='), array('expire', $periodEnd, '<'), array('state', advboard_model_Advert::PUBLISHED), array('user', 0, '>')); $advertisement = advboard_model_Advert::find($condition, 0, 0, array(array('id', 'ASC'))); $cnt = 0; if ($advertisement) { foreach ($advertisement as $advRow) { if (!$advRow->issetEmail(true)) { return false; } $advertUrl = $advRow->getUrl(); if (!cot_url_check($advertUrl)) { $advertUrl = COT_ABSOLUTE_URL . $advertUrl; } $advertEditUrl = $advRow->getEditUrl(); if (!cot_url_check($advertEditUrl)) { $advertEditUrl = COT_ABSOLUTE_URL . $advertEditUrl; } $myAdvsUrl = cot_url('advboard', 'm=user'); if (!cot_url_check($myAdvsUrl)) { $myAdvsUrl = COT_ABSOLUTE_URL . $myAdvsUrl; } $tmpL = $L; $text = $advRow->description; if (empty($text)) { $text = $advRow->text; } $user = null; $userLang = cot::$cfg['defaultlang']; $owner = $advRow->getOwner(); if ($owner['user_id'] > 0) { if (cot::$cfg['defaultlang'] != $owner['user_lang']) { $userLang = $owner['user_lang']; include cot_langfile('main', 'core', cot::$cfg['defaultlang'], $owner['user_lang']); include cot_langfile('advboard', 'module', cot::$cfg['defaultlang'], $owner['user_lang']); } } $mailView = new View(); $mailView->advert = $advRow; $mailView->user = $owner; $mailView->advertUrl = $advertUrl; $mailView->advertEditUrl = $advertEditUrl; $mailView->myAdvsUrl = $myAdvsUrl; $mailView->advertText = $text; $mailSubject = cot::$L['advboard_expire_title']; $mailBody = $mailView->render('advboard.notify_expire.' . $userLang . '.' . $advRow->category); if (cot_mail($advRow->getEmail(false, true), $mailSubject, $mailBody, '', false, null, true)) { $cnt++; } // Вернем язык на место $L = $tmpL; } } file_put_contents($cacheFileName, $today); return $cnt; } return 0; }
public static function adsList($condition = array(), $tpl = 'advboard.widget.list', $items = 0, $order = '', $onlyActive = true, $pagination = 'pld', $params = array()) { // Get pagination number if necessary if (!empty($pagination)) { list($pg, $d, $durl) = cot_import_pagenav($pagination, $items); } else { $d = 0; } if (empty($condition)) { $condition = array(); } if ($onlyActive) { $condition[] = array('begin', cot::$sys['now'], '<='); $condition[] = array('SQL', "expire = 0 OR expire > " . cot::$sys['now']); $condition[] = array('state', advboard_model_Advert::PUBLISHED); } if (empty($order)) { $order = array(array('state', 'ASC'), array('sort', 'DESC')); } /* === Hook === */ foreach (cot_getextplugins('advboard.widget.list.query') as $pl) { include $pl; } /* ===== */ $totallines = advboard_model_Advert::count($condition); $advertisement = advboard_model_Advert::find($condition, $items, $d, $order); // Render pagination if (empty($params['module'])) { $params['module'] = defined('COT_PLUG') ? 'plug' : cot::$env['ext']; } if (empty($params['urlParams'])) { if (defined('COT_LIST')) { global $list_url_path; $params['urlParams'] = $list_url_path; } elseif (defined('COT_PAGES')) { global $al, $id, $pag; $params['urlParams'] = empty($al) ? array('c' => $pag['page_cat'], 'id' => $id) : array('c' => $pag['page_cat'], 'al' => $al); } else { $params['urlParams'] = array(); } } if (empty($params['ajax'])) { $params['ajax'] = false; } if (empty($params['target_div'])) { $params['target_div'] = ''; } if (empty($params['ajax_module'])) { $params['ajax_module'] = ''; } if (empty($params['ajax_params'])) { $params['ajax_params'] = array(); } $pagenav = cot_pagenav($params['module'], $params['urlParams'], $d, $totallines, $items, $pagination, '', $params['ajax'], $params['target_div'], $params['ajax_module'], $params['ajax_params']); if (empty($pagenav['current'])) { $pagenav['current'] = 1; } $view = new View(); /* === Hook === */ foreach (cot_getextplugins('advboard.widget.list.view') as $pl) { include $pl; } /* ===== */ $view->advertisement = $advertisement; $view->totalitems = $totallines; $view->pagenav = $pagenav; return $view->render($tpl); }
public function deleteAction() { $id = cot_import('id', 'G', 'INT'); // id Объявления $b = cot_import('b', 'G', 'HTM'); // Куда вернуться /* === Hook === */ foreach (cot_getextplugins('advboard.delete.first') as $pl) { include $pl; } /* ===== */ // Права на любую категорию доски объявлений list(cot::$usr['auth_read'], cot::$usr['auth_write'], cot::$usr['isadmin']) = cot_auth('advboard', 'any'); cot_block(cot::$usr['auth_write']); $advert = advboard_model_Advert::getById($id); if (!$advert) { cot_die_message(404, TRUE); } if (!cot::$usr['isadmin']) { if ($advert->user != cot::$usr['id']) { cot_die_message(404, TRUE); } } $title = $advert->title; $userId = $advert->user; $advert->delete(); /* === Hook === */ foreach (cot_getextplugins('advboard.delete.done') as $pl) { include $pl; } /* ===== */ if (!empty($b)) { $b = unserialize(base64_decode($b)); } elseif (!empty($_SESSION['cot_com_back']) && !empty($_SESSION['cot_com_back']['advboard'])) { $b = $_SESSION['cot_com_back']['advboard']; unset($_SESSION['cot_com_back']['advboard']); } if (empty($b)) { $b = array('m' => 'user'); if ($userId != cot::$usr['id']) { $b['uid'] = $userId; } } cot_message(sprintf(cot::$L['advboard_deleted'], $title)); cot_redirect(cot_url('advboard', $b, '', true)); }
$sitemap_where['begin'] = array('begin', cot::$sys['now'], '<='); $sitemap_where['expire'] = array('SQL', "expire = 0 OR expire > " . cot::$sys['now']); /* === Hook === */ foreach (cot_getextplugins('sitemap.advboard.query') as $pl) { include $pl; } /* ===== */ $condition = array(); foreach ($sitemap_where as $key => $val) { $condition[] = $val; } $order = array(array('sort', 'DESC')); $cnt = advboard_model_Advert::count($condition); if ($cnt > 0) { $i = 0; while ($i <= $cnt) { $advertisement = advboard_model_Advert::find($condition, 20, $i, $order); if (!$advertisement) { break; } foreach ($advertisement as $advert) { $i++; if (!$auth_cache[$advert->category]) { continue; } sitemap_parse($t, $items, array('url' => $advert->url, 'date' => !empty($advert->updated) ? strtotime($advert->updated) : '', 'freq' => cot::$cfg['plugin']['sitemap']['freq'], 'prio' => cot::$cfg['plugin']['sitemap']['prio'])); unset($advert); } unset($advertisement); } }
<?php /* ==================== [BEGIN_COT_EXT] Hooks=users.edit.update.delete [END_COT_EXT] ==================== */ /** * Ads board module for Cotonti Siena * * @package Advboard * @author Kalnov Alexey <*****@*****.**> * @copyright (c) Portal30 Studio http://portal30.ru */ defined('COT_CODE') or die('Wrong URL'); require_once cot_incfile('advboard', 'module'); // Удалить все объявления пользователя $condition = array(array('user', $id)); $advertisement = advboard_model_Advert::find($condition, 20, $i, array(array('id', 'ASC'))); if (!empty($advertisement)) { foreach ($advertisement as $advert) { $advert->delete(); unset($advert); } unset($advertisement); }
Hooks=users.details.tags Tags=users.details.tpl:{USERS_DETAILS_ADVERT_SUBMITNEW}, {USERS_DETAILS_ADVERT_SUBMITNEW_URL}, {USERS_DETAILS_ADVERT_COUNT}, {USERS_DETAILS_ADVERT_URL} [END_COT_EXT] ==================== */ /** * Ads board module for Cotonti Siena * * @package Advboard * @author Kalnov Alexey <*****@*****.**> * @copyright (c) 2015 Portal30 Studio http://portal30.ru */ defined('COT_CODE') or die('Wrong URL'); require_once cot_incfile('advboard', 'module'); $submitNewAdv = ''; $submitNewAdvUrl = ''; if (cot_auth('advboard', 'any', 'W') || cot::$usr["isadmin"]) { $submitNewAdvUrl = cot_url('advboard', array('a' => 'edit')); $submitNewAdv = cot_rc_link($submitNewAdvUrl, cot::$L['advboard_add_new']); } $advUnValidated = $urr['user_id'] == cot::$usr['id'] || cot::$usr["isadmin"] || cot_auth('advboard', 'any', 'A'); $advCond = array(array('user', $urr['user_id'])); if (!$advUnValidated) { $advCond[] = array('begin', cot::$sys['now'], '<='); $advCond[] = array('SQL', "expire = 0 OR expire > " . cot::$sys['now']); $advCond[] = array('state', advboard_model_Advert::PUBLISHED); } //$advUrlParams = array('m'=>'details', 'id'=>$urr['user_id'],'u'=>$urr['user_name']); // //$advAjaxPParams = array('a'=>'userDetailsAdvList', 'uid'=>$urr['user_id']); $t->assign(array("USERS_DETAILS_ADVERT_SUBMITNEW" => $submitNewAdv, "USERS_DETAILS_ADVERT_SUBMITNEW_URL" => $submitNewAdvUrl, "USERS_DETAILS_ADVERT_COUNT" => advboard_model_Advert::count($advCond), "USERS_DETAILS_ADVERT_URL" => cot_url('advboard', array('m' => 'user', 'uid' => $urr['user_id']))));
protected function afterDelete() { // Обновить структуру // Наверное не учитываем состояние объявления, а считаем все. $count = advboard_model_Advert::count(array(array('category', $this->_data['category']))); static::$_db->update(cot::$db->structure, array('structure_count' => $count), "structure_area='advboard' AND structure_code = ?", $this->_data['category']); // Сбросим кеш структуры и главной страницы if (!empty(cot::$cache)) { cot::$cache->db->remove('structure', 'system'); if (cot::$cfg['cache_index']) { cot::$cache->page->clear('index'); } } return parent::afterDelete(); }
/** * Рендерит строку для сравнения объявлений * * Используется в шаблоне страницы сравнения * В Вашем шаблоне, возможно нужно будет использовать свою функцию * * @param advboard_model_Advert[] $compare * @param $field * @param string|array $params - Название или Массив параметров поля: * 'title' => название поля * 'prefix' => префикс * 'postfix' => постфикс * @return string */ function adv_compare_renderRow($compare, $field, $params = array()) { $predifined = array(); static $modelFields = false; static $counter = 0; if (empty($modelFields)) { $modelFields = advboard_model_Advert::fields(); } // if(empty($modelFields[$field]) && !in_array($field, $predifined)) return ''; $ret = ''; $found = false; $tmpVal = ''; $style = ''; if ($counter == 0) { $style = ' style="width: 130px"'; } foreach ($compare as $item) { $val = $item->{$field}; // var_dump($val); if (!empty($val)) { $found = true; } // Обработка значения if (isset($modelFields[$field])) { switch ($modelFields[$field]['type']) { case 'tinyint': case 'bool': $val = adv_YesNo(intval($val)); break; case 'int': case 'double': $val = $val != 0 ? $val : ''; break; case 'varchar': $val = $val != '' ? htmlspecialchars($val) : ''; break; } if (!in_array($modelFields[$field]['type'], array('tinyint', 'bool'))) { if (isset(cot::$L[$field . '_' . $val])) { $val = cot::$L[$field . '_' . $val]; } } } if ($val != '') { if ($field == 'price') { $val = number_format($val, 0, ',', ' '); } if (isset($params['prefix'])) { $val = $params['prefix'] . $val; } if (isset($params['postfix'])) { $val .= $params['postfix']; } } $tmpVal .= '<td class="text-center"' . $style . '>' . $val . '</td>'; } if (!$found) { return ''; } if (is_string($params)) { $params = array('title' => $params); } $params['title'] = isset($params['title']) ? $params['title'] : ""; if (empty($params['title']) && isset($modelFields[$field]['description'])) { $params['title'] = $modelFields[$field]['description']; } $style = ''; if ($counter == 0) { $style = ' style="width: 200px"'; } $ret = '<tr><td class="text-right"' . $style . '>' . htmlspecialchars($params['title']) . "</td>{$tmpVal}<td style=\"border: none\"></td></tr>"; $counter++; return $ret; }