Файл: admin/applications/forums/extensions/modcp/plugin_announcements.php
Строк: 706
<?php
/**
* @file plugin_announcements.php Moderator control panel plugin: manage announcements
*~TERABYTE_DOC_READY~
* $Copyright: (c) 2001 - 2011 Invision Power Services, Inc.$
* $License: http://www.invisionpower.com/company/standards.php#license$
* $Author: AndyMillne $
* @since 2/18/2011
* $LastChangedDate: 2012-05-30 10:45:05 -0400 (Wed, 30 May 2012) $
* @version v3.3.3
* $Revision: 10821 $
*/
if ( ! defined( 'IN_IPB' ) )
{
print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded 'admin.php'.";
exit();
}
/**
*
* @class plugin_forums_announcements
* @brief Moderator control panel plugin: manage announcements
*
*/
class plugin_forums_announcements
{
/**
* Registry Object Shortcuts
*
* @var $registry
* @var $DB
* @var $settings
* @var $request
* @var $lang
* @var $member
* @var $memberData
* @var $cache
* @var $caches
*/
protected $registry;
protected $DB;
protected $settings;
protected $request;
protected $lang;
protected $member;
protected $memberData;
protected $cache;
protected $caches;
/**
* Main function executed automatically by the controller
*
* @param object $registry Registry object
* @return @e void
*/
public function __construct( ipsRegistry $registry )
{
//-----------------------------------------
// Make shortcuts
//-----------------------------------------
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->member = $this->registry->member();
$this->memberData =& $this->registry->member()->fetchMemberData();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->lang = $this->registry->class_localization;
}
/**
* Returns the primary tab key for the navigation bar
*
* @return @e string
*/
public function getPrimaryTab()
{
return 'announcements';
}
/**
* Returns the secondary tab key for the navigation bar
*
* @return @e string
*/
public function getSecondaryTab()
{
return 'announcements';
}
/**
* Determine if we can view tab
*
* @param array $permissions Moderator permissions
* @return @e bool
*/
public function canView( $permissions )
{
if( $this->memberData['g_is_supmod'] )
{
return true;
}
return false;
}
/**
* Execute plugin
*
* @param array $permissions Moderator permissions
* @return @e string
*/
public function executePlugin( $permissions )
{
//-----------------------------------------
// Check permissions
//-----------------------------------------
if( !$this->canView( $permissions ) )
{
return '';
}
//-----------------------------------------
// Doing something else?
//-----------------------------------------
switch( $this->request['_do'] )
{
case 'delete':
return $this->_delete();
break;
case 'add':
case 'edit':
return $this->_form( $this->request['_do'] );
break;
case 'save':
return $this->_save( $this->request['type'] );
break;
}
//-----------------------------------------
// INIT
//-----------------------------------------
$announcements = array();
//-----------------------------------------
// Get announcements
//-----------------------------------------
$this->DB->build( array(
'select' => 'a.*',
'from' => array( 'announcements' => 'a' ),
'order' => 'a.announce_end DESC',
'add_join' => array(
array( 'select' => 'm.member_id, m.members_display_name, m.member_group_id, m.members_seo_name',
'from' => array( 'members' => 'm' ),
'where' => 'm.member_id=a.announce_member_id',
'type' => 'left'
)
)
) );
$this->DB->execute();
while ( $r = $this->DB->fetch() )
{
$r['announce_seo_title'] = $r['announce_seo_title'] ? $r['announce_seo_title'] : IPSText::makeSeoTitle( $r['announce_title'] );
if ( $r['announce_forum'] == '*' )
{
$r['announce_forum_show'] = $this->lang->words['announce_page_allforums'];
}
else
{
$tmp_forums = explode(",",$r['announce_forum']);
if ( is_array( $tmp_forums ) and count($tmp_forums) )
{
if ( count($tmp_forums) > 5 )
{
$r['announce_forum_show'] = count($tmp_forums) . ' ' . $this->lang->words['announce_page_numforums'];
}
else
{
$r['_forums'] = array();
foreach( $tmp_forums as $id )
{
$r['_forums'][] = array( $id, $this->registry->getClass('class_forums')->forum_by_id[ $id ]['name'] );
}
}
}
}
$announcements[] = $r;
}
return $this->registry->getClass('output')->getTemplate('modcp')->modAnnouncements( $announcements );
}
/**
* Delete announcement
*
* @return @e void
*/
protected function _delete()
{
if ( $this->request['secure_key'] != $this->member->form_hash )
{
$this->registry->output->showError( 'no_permission', 10311902, null, null, 403 );
}
$announce_id = intval( $this->request['announce_id'] );
//-----------------------------------------
// Delete it
//-----------------------------------------
$this->DB->delete( 'announcements', 'announce_id=' . $announce_id );
//-----------------------------------------
// Update cache and redirect
//-----------------------------------------
$this->registry->cache()->rebuildCache( 'announcements', 'forums' );
$this->registry->getClass('output')->redirectScreen( $this->lang->words['announcement_deleted'], $this->settings['base_url']."app=core&module=modcp&tab=announcements&fromapp=forums" );
}
/**
* Show announcement form
*
* @param string $type Add or edit
* @param string $msg Message to show
* @return @e string
*/
protected function _form( $type='add', $msg='' )
{
//-----------------------------------------
// INIT the editor/bbcode classes
//-----------------------------------------
IPSText::getTextClass( 'bbcode' )->parsing_section = 'announcement';
//-----------------------------------------
// Set up
//-----------------------------------------
if ( $type == 'add' )
{
$announce = array( 'announce_active' => 1, 'announce_id' => 0 );
}
else
{
$announce_id = intval( $this->request['announce_id'] );
$announce = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'announcements', 'where' => 'announce_id='.$announce_id ) );
$announce['announce_forum'] = explode( ",", $announce['announce_forum'] );
$announce['announce_start'] = $announce['announce_start'] ? strftime( '%m-%d-%Y', $announce['announce_start'] ) : '';
$announce['announce_end'] = $announce['announce_end'] ? strftime( '%m-%d-%Y', $announce['announce_end'] ) : '';
}
//-----------------------------------------
// Do we have _POST?
//-----------------------------------------
foreach( array( 'announce_html_enabled', 'announce_title', 'announce_post', 'announce_start', 'announce_end', 'announce_forum', 'announce_active' ) as $bit )
{
if ( !empty($this->request[$bit]) )
{
$announce[ $bit ] = $bit == 'announce_post' ? $_POST[ $bit ] : $this->request[ $bit ];
}
else if( !isset($announce[ $bit] ) )
{
$announce[ $bit ] = null;
}
}
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/editor/composite.php', 'classes_editor_composite' );
$editor = new $classToLoad();
$editor->setAllowHtml( $announce['announce_html_enabled'] );
$_editor = $editor->show( 'announce_post', array( 'type' => 'full' ), $announce['announce_post'] );
//-----------------------------------------
// Forums
//-----------------------------------------
$forum_html = "<option value='*'>" . $this->lang->words['announce_form_allforums'] . "</option>" . $this->registry->getClass('class_forums')->forumsForumJump( false, true, true );
//-----------------------------------------
// Save forums?
//-----------------------------------------
if ( is_array( $announce['announce_forum'] ) and count( $announce['announce_forum'] ) )
{
foreach( $announce['announce_forum'] as $f )
{
$forum_html = preg_replace( "#options+value=["'](".preg_quote($f,'#').")["']#i", "option value='\1' selected='selected'", $forum_html );
}
}
$announce['announce_active_checked'] = $announce['announce_active'] ? 'checked="checked"' : '';
$announce['html_checkbox'] = $announce['announce_html_enabled'] ? "checked='checked' " : '';
$announce['nlbr_checkbox'] = $announce['announce_nlbr_enabled'] ? "checked='checked' " : '';
return $this->registry->getClass('output')->getTemplate('modcp')->modAnnounceForm( $announce, $forum_html, $type, $_editor, $msg );
}
/**
* Add or update an announcement
*
* @param string $type add|edit
* @return @e void
*/
protected function _save( $type='add' )
{
if ( $this->request['secure_key'] != $this->member->form_hash )
{
$this->registry->output->showError( 'no_permission', 10311903, null, null, 403 );
}
//-----------------------------------------
// INIT
//-----------------------------------------
$forums_to_save = "";
$start_date = 0;
$end_date = 0;
$announce_id = intval( $this->request['announce_id'] );
//-----------------------------------------
// check...
//-----------------------------------------
if ( ! $this->request['announce_title'] or ! $this->request['announce_post'] )
{
return $this->_form( $type, $this->lang->words['announce_error_title'] );
}
//-----------------------------------------
// Get forums to add announce in
//-----------------------------------------
if ( is_array( $this->request['announce_forum'] ) and count( $this->request['announce_forum'] ) )
{
if ( in_array( '*', $this->request['announce_forum'] ) )
{
$forums_to_save = '*';
}
else
{
$forums_to_save = implode( ",", $this->request['announce_forum'] );
}
}
if ( ! $forums_to_save )
{
return $this->_form( $type, $this->lang->words['announce_error_forums'] );
}
//-----------------------------------------
// Check Dates
//-----------------------------------------
if ( strstr( $this->request['announce_start'], '-' ) )
{
$start_array = explode( '-', $this->request['announce_start'] );
if ( $start_array[0] and $start_array[1] and $start_array[2] )
{
if ( ! checkdate( $start_array[0], $start_array[1], $start_array[2] ) )
{
return $this->_form( $type, $this->lang->words['announce_error_date'] );
}
}
$start_date = mktime( 12, 0, 0, $start_array[0], $start_array[1], $start_array[2] );
}
if ( strstr( $this->request['announce_end'], '-' ) )
{
$end_array = explode( '-', $this->request['announce_end'] );
if ( $end_array[0] and $end_array[1] and $end_array[2] )
{
if ( ! checkdate( $end_array[0], $end_array[1], $end_array[2] ) )
{
return $this->_form( $type, $this->lang->words['announce_error_date'] );
}
}
$end_date = mktime( 12, 0, 0, $end_array[0], $end_array[1], $end_array[2] );
}
//-----------------------------------------
// Sort out the content
//-----------------------------------------
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/editor/composite.php', 'classes_editor_composite' );
$editor = new $classToLoad();
$editor->setAllowBbcode( true );
$editor->setAllowHtml( intval($this->request['announce_html_enabled']) );
$announceContent = $editor->process( $_POST['announce_post'] );
IPSText::getTextClass( 'bbcode' )->bypass_badwords = 1;
IPSText::getTextClass( 'bbcode' )->parse_smilies = 1;
IPSText::getTextClass( 'bbcode' )->parse_html = intval($this->request['announce_html_enabled']);
IPSText::getTextClass( 'bbcode' )->parse_nl2br = $this->request['announce_html_enabled'] ? $this->request['announce_nlbr_enabled'] : 0;
IPSText::getTextClass( 'bbcode' )->parse_bbcode = 1;
IPSText::getTextClass( 'bbcode' )->parsing_section = 'announcement';
$announceContent = IPSText::getTextClass( 'bbcode' )->preDbParse( $announceContent );
//-----------------------------------------
// Build save array
//-----------------------------------------
$save_array = array( 'announce_title' => $this->request['announce_title'],
'announce_post' => $announceContent,
'announce_active' => $this->request['announce_active'] ? $this->request['announce_active'] : 0,
'announce_forum' => $forums_to_save,
'announce_html_enabled' => $this->request['announce_html_enabled'] ? $this->request['announce_html_enabled'] : 0,
'announce_nlbr_enabled' => $this->request['announce_nlbr_enabled'] ? $this->request['announce_nlbr_enabled'] : 0,
'announce_start' => $start_date,
'announce_end' => $end_date,
'announce_seo_title' => IPSText::makeSeoTitle( $this->request['announce_title'] ),
);
//-----------------------------------------
// Save..
//-----------------------------------------
if ( $type == 'add' )
{
$save_array['announce_member_id'] = $this->memberData['member_id'];
$this->DB->insert( 'announcements', $save_array );
}
else
{
if ( $announce_id )
{
$this->DB->update( 'announcements', $save_array, 'announce_id=' . $announce_id );
}
}
//-----------------------------------------
// Update cache
//-----------------------------------------
$this->registry->cache()->rebuildCache( 'announcements', 'forums' );
$this->registry->getClass('output')->redirectScreen( $this->lang->words['announcement_saved'], $this->settings['base_url'] . "app=core&module=modcp&tab=announcements&fromapp=forums" );
}
}