Смена категории новости при наступлении указанной даты
Хак, добавляющий возможность автоматически сменить категорию(ии) новости при наступлении даты.
Зародился он еще в далеком 2013 году, и как выяснилось — очень полезный и нужный.
Работает на DLE 10, 10.1 , 9.x и на новых версиях не тестировался.
1. Выполнить запрос заменив префикс на свой:
Для utf-8:
CREATE TABLE IF NOT EXISTS `dle_post_expcat` ( `id` int(11) NOT NULL AUTO_INCREMENT, `news_id` int(11) NOT NULL DEFAULT '0', `expires` varchar(15) NOT NULL DEFAULT '', `category` varchar(200) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `news_id` (`news_id`), KEY `expires` (`expires`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Для cp-1251 (windows-1251):
CREATE TABLE IF NOT EXISTS `dle_post_expcat` ( `id` int(11) NOT NULL AUTO_INCREMENT, `news_id` int(11) NOT NULL DEFAULT '0', `expires` varchar(15) NOT NULL DEFAULT '', `category` varchar(200) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `news_id` (`news_id`), KEY `expires` (`expires`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
2. Открыть engine/inc/addnews.php
Найти:
Calendar.setup({ inputField : "e_date_c", // id of the input field ifFormat : "%Y-%m-%d", // format of the input field button : "e_trigger_c", // trigger for the calendar (button ID) align : "Br", // alignment singleClick : true }); </script></td> </tr> <tr> <td colspan="2"><div class="hr_line"></div></td> </tr>
Добавить ниже:
<tr> <td height="29" style="padding-left:5px;">Когда наступит дата:</td> <td><input type="text" name="expires_cat" id="e_date_cat" size="20" class="edit bk"> <img src="engine/skins/images/img.gif" align="absmiddle" id="e_trigger_cat" style="cursor: pointer; border: 0" /> То перенести в: <select data-placeholder="{$lang['addnews_cat_sel']}" name="expires_category[]" id="expires_category" onchange="onCategoryChange(this)" $category_multiple style="width:350px;"> {$categories_list} </select> <a href="#" class="hintanchor" onMouseover="showhint('Когда наступит указанная дата, то новость будет перемещена в указанные категории.', this, event, '320px')">[?]</a> <script type="text/javascript"> Calendar.setup({ inputField : "e_date_cat", // id of the input field ifFormat : "%Y-%m-%d", // format of the input field button : "e_trigger_cat", // trigger for the calendar (button ID) align : "Br", // alignment singleClick : true }); </script></td> </tr> <tr> <td colspan="2"><div class="hr_line"></div></td> </tr>
Найти:
} else $expires = '';
Добавить ниже:
/* // Получаем время истечения категории // в переменную $expires_cat */ if( trim( $_POST['expires_cat'] ) != "" ) { $expires_cat = $_POST['expires_cat']; if( (($expires_cat = strtotime( $expires_cat )) === - 1) OR !$expires_cat ) { msg( "error", $lang['addnews_error'], $lang['addnews_erdate'], "javascript:history.go(-1)" ); } } else $expires_cat = '';
Найти:
if( $_POST['tags'] != "" and $approve ) {
Добавить ВЫШЕ:
/* // Если время истечения не пустое // То заносим в базу данных это время и категории куда перенести по истечению */ if( $expires_cat ) { $expires_category = $_POST['expires_category']; if( !count( $expires_category ) ) { $expires_category = array (); $expires_category[] = '0'; } $expires_category_list = array(); foreach ( $expires_category as $value ) { $expires_category_list[] = intval($value); } $expires_category_list = $db->safesql( implode( ',', $expires_category_list ) ); $db->query( "INSERT INTO " . PREFIX . "_post_expcat (news_id, expires, category) VALUES('{$row}', '$expires_cat', '$expires_category_list')" ); }
3. Открыть engine/modules/cron.php
Найти:
$db->query( "DELETE FROM " . USERPREFIX . "_banned WHERE days != '0' AND date < '$_TIME' AND users_id = '0'" ); @unlink( ENGINE_DIR . '/cache/system/banned.php' );
Добавить ниже:
$sql_cron = $db->query( "SELECT news_id, category FROM " . PREFIX . "_post_expcat WHERE expires <= '" . $_TIME . "'" ); while ( $row = $db->get_row( $sql_cron ) ) { $db->query( "UPDATE " . PREFIX . "_post SET category='{$row['category']}' WHERE id='{$row['news_id']}'" ); } $db->query( "DELETE FROM " . PREFIX . "_post_expcat WHERE expires <= '" . $_TIME . "'" ); $db->free( $sql_cron );
4. Открыть engine/inc/editnews.php
Найти:
$cat_list = explode( ',', $row['category'] ); $have_perm = 0;
Добавить ниже:
$sql_expcat = $db->query( "SELECT category FROM " . PREFIX . "_post_expcat WHERE news_id='{$row['id']}'" ); $sql_expcat = $db->get_row( $sql_expcat ); $cat_list_exp = explode( ',', $sql_expcat['category'] ); $db->free( $sql_expcat );
Найти:
$categories_list = CategoryNewsSelection( $cat_list, 0 );
Добавить ниже:
$categories_list_exp = CategoryNewsSelection( $cat_list_exp, 0 );
Найти:
if ( $expires['expires'] ) $expires['expires'] = date("Y-m-d", $expires['expires']);
Добавить ниже:
$expires_cat = $db->super_query( "SELECT * FROM " . PREFIX . "_post_expcat where news_id = '{$row['id']}'" ); if ( $expires_cat['expires'] ) $expires_cat['expires'] = date("Y-m-d", $expires_cat['expires']);
Найти:
button : "e_trigger_c", // trigger for the calendar (button ID) align : "Br", // alignment singleClick : true }); </script></td> </tr>
Добавить ниже:
<tr> <td colspan="2"><div class="hr_line"></div></td> </tr> <tr> <td height="29" style="padding-left:5px;">Когда наступит дата:</td> <td><input type="text" name="expires_cat" id="e_date_cat" size="20" class="edit bk" value="{$expires_cat['expires']}"> <img src="engine/skins/images/img.gif" align="absmiddle" id="e_trigger_cat" style="cursor: pointer; border: 0" /> Перенести в: <select data-placeholder="{$lang['addnews_cat_sel']}" name="expires_category[]" id="expires_category" onchange="onCategoryChange(this)" $category_multiple style="width:350px;"> {$categories_list_exp} </select> <a href="#" class="hintanchor" onMouseover="showhint('По наступлению даты новость будет перенесена в выбранные категории', this, event, '320px')">[?]</a> <script type="text/javascript"> Calendar.setup({ inputField : "e_date_cat", // id of the input field ifFormat : "%Y-%m-%d", // format of the input field button : "e_trigger_cat", // trigger for the calendar (button ID) align : "Br", // alignment singleClick : true }); </script></td> </tr>
Найти:
$no_permission = FALSE; $okdeleted = FALSE; $okchanges = FALSE;
Добавить ВЫШЕ:
if ($_POST['expires_cat'] ) { $expires_cat_change = true; } else $expires_cat_change = false;
Найти:
// Смена автора публикации if( $member_id['user_group'] == 1 AND $_POST['new_author'] != $_POST['old_author'] ) {
Добавить ВЫШЕ:
if ( $expires_cat_change ) { /* // Получаем время истечения категории // в переменную $expires_cat */ if( trim( $_POST['expires_cat'] ) != "" ) { $expires_cat = $_POST['expires_cat']; if( (($expires_cat = strtotime( $expires_cat )) === - 1) OR !$expires_cat ) { msg( "error", $lang['addnews_error'], $lang['addnews_erdate'], "javascript:history.go(-1)" ); } } else $expires_cat = ''; /* // Если время истечения не пустое то заносим в базу // Иначе удаляем */ if( $expires_cat ) { $db->query( "DELETE FROM " . PREFIX . "_post_expcat WHERE news_id='$item_db[0]'" ); $expires_category = $_POST['expires_category']; if( !count( $expires_category ) ) { $expires_category = array (); $expires_category[] = '0'; } $expires_category_list = array(); foreach ( $expires_category as $value ) { $expires_category_list[] = intval($value); } $expires_category_list = $db->safesql( implode( ',', $expires_category_list ) ); $db->query( "INSERT INTO " . PREFIX . "_post_expcat (news_id, expires, category) VALUES('$item_db[0]', '$expires_cat', '$expires_category_list')" ); } else { $db->query( "DELETE FROM " . PREFIX . "_post_expcat WHERE news_id='$item_db[0]'" ); } }
Информация по теме