Перейти к контенту
  • 0

Выборка последнего поста вместо первого


Black_Sun

Вопрос

Собсно сабж, помогите поменять тут

//-----------------------------------------
// Get jax firstpost
//-----------------------------------------
@header( "Content-type: text/plain;charset={$this->ipsclass->vars['gb_char_set']}" );

$this->ipsclass->DB->simple_construct( array( 'select' => '*',
'from' => 'posts',
'where' => "pid=".intval($this->ipsclass->input['pid'] > 0 ? $this->ipsclass->input['pid'] : $this->topic['topic_firstpost']),
));

что-то чтобы брался не 1 пост, а последний.

Ссылка на комментарий
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0

Это в списке топиков форума аяксом тянет первое сообщение?

Если айдишник последнего сообщения не определен, нужно в нескольких местах код править: сначала сделать, чтобы на страницу топиков форума отдавался последний айдишник каждому топику, и лишь потом менять этот код, заменив $this->topic['topic_firstpost'] на новое значение.

Ссылка на комментарий
Поделиться на других сайтах

  • 0

$this->ipsclass->input['pid'] же используется, зачем менять, надо просто его знать заранее и передавать в аяксе

если бы автор темы нормально описал, с чем имеет дело, можно было бы даже сказать, где

Ссылка на комментарий
Поделиться на других сайтах

  • 0

а, сорри, я просто подумал что надо тут менять, а так запросто, это мод Topic Preview для версии 2.3.х

 

Открыть файл ./sources/action_public/topics.php

 

