Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
kazaka

Изменение main блока Portal 1.4

Recommended Posts

Хочу отредактировать центральный блок портала (Latest Topics Main)

Чтобы он показывал не последние созданые топики, а последние посты с топиков!

Там как бы в настройках есть Topics default order: там можно менять Topic Start Date и Last Reply Date меняю на Last Reply Date он как бы показывает последние топики где написали но содержимое первого поста, надо последний пост...

 

Я думая надо тут менять \admin\applications_addon\other\portal\sources\blocks.php

 

	public function latest_topics_main()
	{
		//-----------------------------------------
		// INIT
		//-----------------------------------------

		$attach_pids	= array();
		$attach_posts	= array();
		$forums			= array();
		$topics			= array();
		$output			= array();
	$where_clause	= array();
		$limit			= $this->settings['latest_topics_main'] ? intval( $this->settings['latest_topics_main'] ) : 3;
		$posts			= intval( $this->memberData['posts'] );
       $page           = ( $this->request['page'] > 1 ) ? ( ( $this->request['page'] - 1 ) * $limit ) : 0;

		//-----------------------------------------
   	// Grab articles new/recent in 1 bad ass query
   	//-----------------------------------------

		foreach( explode( ',', $this->settings['portal_latest_topics_forums'] ) as $forum_id )
		{
			if( !$forum_id )
			{
				continue;
			}

			$forums[] = intval($forum_id);
		}

	/* Loop through the forums and build a list of forums we're allowed access to */
	$forumIdsOk  = array();

	foreach( $this->registry->class_forums->forum_by_id as $id => $data )
	{
		/* Allowing this forum? */
		if ( count($forums) && !in_array( $id, $forums ) )
		{
			continue;
		}

		/* Can we read? */
		if ( ! $this->registry->permissions->check( 'read', $data ) )
		{
			continue;
		}

		/* Can read, but is it password protected, etc? */
		if ( ! $this->registry->class_forums->forumsCheckAccess( $id, 0, 'forum', array(), true ) )
		{
			continue;
		}

		if ( ! $data['can_view_others'] )
		{
			continue;
		}

		if ( $data['min_posts_view'] > $posts )
		{
			continue;
		}

		if ( $data['password'] != '' )
		{
			continue;
		}            

		$forumIdsOk[] = $id;
	}

	if( !count($forumIdsOk) )
	{
		return '';
	}

	//-----------------------------------------
	// Get topics
	//-----------------------------------------        

       # Setup our topic conditions
	$where_clause[]   = "t.forum_id IN (" . implode( ",", $forumIdsOk ) . ")";		
	$parseAttachments = false;
	$topics           = array();
	$topicCount       = 0;
       $defaultOrder     = ( $this->settings['portal_topics_order_by'] ) ? $this->settings['portal_topics_order_by'] : 'last_post';    

       # Skip pinned topics
       if( $this->settings['portal_exclude_pinned'] )
       {
           $where_clause[]   = "t.pinned=0";    
       } 

       # Topic sql query
	$this->DB->build( array( 
							'select'	=> 't.*',
							'from'		=> array( 'topics' => 't' ),
                               'order'     => "t.{$defaultOrder} DESC",
							'where'		=> "t.approved=1 AND t.state != 'link' AND " . implode( ' AND ', $where_clause ),
                               'limit'     => array( $page, $limit ),
							'add_join'	=> array(
												array( 
														'select'	=> 'p.*',
														'from'	=> array( 'posts' => 'p' ),
														'where'	=> 'p.pid=t.topic_firstpost',
														'type'	=> 'left'
													),
												array(
														'select'	=> 'f.id, f.name, f.name_seo, f.use_html',
														'from'		=> array( 'forums' => 'f' ),
														'where'		=> "f.id=t.forum_id",
														'type'		=> 'left',
													),
												array( 
														'select'	=> 'm.member_id, m.members_display_name, m.member_group_id, m.members_seo_name, m.mgroup_others, m.login_anonymous, m.last_visit, m.last_activity',
														'from'		=> array( 'members' => 'm' ),
														'where'		=> 'm.member_id=p.author_id',
														'type'		=> 'left'
													),
												array( 
														'select'	=> 'pp.*',
														'from'		=> array( 'profile_portal' => 'pp' ),
														'where'		=> 'pp.pp_member_id=m.member_id',
														'type'		=> 'left'
													),

												)
				)		);

	$outer = $this->DB->execute();

		while( $row = $this->DB->fetch( $outer ) )
		{ 			
			$bottom_string		= "";
			$read_more			= "";
			$top_string			= "";
			$got_these_attach	= 0;

		if( $row['topic_hasattach'] )
		{
			$parseAttachments = true;
		}

		//-----------------------------------------
		// Parse the post
		//-----------------------------------------

		IPSText::getTextClass( 'bbcode' )->parse_smilies			= $row['use_emo'];
		IPSText::getTextClass( 'bbcode' )->parse_html				= ( $row['use_html'] and $row['post_htmlstate'] ) ? 1 : 0;
		IPSText::getTextClass( 'bbcode' )->parse_nl2br				= $row['post_htmlstate'] == 2 ? 1 : 0;
		IPSText::getTextClass( 'bbcode' )->parse_bbcode				= 1;
		IPSText::getTextClass( 'bbcode' )->parsing_section			= 'topics';
		IPSText::getTextClass( 'bbcode' )->parsing_mgroup			= $row['member_group_id'];
		IPSText::getTextClass( 'bbcode' )->parsing_mgroup_others	= $row['mgroup_others'];
		$row['post']	= IPSText::getTextClass( 'bbcode' )->preDisplayParse( $row['post'] );

			//-----------------------------------------
			// BASIC INFO
			//-----------------------------------------

			$real_posts			= $row['posts'];
			$row['posts']		= ipsRegistry::getClass('class_localization')->formatNumber(intval($row['posts']));

           $row	= IPSMember::buildDisplayData( $row );

		# Attachments?			
		if( $row['pid'] )
		{
			$attach_pids[ $row['pid'] ] = $row['pid'];
		}
		if ( IPSMember::checkPermissions('download', $row['forum_id'] ) === FALSE )
		{
			$this->settings[ 'show_img_upload'] =  0;
		} 

           $row['share_links'] = IPSLib::shareLinks( $row['title'], array( 'url' => $this->registry->output->buildSEOUrl( 'showtopic=' . $row['tid'], 'publicNoSession', $row['title_seo'], 'showtopic' )  ) );

		$topics[] = $row;
	}

       # Pagination
       if( $this->settings['portal_topics_pagination'] )
       {
     		//$count = $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) as count', 'from' => 'topics', 'where' => "approved=1 AND state != 'link' AND " . str_replace( "t.", "", implode( ' AND ', $where_clause ) ) ) );

   		$pages = $this->registry->output->generatePagination( array( 'totalItems'		 => 25,
   																	 'itemsPerPage'		 => $limit,
   																	 'currentStartValue' => $page,
                                                                        'isPagesMode'		 => true,
                                                                        'seoTitle'			 => "app=portal",
                                                                        'seoTemplate'		 => "app=portal",
   																	 'baseUrl'			 => "app=portal",
   															)		);             
       }



		$output = $this->registry->getClass('output')->getTemplate('portal')->articles( $topics, $pages );

		//-----------------------------------------
		// Process Attachments
		//-----------------------------------------

		if ( $parseAttachments AND count( $attach_pids ) )
		{
		if ( ! is_object( $this->class_attach ) )
		{
			//-----------------------------------------
			// Grab render attach class
			//-----------------------------------------

			$classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir( 'core' ) . '/sources/classes/attach/class_attach.php', 'class_attach' );
			$this->class_attach                  = new $classToLoad( $this->registry );

			$this->class_attach->attach_post_key = '';

			ipsRegistry::getClass( 'class_localization' )->loadLanguageFile( array( 'public_topic' ), 'forums' );
		}

		$this->class_attach->attach_post_key	=  '';
		$this->class_attach->type				= 'post';
		$this->class_attach->init();

		$output = $this->class_attach->renderAttachments( $output, $attach_pids );
		$output	= $output[0]['html'];
		}

		return $output;
	}        

Share this post


Link to post
Share on other sites

Связь между таблицей тем и сообщений есть только по первому посту темы.

 

'where' => 'p.pid=t.topic_firstpost',

Чтобы вывести последние сообщения нужны дополнительные костыли. Либо переписать запрос и сделать вложенный селект для отбора ид последних сообщений, либо по ид темы выбрать сначала ид сообщений потом указать их в основном селекте.

Но как вариант можете попробовать условие отбора по дате последнего сообщения темы:

'where' => 'p.pid=t.topic_firstpost',

заменить на

'where' => 'p.topic_id=t.tid AND p.post_date=t.last_post',

Share this post


Link to post
Share on other sites

Спасиба, можна закрывать

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...