Заметки новичка

Автор блога:
Все рубрики (4)

Добавляем порядок сортировки

Столкнулся с необходимостью некоторые записи в каталоге принудительно поднимать наверх (оплаченная реклама) либо опускать вниз (нехорошие люди, которых надо знать, но не рекламировать).
Штатными средствами это не делалось, поэтому немного доработал компонент универсального каталога.
Первым делом добавляем поле сортировки в таблицу:

Код PHP:
ALTER TABLE `cms_uc_items` ADD `sortorder` INT NOT NULL DEFAULT '0';
Затем редактируем файл /admin/components/catalog/backend.php, чтобы появилось новое поле на форме создания/редактирования записки каталога, и чтбы это поле сохранялось в базе:
после строки примерно 275
Код PHP:
$item['cat_id'] = $inCore->request('cat_id', 'int', 0);
вставляем строку
Код PHP:
$item['sortorder'] = $inCore->request('sortorder', 'int', 0);
после строки примерно 348
Код PHP:
$id = $inCore->request('item_id', 'int');
вставляем строку
Код PHP:
$item['sortorder'] = $inCore->request('sortorder', 'int');
после строки примерно 957
Код PHP:
<div><input name="tags" type="text" id="tags" style="width:99%" value="<?php if (isset($mod['id'])) { echo cmsTagLine('catalog', $mod['id'], false); } ?>" /></div>
вставляем 2 строки
Код PHP:
                        <div><strong>Порядок сортировки (по умолчанию 0, для поднятия наверх вводите отрицательные числа, для опускания вниз - положительные)</strong></div>
                        <div><input name="sortorder" type="text" id="sortorder" style="width:99%" value="<?php if (isset($mod['sortorder'])) { echo $mod['sortorder']; } ?>" /></div>
Редактируем файл /components/catalog/model.php, чтобы работала сортировка с учетом нашего нового поля в каталоге:
после строки примерно 80
Код PHP:
canmany='{$item['canmany']}',
вставляем строку
Код PHP:
sortorder='{$item['sortorder']}',
блок в строке примерно 117
Код PHP:
        $sql = "INSERT INTO cms_uc_items (category_id, title, pubdate, published, imageurl, fieldsdata, is_comments, tags, rating, meta_desc, meta_keys, price, canmany, user_id, on_moderate)
                VALUES ({$item['cat_id']}, '{$item['title']}', '{$item['pubdate']}', '{$item['published']}',
                        '{$item['file']}', '{$item['fields']}', {$item['is_comments']}, '{$item['tags']}', 0,
                        '{$item['meta_desc']}', '{$item['meta_keys']}', '{$item['price']}', {$item['canmany']}, {$inUser->id}, {$item['on_moderate']})";
меняем на
Код PHP:
    $sortorder = isset($item['sortorder']) ? $item['sortorder'] : 0;
        $sql = "INSERT INTO cms_uc_items (category_id, title, pubdate, published, imageurl, fieldsdata, is_comments, tags, rating, meta_desc, meta_keys, price, canmany, user_id, on_moderate, sortorder)
                VALUES ({$item['cat_id']}, '{$item['title']}', '{$item['pubdate']}', '{$item['published']}',
                        '{$item['file']}', '{$item['fields']}', {$item['is_comments']}, '{$item['tags']}', 0,
                        '{$item['meta_desc']}', '{$item['meta_keys']}', '{$item['price']}', {$item['canmany']}, {$inUser->id}, {$item['on_moderate']}, {$sortorder})";
        $this->inDB->query($sql);
Редактируем файл /components/catalog/psearch.php, чтобы сортировка срабатывала и в результатах поиска:
после строки 31
Код PHP:
$place = $item['cat'];
вставляем строку
Код PHP:
$sortorder=$item['sortorder'];
и строки
Код PHP:
                    $sql = "INSERT INTO cms_search (`id`, `session_id`, `title`, `link`, `place`, `placelink`)
                            VALUES ('', '".session_id()."', '".$item['title']."', '$link', '$place', '$placelink')";
меняем на
Код PHP:
                    $sql = "INSERT INTO cms_search (`id`, `session_id`, `title`, `link`, `place`, `placelink`, `sortorder`, `imageurl`)
                            VALUES ('', '".session_id()."', '".$item['title']."', '$link', '$place', '$placelink', '$sortorder', '$imageurl')";
Вроде все, если ничего не забыл smile

В итоге в рубриках каталога и результатах поиска записи с отрицательными значениями порядка сортировки выводятся первыми (тем выше, чем выше "минус"), с положительными - ниже. Ну а с основной массой дефолтных "нулевых" ничего особенного не происходит.
Когда новую запись создает/редактирует пользователь в каталоге, а не администратор из админки, поля для присвоения порядка сортировки не выводится, потому что нам не нужны махинации пользователей smile

Чиним форум

Обнаружил уже давно проблему в 1.6.2 - не работала подписка на новые сообщения в форуме.
Решилась проблема очень просто (причиной была простая опечатка разработчиков):

В файле /components/forum/frontend.php
меняем
Код PHP:
cmsUser::isSubscribed($inUser->id, 'forum', $id);
на
Код PHP:
cmsUser::subscribe($inUser->id, 'forum', $id);

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

Итак, исходная ситуация - двухуровневые категории доски объявлений. Т.е. топ-раздел "Недвижимость", подразделы "Риэлтеры", "аренда", "Офисы" и т.п.
В оригинальной версии доски при входе в нее показывало в скобочках (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;}
Все. На трехуровневых не проверял, но скорее всего работать не будет. Только для двухуровневых категорий. Впрочем, двух уровней вполне достаточно, я полагаю.

Флэш-баннеры и выпадающие меню

Только что столкнулся с проблемой. У меня прямо под выпадающим меню два баннеро-места. Когда меню выпадало над флэш-баннером, текст меня оказывался скрыт флэшкой.

Решение для сборки Hope от MaxiSoft&#8217;a:

1. Ищем файл /components/banners/model.php
2. Ищем в нем строку
Код PHP:
'<param name="quality" value="high" />'."\n".
3. Добавляем после нее
Код PHP:
'<param name="wmode" value="transparent">'."\n".
4. Добавляем в тэг embed парой строк ниже параметр wmode="transparent"

Радуемся жизни, ибо теперь меню раскрывается поверх флэшек smile