Найти:

			else if ($this->ipsclass->input['view'] == 'findpost')
		{
			//-----------------------------------------
			// Find a post
			//-----------------------------------------

 

Добавить выше:

else if ($this->ipsclass->input['view'] == 'getpost')
{
if( !is_object( $this->parser ) )
{
//-----------------------------------------
// Load and config the post parser
//-----------------------------------------

$_load = $this->ipsclass->memory_debug_make_flag();

require_once( ROOT_PATH."sources/handlers/han_parse_bbcode.php" );
$this->parser = new parse_bbcode();
$this->parser->ipsclass = $this->ipsclass;
$this->parser->allow_update_caches = 1;

$this->parser->bypass_badwords = intval($this->ipsclass->member['g_bypass_badwords']);

$this->ipsclass->memory_debug_add( "TOPIC: Loaded han_parse_bbcode.php", $_load );
}
//-----------------------------------------
// Get jax firstpost
//-----------------------------------------
@header( "Content-type: text/plain;charset={$this->ipsclass->vars['gb_char_set']}" );

$this->ipsclass->DB->simple_construct( array( 'select' => '*',
'from' => 'posts',
'where' => "pid=".intval($this->ipsclass->input['pid'] > 0 ? $this->ipsclass->input['pid'] : $this->topic['topic_firstpost']),
));

$this->ipsclass->DB->simple_exec();

$row = $this->ipsclass->DB->fetch_row();
$this->parser->parse_html = ( $this->forum['use_html'] and $row['post_htmlstate'] ) ? 1 : 0;
$this->parser->parse_nl2br = $row['post_htmlstate'] == 2 ? 1 : 0;

$input = $this->parser->pre_display_parse( $row['post'] );


$macros = unserialize(stripslashes($this->ipsclass->skin['_macro']));

if ( is_array( $macros ) )
{
foreach( $macros as $i => $row )
{
if ($row['macro_value'] != "")
{
$input = str_replace( "<{".$row['macro_value']."}>", $row['macro_replace'], $input );
}
}
}

$input = str_replace( "<#IMG_DIR#>", $this->ipsclass->skin['_imagedir'], $input );
$input = str_replace( "<#EMO_DIR#>", $this->ipsclass->skin['_emodir'] , $input );

die($input);
}

 

Открыть файл ./jscripts/ipb_forum.js

 

Найти:

var _this_select_all = 0;

var tid_date	= new Array();

var click_delay = 1200; //microseconds (1.2 seconds)

 

 

 

Добавить после:

Код из http://cyber-city.ru/jscripts/ipb_topic_preview.js - спасибо за отдельный файл :D

function getData(str,fld,textfield){field=document.getElementById(fld);do_request_function=function(){if(!xmlobj.readystate_ready_and_ok()){xmlobj.show_loading();return;}xmlobj.hide_loading();field.innerHTML=xmlobj.xmlhandler.responseText;};xmlobj=new ajax_request();xmlobj.onreadystatechange(do_request_function);xmlobj.process(ipb_var_base_url+Math.random()+"&"+str);return false;}

 

Далее

Админцентр > ВНЕШНИЙ ВИД > стиль > Изменить CSS(расширенный режим)

 

В самое начало вставляем:

 

.topicpreview{border:1px solid #000;position:absolute;width:500px;padding:3px 5px 3px 3px;background: #EEF2F7;text-align:left;margin-left:0px}

 

 

Далее Админцентр > ВНЕШНИЙ ВИД > стиль > Изменить HTML > skin_forum > render_forum_row

 

Найти:

 

<span id='tid-span-{$data['tid']}'><a id="tid-link-{$data['tid']}" href="{$this->ipsclass->base_url}showtopic={$data['tid']}" title="{$this->ipsclass->lang['topic_started_on']} {$data['start_date']}">{$data['title']}</a></span>

Добавить после:

 

<span onmouseout='toggleview("{$data['tid']}_preview");' onmouseover='toggleview("{$data['tid']}_preview");getData("act=st&t={$data['tid']}&view=getpost","{$data['tid']}_preview")'>[b]СЮДА ВСТАВИТЬ ЛЮБОЙ ТЕКСТ/КАРТИНКУ(что угодно) ПО НАВЕДЕНИЮ НА КОТОРЫЙ(УЮ) БУДЕТ ВСПЛЫВАТЬ ТЕКСТ
КАК ВСТАВЛЯТЬ КАРТИНКУ НИЖЕ[/b]</span><div id='{$data['tid']}_preview' class='topicpreview' style='display:none'></div>

Ссылка на комментарий
Поделиться на других сайтах

  • 0

проще будет запрос типа

		$this->ipsclass->DB->simple_construct( array( 'select' => '*',
												  'from'   => 'posts',
												  'where'  => "topic_id=".$this->topic['tid'],
												  'order' => 'post_date DESC',
												  'limit'  => array( 0,1 )
										 )	  );

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Кул спс, всё работает.

Вообще идея изначально была такая что пользователь в настройках выбирал какой пост ему показывать первый или последний, но после долгих изучений PHP и MySql я понял что это будет очень сложно поэтому решил сделать только по последнему посту, ещё раз спасибо :D

Ссылка на комментарий
Поделиться на других сайтах

  • 0

ну тык запросы можно выполнять по настройкам

if($this->ipsclass->member['var_how_to_display_posts_in_ajax']=='last')
{
	$this->ipsclass->DB->simple_construct( array( 'select' => '*',
												  'from'   => 'posts',
												  'where'  => "topic_id=".$this->topic['tid'],
												  'order' => 'post_date DESC',
												  'limit'  => array( 0,1 )
										 )	  );
}
else
{
$this->ipsclass->DB->simple_construct( array( 'select' => '*',
	'from' => 'posts',
	'where' => "pid=".intval($this->topic['topic_firstpost']),
));
}

Ссылка на комментарий
Поделиться на других сайтах

  • 0

Неа не работает, добавил в ibf_profile_portal пункт pp_postas varchar(10) :D ну по принципу gender ;)

дальше в lang_ucp

'panel_postas'						  => '<b>Вид предпросмотра</b>',
'panel_postas_l'						=> 'Последний',
'panel_postas_f'						=> 'Первый',

и в lang_global

'js_postas_last'				  => 'Последний',
'js_postas_first'				 					=> 'Первый',

дальше по вашему принципу сделал

if($this->ipsclass->member['pp_postas']=='last')
{
	$this->ipsclass->DB->simple_construct( array( 'select' => '*',
												  'from'   => 'posts',
												  'where'  => "topic_id=".$this->topic['tid'],
												  'order' => 'post_date DESC',
												  'limit'  => array( 0,1 )
										 )	  );
}
else
{
$this->ipsclass->DB->simple_construct( array( 'select' => '*',
	'from' => 'posts',
	'where' => "pid=".intval($this->topic['topic_firstpost']),
));
}

потом в ipsclass добавил

		$member['_pp_postas_text']  = $member['pp_postas'] == 'last' ? $this->lang['js_postas_last'] : ( $member['pp_postas'] == 'first' ? $this->lang['js_postas_first'] : $this->lang['js_gender_mystery']  );

далее добавил в memberlist

				//-----------------------------------------
	// Postas.
	//-----------------------------------------

	if ( $pp_postas )
	{
		if ( $pp_postas == 'last' )
		{
			$query[] = "pp.pp_postas='last'";
			$url[]   = "pp_postas=last";
		}
		else if ( $pp_postas == 'first' )
		{
			$query[] = "pp.pp_postas='first'";
			$url[]   = "pp_postas=first";
		}
	}

 

затем в xmlout

					case 'postas':
			$_postas = ( $this->ipsclass->input['pp_postas'] == 'last' ) ? 'last' : ( $this->ipsclass->input['pp_postas'] == 'first' ? 'first' : '' );

			$this->ipsclass->DB->simple_construct( array( 'select' => 'pp_member_id',
														  'from'   => 'profile_portal',
														  'where'  => "pp_member_id=".$member_id ) );
			$this->ipsclass->DB->simple_exec();

			if ( $this->ipsclass->DB->get_num_rows() )
			{
				$this->ipsclass->DB->do_update( 'profile_portal', array( 'pp_postas' => $_postas ), 'pp_member_id='.$member_id );
			}
			else
			{
				$this->ipsclass->DB->do_insert( 'profile_portal', array( 'pp_postas'	=> $_postas,
				 														 'pp_member_id' => $member_id ) );
			}

			$return_string = $_postas;
			break;

далее в в func_usercp добавил следующие строки

					   $_postas = $this->ipsclass->input['postas'] == 'last' ? 'last' : ( $this->ipsclass->input['postas'] == 'first' ? 'first' : '' );

и

		//-----------------------------------------
	// Update the DB
	//-----------------------------------------

	$this->ipsclass->DB->force_data_type = array( 'title' => 'string' );

	$this->ipsclass->DB->do_update( 'members'	 , $set, 'id='.$this->ipsclass->member['id'] );

	$this->ipsclass->DB->do_update( 'member_extra', $bet, 'id='.$this->ipsclass->member['id'] );

	$check = $this->ipsclass->DB->build_and_exec_query( array( 'select' => 'pp_member_id', 'from' => 'profile_portal', 'where' => 'pp_member_id=' . $this->ipsclass->member['id'] ) );

	if( $check['pp_member_id'] )
	{
		$this->ipsclass->DB->do_update( 'profile_portal', array( 'pp_gender' => $_gender ), 'pp_member_id=' . $this->ipsclass->member['id'] );
	}
	else
	{
		$this->ipsclass->DB->do_insert( 'profile_portal', array( 'pp_gender' => $_gender, 'pp_member_id' => $this->ipsclass->member['id'] ) );
	}
			$check = $this->ipsclass->DB->build_and_exec_query( array( 'select' => 'pp_member_id', 'from' => 'profile_portal', 'where' => 'pp_member_id=' . $this->ipsclass->member['id'] ) );

	if( $check['pp_member_id'] )
	{
		$this->ipsclass->DB->do_update( 'profile_portal', array( 'pp_postas' => $_postas ), 'pp_member_id=' . $this->ipsclass->member['id'] );
	}
	else
	{
		$this->ipsclass->DB->do_insert( 'profile_portal', array( 'pp_postas' => $_postas, 'pp_member_id' => $this->ipsclass->member['id'] ) );
	}

и в соответсвенно в skin_ucp (личные данные пользователя)->personal_panel добавил

		<td width="30%" class="row1" style='padding:6px;'>{$this->ipsclass->lang['panel_postas']}</td>
	<td width="70%" class="row2" style='padding:6px;'><select class='select' name='postas'>
		<option value='last'<if="$this->ipsclass->member['pp_postas']=='last'"> selected='selected'</if>>{$this->ipsclass->lang['panel_postas_l']}</option>
		<option value='first'<if="$this->ipsclass->member['pp_postas']=='first'"> selected='selected'</if>>{$this->ipsclass->lang['panel_postas_f']}</option>
		</select>
	</td>

всё сохраняется добавляется в мускул и даже по ID пользователя но не работает :) где я ошибся?

