Смена категории новости при наступлении указанной даты


Хак, добавляющий возможность автоматически сменить категорию(ии) новости при наступлении даты.

Зародился он еще в далеком 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]'" );
}
}
Информация по теме