Очень интересный код. Давно я такого не встречал - Дизайн и модификация Invision Power Board

Перейти к содержимому

 

СвернутьПрикрепленные теги

Теги не найдены

Страница 1 из 1

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

#1 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 9 446
  • Регистрация: 20-Март 09
  • Репутация: 2 545
  • IPB version:3.1.x
 

Отправлено 16 Апрель 2019 - 21:38

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

		$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'));
					}
				}
			}


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

#2 Пользователь не на сайте   newbie ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins.ru Team
  • Сообщений: 3 815
  • Регистрация: 26-Октябрь 11
  • Репутация: 1 489
  • IPB version:I have no IPB
 

Отправлено 17 Апрель 2019 - 11:05

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

#3 Пользователь не на сайте   Dmitriy427 ответил: »

 
 
  • Advanced
  • Смотреть блог
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Specialist
  • Сообщений: 688
  • Регистрация: 15-Октябрь 11
  • Репутация: 197
  • Откуда:Россия, Тула
  • IPB version:I have no IPB
 

Отправлено 17 Апрель 2019 - 18:23

Да обычное же дело. Мне вот недавно прислали страничку топ-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 запросов в цикле... Там где достаточно было двух, и то из-за довольно странной структуры БД и требований к функционалу.
0

#4 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 9 446
  • Регистрация: 20-Март 09
  • Репутация: 2 545
  • IPB version:3.1.x
 

Отправлено 17 Апрель 2019 - 18:44

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

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

#5 Пользователь не на сайте   Dmitriy427 ответил: »

 
 
  • Advanced
  • Смотреть блог
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Specialist
  • Сообщений: 688
  • Регистрация: 15-Октябрь 11
  • Репутация: 197
  • Откуда:Россия, Тула
  • IPB version:I have no IPB
 

Отправлено 17 Апрель 2019 - 19:14

Ладно бы только джойны и юнионы. Я для этой базы писал запросы со смещением и лимитами... Выглядит как-то так:
		$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}
		");

Суровая штука SQL Server. :)
0

Сообщить об этой теме:


Страница 1 из 1


Быстрый ответ

  

1 пользователей читают эту тему
0 зарегистрированных, 1 гостей, 0 скрытых


Контактная информация

Вопросы по работе сайта

+7 (917) 501-4765
C 10 до 20 в рабочие дни (время московское)

Техническая поддержка

Контактные данные специалистов

Дизайн форумов

IPB 3.x ¦ IPB 2.x

Бесплатные шаблоны

IPB 3.2 – 3.4 ¦ IPB 3.1 ¦ IPB 3.0 ¦ IPB 2.2 – 2.3 ¦ IPB 2.1 ¦ Клипарт
Лицензия на использование ¦ Ваша поддержка ¦ О проекте
Copyright © 2005-2019 IPBSkins.ru Team
При копировании материалов с сайта
прямая ссылка на источник обязательна