Ссылка на комментарий
Поделиться на других сайтах

  • 0

мы же добавляем в profile_portal, а надо создать поле в таблице ibf_members, после чего в class_session.php выбирать это при загрузке мембера

а как сделать настройку - можно посмотреть на примере мода репутации, то место, где мы добавляем "уведомлять меня по лс об изменениях репутации"

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Перевёл таблицу в ibf_members с полным переписыванием всего вышенаписанного и всё равно не работает, а про "уведомлять меня по лс об изменениях репутации" для меня сложно :D
Ссылка на комментарий
Поделиться на других сайтах

  • 0
давай по пунктам

создать поле в таблице мемберс. через утилиту или phpmyadmin

сделать выборку его значения в class_session

1. Есть ALTER TABLE `ibf_members` ADD (pp_postas varchar( 10 ) NOT NULL default ' ');

2. Есть

добавить после?

"$this->ipsclass->DB->build_query( array( 'select' => "id, name, mgroup, member_login_key, member_login_key_e.........."

, pp_postas

Ссылка на комментарий
Поделиться на других сайтах

  • 0

закэшировался результат - надо отправлять

		header("HTTP/1.0 200 OK");
	header("HTTP/1.1 200 OK");
	header("Cache-Control: no-cache, must-revalidate, max-age=0");
	header("Expires: 0");
	header("Pragma: no-cache");

 

возможно достаточно последних 3, это цитата из xmlout

Ссылка на комментарий
Поделиться на других сайтах

  • 0

кул, теперь после принятия настроек не приходится страницу обновлять :D

надо автору мода передать ;) ещё раз спасибо.

Последних трех действительно хватило.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.