Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Очень интересный код. Давно я такого не встречал

Опубликовано:

Если отбросить кликбейтное название, то код действительно "интересный" в кавычках естественно.

 

	$title = 'theme_'.$topic->tid;

	if (\IPS\Db::i()->select('*', 'core_sys_conf_settings', 'conf_key="'.$title.'"')->count()) {

	}
	else{
		\IPS\Db::i()->insert('core_sys_conf_settings', array('conf_key' => $title, 'conf_value' => 0, 'conf_default' => 0, 'conf_app' => 'core'));
	}

	if ( !\IPS\Member::loggedIn()->member_id )
	{
		$modPosts = 0;
	}
	else
	{
		$modPosts = \IPS\Db::i()->select('mod_posts', 'core_members', 'member_id="' . \IPS\Member::loggedIn()->member_id.'"')->first();
	}

	if(\IPS\Db::i()->select('conf_value', 'core_sys_conf_settings', 'conf_key="theme_' . $topic->tid.'"')->first() == 1)
	{
		$topicMod = 1;
	}
	else
	{
		$topicMod = 0;
	}
	/* Show topic */
	\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'topics' )->topic( $topic, $comments, $question, $votes, $nextUnread, $pagination, $topicVotes, $topicMod, $modPosts );

 

Краткое описание.

Плагин - Премодерация тем.

Перегружен метод manage в классе \IPS\forums\modules\front\forums\topic. Естественно без вызова родителя с полным копированием кода от какой-то неизвестной уже версии.

По логике код просто лютый писец. Оставим на совесть автора выбор реализации через manage (оно и понятно почему, человек из другой сферы), и то что он для каждой темы создает отдельную настройку theme_%id в таблице настроек, когда можно было просто указать все ид тем на премодерации в одну настройку.

Но логика запросов это лютый треш - запрашиваем, если нету вставляем, потом опять запрашиваем. Он даже умудрился составить запрос на то, что уже есть в \IPS\Member::loggedIn().

 

Погодите. Далее не менее интересно.

Настройка

 

		$themes = \IPS\Db::i()->select( array('tid', 'title', 'state'), 'forums_topics');

		foreach($themes as $theme)
		{
			if($theme['state'] == 'open')
			{
				$title = 'theme_'.$theme["tid"];

				$form->add( new \IPS\Helpers\Form\YesNo( $title, \IPS\Settings::i()->$title, false, array(), NULL, $theme['title']) );

				if (\IPS\Db::i()->select('*', 'core_sys_conf_settings', 'conf_key="'.$title.'"')->count()) {
					continue;
				}
				else{
					\IPS\Db::i()->insert('core_sys_conf_settings', array('conf_key' => $title, 'conf_value' => 0, 'conf_default' => 0, 'conf_app' => 'core'));
				}
			}
		}

 

Как видно, здесь выводится весь список тем форума (естественно без пагинации) и, конечно же - селект в цикле.

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

Опубликовано:

Запрос на запросе сидит и запросом погоняет.

Опубликовано:

Да обычное же дело. Мне вот недавно прислали страничку топ-50 персонажей игрового сервера, для примера:

			// Получаем список
	$Result = $DB2->Query('SELECT TOP 50 * FROM Character WHERE CtlCode != 32 AND CtlCode != 8 AND CtlCode != 1 '.$Class.' order by MasterResetCount desc, ResetCount desc, cLevel desc');

		// Если пусто
	if ($DB2->NumRows($Result) == 0) {
		echo '<tr><td colspan="7"><center>'.$Lang['RANKINGS_NULL'].'</center></td></tr>';
	}

		// Инфо о персах
	while($Info = $DB2->FetchArray($Result)) {
		++$Count;

			// Информация о персонаже
		$Name = $Info['Name'];
		$Class = $Engine->GetCharClass($Info['Class'],0);
		$Level = $Info['cLevel'];
		$ResetCount = $Info['ResetCount'];
		$MasterResetCount = $Info['MasterResetCount']; 
		$GetGuild = $DB2->FetchRow($DB2->Query("SELECT G_Name FROM GuildMember where Name = '".$Info['Name']."'"));
		$Guild = $GetGuild[0];

			// Статус
		$CheckStatus = $DB2->FetchRow($DB2->Query("SELECT ConnectStat FROM MEMB_STAT WHERE memb___id = '".$Info['AccountID']."'"));
		$GameIDC = $DB2->FetchRow($DB2->Query("Select GameIDC from AccountCharacter where Id = '".$Info['AccountID']."'"));

		if ($CheckStatus[0] == 1 && $GameIDC[0] == $Info['Name']) {
			$Status = 'font-weight:bold;color:#65b149;';
		}
		else {
			$Status = '';
		}

			// Выводим
		echo '<tbody>
		<tr>
		<td align="center" style="width:25px;height:20px;padding-left:1px;padding-right:1px;'.$Status.'">'.$Count.'</td>
		<td align="center"><a href="char/'.$SelectedServer.'/'.$Name.'">'.$Name.'</a></td>
		<td align="center">'.$Class.'</td>
		<td align="center">'.$Level.'</td>
		<td align="center">'.$ResetCount.'</td>
		<td align="center">'.$MasterResetCount.'</td>
		<td align="center"><a href="guild/'.$SelectedServer.'/'.$Guild.'">'.$Guild.'</a></td>
		</tr>
		</tbody>';
	}

 

Запрашиваем 50 строк и по результатам ещё 150 запросов в цикле... Там где достаточно было двух, и то из-за довольно странной структуры БД и требований к функционалу.

Опубликовано:
  • Автор

Тут тововарищ решил не усложнять запрос джоинами.

 

ПС.

Не понимаю стиль писать в пхп названия переменных заглавной буквой.

Опубликовано:

Ладно бы только джойны и юнионы. Я для этой базы писал запросы со смещением и лимитами... Выглядит как-то так:

		$rows = mssql_query("
		SELECT T1.G_Name, T1.G_Master, COUNT(*) AS count, T1.G_Score, T1.G_Mark, T1.G_Union, T1.Number, T3.G_Name AS U_Name
		FROM (
			SELECT G_Name, G_Master, G_Score, G_Mark, G_Union, Number, ROW_NUMBER() OVER (ORDER BY {$order}) AS RowNum
			FROM {$settings['ms_sql_database']}.dbo.Guild
		) AS T1
		LEFT JOIN {$settings['ms_sql_database']}.dbo.Guild AS T3
			ON T3.Number = T1.G_Union
		JOIN {$settings['ms_sql_database']}.dbo.GuildMember AS T2
			ON T2.G_Name = T1.G_Name
		WHERE T1.RowNum BETWEEN {$start} AND {$end}
		GROUP BY T1.G_Name, T1.G_Master, T1.G_Score, T1.G_Mark, T1.G_Union, T1.Number, T3.G_Name
		ORDER BY {$tOrder}
	");
 

Суровая штука MsSQL Server. 🙂

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

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.