Улучшение (я надеюсь) доски объявлений

1383
Итак, исходная ситуация - двухуровневые категории доски объявлений. Т.е. топ-раздел "Недвижимость", подразделы "Риэлтеры", "аренда", "Офисы" и т.п.
В оригинальной версии доски при входе в нее показывало в скобочках (0/3) - 0 объявлений в рубрике "Недвижимость", 3 подрубрики.
Я переделал так, чтобы вместо нуля показывало сумму объявлений в тех трех подрубриках. Программист из меня не очень, так что код не оптимальный наверняка, но рабочий. Итак, ковыряю я сборку Хоуп, в стандарте что-то аналогичное наверняка:
1. В файле /components/board/model.php добавляем функцию для подсчета объявленій во всех подрубриках данной рубрики:
Код PHP:
    public function getSubObsCount($category_id) {
        $cats = array();

        $sql = "SELECT c.*, IFNULL(COUNT(i.id), 0) as content_count
                FROM cms_board_cats c
                LEFT JOIN cms_board_items i ON i.category_id = c.id AND i.published = 1
                WHERE c.published = 1 AND c.parent_id = $category_id
                GROUP BY c.id
                ORDER BY title ASC";
        $result = $this->inDB->query($sql);
$res_array = array();
for ($count=0; $row = @mysql_fetch_array($result); $count++)
   $res_array[$count] = $row;
$cc = 0;
foreach($res_array as $row) {
$cc = $cc + $row['content_count'];
}
return $cc;
    }
2. В файле /components/board/frontend.php находим строку
Код PHP:
$sub = $model->getSubCatsCount($cat['id']);
и после нее добавляем
Код PHP:
		$cc = $model->getSubObsCount($cat['id']);
		if ($sub>0) {$cat['content_count'] = $cc;}
Все. На трехуровневых не проверял, но скорее всего работать не будет. Только для двухуровневых категорий. Впрочем, двух уровней вполне достаточно, я полагаю.
Флэш-баннеры и выпадающие меню | Чиним форум
Комментарии (13)
0 25 июля 2010 в 17:43 +1
А если установить не на hope версию а на простую, будет работать?
0 25 июля 2010 в 17:50 +1
Не ставил, но на вскидку код в данной части не особо модифицирован. Процентов на 99 уверен, что будет.
0 25 июля 2010 в 17:54 +1
Скиньте сюда скрин пожалуйста как это будет выглядеть. Чтобы было наглядней как говорится. smile
0 25 июля 2010 в 18:26 +1
Не знаю, как добавить теперь. Вот ссылка: http://uniton.by/images/board-sample.jpg
0 25 июля 2010 в 18:50 +2
Вы думаете что простой пользователь разберется что это за цифры? я например понял что 2 надо разделить на 8.  laugh
Надо придумать иное решение, чтобы понятно было простым юзерам. smile
0 25 июля 2010 в 19:20 +4
Ну, тогда меняем в файле фронтенда там же, где вносили исходные поправки, пару строчек:
Код PHP:
		if ($sub>0) {$cat['content_count'] = 'Объявлений: '.$cc;}
			$cat['subtext']     = $sub ? ' / Рубрик: '.$sub : '';
и получаем на странице главных категория в скобочках нечто вроде (Объявлений: 20 / Рубрик: 5)
0 27 июля 2010 в 03:54 +1
Установил сегодня на оригинальную версию 1.6.2 - работает.
Вопрос возник, можно ли сделать так, чтобы за пару дней до истечения срока объявления автору высылалось письмо либо личное сообщение о необходимости создать новое объявление? Или, как вариант, присылалась ссылка, ткнув в которую, он мог бы автоматом продлить его на тот же срок?
Не уверен, что сам такую модификацию осилю...
Barrio 2 сентября 2010 в 18:21 0
Код PHP:
$sql = "SELECT i.title, i.id, i.city as city, u.id as user_id, u.nickname as nickname,
					   i.pubdate as pubdate
				
				FROM cms_board_cats cat, cms_board_items i
  				LEFT OUTER JOIN cms_users u
    			ON i.user_id = u.id
				WHERE i.published = 1 $catsql
				ORDER BY i.pubdate DESC";
