File: /var/www/ilya/data/www/irkboard.ru/admin/applications/forums/extensions/searchDisplay.php
<?php
/**
* Invision Power Services
* IP.Board v3.0.1
* Formats forum search results
* Last Updated: $Date: 2009-07-10 23:44:32 -0400 (Fri, 10 Jul 2009) $
*
* @author $author$
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/community/board/license.html
* @package Invision Power Board
* @subpackage Forums
* @link http://www.invisionpower.com
* @version $Rev: 4870 $
**/
class forumsSearchDisplay implements iSearchDisplay
{
/**
* Last topic id completed
*
* @access private
* @var integer Topic id
*/
private $last_topic = 0;
/**
* The search plugin for this app
*
* @access public
* @var object
*/
public $search_plugin;
/**
* Formats the forum search result for display
*
* @access public
* @param array $search_row Array of data from search_index
* @param bool $isVnc Is from view new content
* @return mixed Formatted content, ready for display, or array containing a $sub section flag, and content
**/
public function formatContent( $search_row, $isVnc=false )
{
/* Get class forums, used for displaying forum names on results */
if( ipsRegistry::isClassLoaded('class_forums') !== TRUE )
{
require_once( IPSLib::getAppDir( 'forums' ) . "/sources/classes/forums/class_forums.php" );
ipsRegistry::setClass( 'class_forums', new class_forums( ipsRegistry::instance() ) );
ipsRegistry::getClass( 'class_forums' )->forumsInit();
}
/* Array */
$search_row = $this->_buildOutputArray( $search_row );
/* Indent */
$indent = ( $this->last_topic == $search_row['type_id_2'] );
$this->last_topic = $search_row['type_id_2'];
/* Various data */
$search_row['_last_post'] = $search_row['last_post'];
$search_row['_longTitle'] = $search_row['content_title'];
$search_row['_shortTitle'] = IPSText::truncate( $search_row['content_title'], 60 );
$search_row['last_poster'] = $search_row['last_poster_id'] ? IPSLib::makeProfileLink( $search_row['last_poster_name'], $search_row['last_poster_id'], $search_row['seo_last_name'] ) : ipsRegistry::$settings['guest_name_pre'] . $search_row['last_poster_name'] . ipsRegistry::$settings['guest_name_suf'];
$search_row['starter'] = $search_row['starter_id'] ? IPSLib::makeProfileLink( $search_row['starter_name'], $search_row['starter_id'], $search_row['seo_first_name'] ) : $this->settings['guest_name_pre'] . $search_row['starter_name'] . $this->settings['guest_name_suf'];
$search_row['posts'] = ipsRegistry::getClass('class_localization')->formatNumber( intval($search_row['posts']) );
$search_row['views'] = ipsRegistry::getClass('class_localization')->formatNumber( intval($search_row['views']) );
$search_row['last_post'] = ipsRegistry::getClass( 'class_localization')->getDate( $search_row['last_post'], 'SHORT' );
if ($search_row['posts'])
{
if ( (($search_row['posts'] + 1) % ipsRegistry::$settings['display_max_posts']) == 0 )
{
$pages = ($search_row['posts'] + 1) / ipsRegistry::$settings['display_max_posts'];
}
else
{
$number = ( ($search_row['posts'] + 1) / ipsRegistry::$settings['display_max_posts'] );
$pages = ceil( $number);
}
}
if ( $pages > 1 )
{
for ( $i = 0 ; $i < $pages ; ++$i )
{
$real_no = $i * ipsRegistry::$settings['display_max_posts'];
$page_no = $i + 1;
if ( $page_no == 4 and $pages > 4 )
{
$search_row['pages'][] = array( 'last' => 1,
'st' => ($pages - 1) * ipsRegistry::$settings['display_max_posts'],
'page' => $pages );
break;
}
else
{
$search_row['pages'][] = array( 'last' => 0,
'st' => $real_no,
'page' => $page_no );
}
}
}
/* Format as a topic */
if( $search_row['type_2'] == 'topic' )
{
/* Forum Breadcrum */
$search_row['_forum_trail'] = ipsRegistry::getClass( 'class_forums' )->forumsBreadcrumbNav( $search_row['forum_id'] );
/* Is it read? We don't support last_vote in search. */
$is_read = ipsRegistry::getClass( 'classItemMarking' )->isRead( array( 'forumID' => $search_row['forum_id'], 'itemID' => $search_row['type_id_2'], 'itemLastUpdate' => $search_row['lastupdate'] ? $search_row['lastupdate'] : $search_row['updated'] ), 'forums' );
/* Has posted dot */
$show_dots = '';
if( ipsRegistry::$settings['show_user_posted'] )
{
if( ipsRegistry::member()->getProperty('member_id') && ( isset( $search_row['_topic_array'][$search_row['type_id_2']] ) && $search_row['_topic_array'][$search_row['type_id_2']] ) )
{
$show_dots = 1;
}
}
/* Icon */
$search_row['_icon'] = ipsRegistry::getClass( 'class_forums' )->fetchTopicFolderIcon( $search_row, $show_dots, $is_read );
/* Display type */
if ( $this->search_plugin->getShowAsForum() !== true )
{
return array( ipsRegistry::getClass( 'output' )->getTemplate( 'search' )->topicPostSearchResult( $search_row, $indent, ( $this->search_plugin->onlyTitles || $this->search_plugin->noPostPreview ) ? 1 : 0 ), $indent );
}
else
{
return array( ipsRegistry::getClass( 'output' )->getTemplate( 'search' )->topicPostSearchResultAsForum( $search_row, $indent, ( $this->search_plugin->onlyTitles || $this->search_plugin->noPostPreview ) ? 1 : 0 ), $indent );
}
}
/* Format as a forum */
else
{
return ipsRegistry::getClass( 'output' )->getTemplate( 'search' )->forumSearchResult( $search_row, ( $this->search_plugin->onlyTitles || $this->search_plugin->noPostPreview ) ? 1 : 0 );
}
}
/**
* Internal function, used to sort out the pid and title
*
* @access private
* @param array $r Array of data
* @return array Formatted data, ready for output
**/
private function _buildOutputArray( $r )
{
if( $r['misc'] )
{
$_data = unserialize( $r['misc'] );
$r['misc'] = isset( $_data['pid'] ) && $_data['pid'] ? $_data['pid'] : $r['misc'];
$r['content_title'] = isset( $_data['title'] ) && $_data['title'] ? $_data['title'] : $r['content_title'];
}
return $r;
}
/**
* Retuns the html for displaying the forum category filter on the advanced search page
*
* @access public
* @return string Filter HTML
**/
public function getFilterHTML()
{
/* Make sure class_forums is setup */
if( ipsRegistry::isClassLoaded('class_forums') !== TRUE )
{
require_once( IPSLib::getAppDir( 'forums' ) . "/sources/classes/forums/class_forums.php" );
ipsRegistry::setClass( 'class_forums', new class_forums( ipsRegistry::instance() ) );
ipsRegistry::getClass( 'class_forums' )->strip_invisible = 1;
ipsRegistry::getClass( 'class_forums' )->forumsInit();
}
return ipsRegistry::getClass( 'output' )->getTemplate( 'search' )->forumAdvancedSearchFilters( ipsRegistry::getClass( 'class_forums' )->buildForumJump( 0 ) );
}
/**
* Returns an array used in the searchplugin's setCondition method
*
* @access public
* @param array $data Array of forums to view
* @return array Array with column, operator, and value keys, for use in the setCondition call
**/
public function buildFilterSQL( $data )
{
$return = array();
if( isset( $data ) && is_array( $data ) && count( $data ) )
{
/* Load class_forums so that we can search sub forums automatically */
if( ipsRegistry::isClassLoaded('class_forums') !== TRUE )
{
require_once( IPSLib::getAppDir( 'forums' ) . '/sources/classes/forums/class_forums.php' );
ipsRegistry::setClass( 'class_forums', new class_forums( ipsRegistry::instance() ) );
ipsRegistry::getClass( 'class_forums' )->forumsInit();
}
foreach( $data as $field => $_data )
{
/* FORUMS */
if ( $field == 'forums' && count( $data['forums'] ) )
{
/* Get a list of child ids */
foreach( $data['forums'] as $forum_id )
{
$children = ipsRegistry::getClass( 'class_forums' )->forumsGetChildren( $forum_id );
foreach( $children as $kid )
{
if( ! in_array( $kid, $data['forums'] ) )
{
$data['forums'][] = $kid;
}
}
}
$return[] = array( 'column' => 'type_id', 'operator' => 'IN', 'value' => implode( ',', $data['forums'] ) );
}
/* CONTENT ONLY */
if ( $field == 'noPreview' AND $data['noPreview'] == 1 )
{
$this->search_plugin->noPostPreview = true;
}
/* CONTENT ONLY */
if ( $field == 'contentOnly' AND $data['contentOnly'] == 1 )
{
$this->search_plugin->onlyPosts = true;
}
/* POST COUNT */
if ( $field == 'pCount' AND intval( $data['pCount'] ) > 0 )
{
$return[] = array( 'column' => 't.posts', 'operator' => '>=', 'value' => intval( $data['pCount'] ) );
}
/* TOPIC VIEWS */
if ( $field == 'pViews' AND intval( $data['pViews'] ) > 0 )
{
$return[] = array( 'column' => 't.views', 'operator' => '>=', 'value' => intval( $data['pViews'] ) );
}
}
return $return;
}
else
{
return '';
}
}
/**
* Modify the search query
*
* @access public
* @param array $query The current unmodified query
* @param bool [$count_only] Set to true if this is a count(*) query
* @return array Search query, modified by the plugin
**/
public function modifySearchQuery( $query, $count_only=false )
{
if( ipsRegistry::$settings['search_method'] == 'sphinx' )
{
$query->SetFilter( 'approved', array( 1 ) );
$query->SetFilter( 'queued' , array( 0 ) );
$query->SetFilter( 'password', array( 0 ) );
if( isset( ipsRegistry::$request['search_app_filters']['forums'] ) && is_array( ipsRegistry::$request['search_app_filters']['forums'] ) && count( ipsRegistry::$request['search_app_filters']['forums'] ) )
{
/* Load class_forums so that we can search sub forums automatically */
if( ipsRegistry::isClassLoaded('class_forums') !== TRUE )
{
require_once( IPSLib::getAppDir( 'forums' ) . '/sources/classes/forums/class_forums.php' );
ipsRegistry::setClass( 'class_forums', new class_forums( ipsRegistry::instance() ) );
ipsRegistry::getClass( 'class_forums' )->forumsInit();
}
$forum_ids = array();
/* Get a list of child ids */
foreach( ipsRegistry::$request['search_app_filters']['forums'] as $forum_id )
{
if( $forum_id )
{
$forum_ids[] = $forum_id;
$children = ipsRegistry::getClass( 'class_forums' )->forumsGetChildren( $forum_id );
foreach( $children as $kid )
{
if( ! in_array( $kid, ipsRegistry::$request['search_app_filters']['forums'] ) )
{
$forum_ids[] = $kid;
}
}
}
}
if( is_array($forum_ids) AND count($forum_ids) )
{
$query->SetFilter( 'forum_id', $forum_ids );
}
}
/* Limit by forum */
$type = ipsRegistry::$request['type'];
$type_id = intval( ipsRegistry::$request['type_id'] );
if( $type && $type_id )
{
$query->SetFilter( 'forum_id', array( $type_id ) );
}
/* Limit by topic */
$type_2 = ipsRegistry::$request['type_2'];
$type_id_2 = intval( ipsRegistry::$request['type_id_2'] );
if( $type_2 && $type_id_2 )
{
$query->SetFilter( 'tid', array( $type_id_2 ) );
}
}
else
{
return $query;
}
}
}