так будет выводиться в модуле последних объявлений объявления от гостей, спасибо максисофту
чтобы
0 2 сентября 2010 в 18:40 0
А гости могут добавлять объявления? Чет я запамятовал smile
Кстати говоря, отправку уведомления за два дня до истечения срока подачи объявления я сделал, но забыл как sad
Barrio 3 сентября 2010 в 03:31 0
могут =)
Barrio 3 сентября 2010 в 03:31 0
вспомни плиз? :)
0 7 сентября 2010 в 21:51 0
В файле /components/board/model.php в строке 129 меняем "i.published = 1" на "i.published > 0"
и меняем последнюю функцию на такую:

Код PHP:
public function db_result_to_array($result)
  {
    $res_array = array();
    for ($count=0; $row = @mysql_fetch_array($result); $count++)
      $res_array[$count] = $row;
    return $res_array;
  }

    public function deleteOldRecords() {

        $inCore = cmsCore::getInstance();

        $cfg = $inCore->loadComponentConfig('board');
        if (!isset($cfg['aftertime'])) { $cfg['aftertime'] = ''; }

        if ($cfg['aftertime']){            
            $time_sql = '';
            switch ($cfg['aftertime']){
                case 'delete':  $time_sql = "DELETE FROM cms_board_items WHERE DATEDIFF(NOW(), pubdate) > pubdays AND pubdays > 0"; break;
                case 'hide':    $time_sql = "UPDATE cms_board_items SET published = 0 WHERE DATEDIFF(NOW(), pubdate) > pubdays AND pubdays > 0"; break;
            }       
//Добавляем уведомление пользователя о непоправимом горе с его объявлением
// собираем список истекающих в ближайшие 2 дня объявлений
  $query = "SELECT * FROM cms_board_items WHERE DATEDIFF(NOW(), pubdate) > (pubdays-2) AND pubdays > 0 AND published=1";
  $result = mysql_query($query);
    $list = array();
    for ($count=0; $row = @mysql_fetch_array($result); $count++)
      $list[$count] = $row;
// проходим по собранному списку и рассылаем уведомления
  foreach($list as $row){
    $title = $row['title'];
    $to_email = $row['email'];
    $id = $row['id'];
    $query = "SELECT `id`, `nickname`, `email` FROM cms_users WHERE id = ".$row['user_id'];
    $result = mysql_query($query);
    $res_array = array();
    for ($count=0; $row = @mysql_fetch_array($result); $count++)
      $res_array[$count] = $row;
    $author = $res_array[0];
// в следующей строке зашит адрес сайта - меняем на свое или на языковую переменную (лучше, но я поленился ее искать)
	$subj = "Ваше объявление на сайте uniton.by будет удалено через 2 дня";
	if ($to_email=="") { $to_email = $author['email']; }
// включаем текст из шаблона, который создаем в файле /includes/letters/boarditemexpired.txt
	$letter_path    = PATH.'/includes/letters/boarditemexpired.txt';
	$letter         = file_get_contents($letter_path);
	$letter = str_replace('{title}', $title, $letter);
	$inCore->mailText($to_email, $subj, $letter);
// исправляем поле published с 1 на 2 - это даст знать нашему моду,
// что уведомление по данному объявлению уже было отправлено,
// и не надо слать еще одно
        mysql_query("UPDATE cms_board_items SET published = 2 WHERE id = $id");
  }
// конец модификации для расылки уведомлений
            if ($time_sql){
                $this->inDB->query($time_sql) or die(mysql_error());
            }
        }
        return true;
    }
Еще создаем файл /includes/letters/boarditemexpired.txt с текстом типа "Ваше объявление будет удалено через два дня, примите меры!".

Если не работает - пишем сюда, и я пытаюсь вспомнить, что еще не так...
0 2 апреля 2011 в 00:39 0
Ребята,помогите пожалуйста!Не работает доска объявлений(нельзя добавлять объявления).Посоветуйте что делать плиз!Сайт http://goldfleece.com.ua/