Перейти к публикации
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.

Default Post Content (доработка)

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

Добрый вечер!

Имеется классный компонент по созданию шаблонов создаваемых тем/сообщений. Хук очень классный и удобный, но есть один минус - устанавливать эти самые шаблоны можно только на каждый форум по отдельности, т.е. на каждый ID форума выставлять приходится заново. Это долго и не удобно.

 

Как его доработать, чтобы можно было выбрать сразу несколько форумов и разделов, зажав клавишу CTRL? Сейчас в выпадающем списке эта кнопка не работает.

 

post-59150-0-03905800-1469476795_thumb.png

 

https://invisionpower.com/files/file/4547-default-post-content/

 

HSC32 Default Post Content 3.2.2.rar

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

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

Не подскажете? Проблема кроется в файле, отвечающем за подгрузку ID форумов - admin\applications\forums\modules_admin\defaultpost\forums.php, и в файле - admin\applications\forums\skin_cp\cp_skin_defaultpost.php, где ключ forum_name отвечает за выбор нужного форума.

 

Как бы разблокировать там выбор сразу нескольких форумов?

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

forum_id идет отдельным полем, чтобы была поддержка мултиселекта нужно переписать полностью как минимум методы _forumForm, _saveForum.

 

\admin\applications\forums\modules_admin\defaultpost\forums.php

 

Найти

 

$formData['forumId'] = $this->registry->output->formDropdown('forumId',$forumList,$row['forum_id'],'forumId');

Заменить на

 

$formData['forumId'] = $this->registry->output->formMultiDropdown( "forumId[]", $forumList, array( $row['forum_id'] ), 5, "forumId" );

Метод _saveForum заменить на:

 

   protected function _saveForum()
   {
	$forumId = array_filter( array_map( 'intval', (array) $this->request['forumId'] ) );

	if( empty( $forumId ) )
	{
		$this->registry->output->showError('No forum selected','10DPC02');
	}

	$data = array('new_template_id' => intval($this->request['newTemplateId']),
				  'reply_template_id' => intval($this->request['replyTemplateId']));

	foreach( $forumId as $id )
	{
		$data['forum_id'] = $id;
		$this->DB->replace( 'defaultpost_templates_forums', $data, 'forum_id='.$id );
	}

	$this->registry->output->silentRedirect($this->settings['base_url'] . $this->html->form_code);
   }

 

Как эти правки будут работать в приложение я не знаю, поэтому все изменения делаете под свою ответственость.

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

Метод работает, большое спасибо! Но осталась пара багов приложения: при выборе шаблона целой категории, этот шаблон не распространяется на вложенные в категорию форумы. Но это мелочь.

 

Основной баг (недочет) - при сохранении конфигурации, выбранные форумы и категории удаляются из мульти-списка выбора, и вернуть их туда можно, только вручную удалив каждый форум из менюшки управления форумами в приложении... :( Как это починить? Т.е. чтобы при сохранении конфигурации, форумы не исчезали из списка, а оставались просто подсвеченными сереньким в списке, как в хуках например?

 

А то получается, единожды массово выбрать шаблон можно, а массово удалить (и перенастроить) уже нельзя.

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

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

Опубликовано:
  • Автор
при генерации списка делайте дополнительный запрос (джоин) для выбора всех форумов с одинаковыми настройками.

Это как? Хотелось бы автоматизировать процесс... А то несколько десятков форумов вручную не хотелось бы перенастраивать, при редактировании шаблона...

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

Несколько десятков не так много, а больше уже плохо для производительности форума. Чтобы автоматизировать как вам хочется нужно переписывать логику приложения. Примерно как это сделать я уже подсказал выше.

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

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

Найти

 

$row = $this->DB->buildAndFetch(array('select' => '*', 'from' => 'defaultpost_templates_forums', 'where' => 'forum_id='.$forumId));

Заменить на

 

       $this->DB->build(array('select' => 'z.*',
						   'from'   => array( 'defaultpost_templates_forums' => 't' ),
						   'where'  => 't.forum_id=' . $forumId,
						   'add_join' => array(
								array( 'from'  => array( 'defaultpost_templates_forums' => 'z' ),
									   'where' => 'z.new_template_id=t.new_template_id AND z.reply_template_id=t.reply_template_id',
									   'type'  => 'inner',
								)
						   )
						));
	$this->DB->execute();
	$row = $rows = array();

	while( $r = $this->DB->fetch() )
	{
		$rows[] = $r['forum_id'];

		if( empty( $row ) )
		{
			$row = $r;
		}
	}

 

Найти

 

       $formData['forumId'] = $this->registry->output->formMultiDropdown( "forumId[]", $forumList, array( $row['forum_id'] ), 5, "forumId" );

Заменить на

 

       $formData['forumId'] = $this->registry->output->formMultiDropdown( "forumId[]", $forumList, $rows, 5, "forumId" );
       $formData['forumId'] .= '<input type="hidden" name="_forumsId" values="'.implode( ',', $rows ).'">'."\n";

 

Найти

 

       foreach( $forumId as $id )
       {
           $data['forum_id'] = $id;
           $this->DB->replace( 'defaultpost_templates_forums', $data, 'forum_id='.$id );
       }

Ниже добавить

 

	$_forumsId = array_filter( array_map( 'intval', explode( ',', $this->request['_forumsId'] ) ) );

	if( count( $diff = array_diff( $_forumsId, $forumId ) ) )
	{
		$this->DB->delete('defaultpost_templates_forums', 'forum_id IN (' . implode( ',', $diff ));
	}

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

Странно, у меня вообще ничего после правок не изменилось :unsure:

 

При настройке и сохранении конфигурации, выбранные в списке форумы так и исчезают из списка...

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

Нет возможности проверить, но по идее должно работать.

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

Не работает, к сожалению. Разницы не заметил после редактирования файла.

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

Выше

$this->DB->build(array('select' => '*', 'from' => 'defaultpost_templates_forums'));

Добавить

return $this->forumArray;

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

Вот сейчас заработало, огромное Вам спасибо! Именно то, что нужно, теперь можно как угодно, и сколько угодно форумов сразу настроить 046.gif

А это не сильно на производительности сайта скажется (если сразу на 50 форумов будут установлены шаблоны)?

Изменено пользователем Strategius

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

А это не сильно на производительности сайта скажется (если сразу на 50 форумов будут установлены шаблоны)?

Не скажется.

  • 5 месяцев спустя...
Опубликовано:
  • Автор

Обнаружил очень неприятный баг с этим хуком - при создании темы шаблон успешно подгружается, но при редактировании текста в шаблоне, а именно вставке текста (посредством мышки или CTRL+V), текст мигает и если мы были скажем внизу абзаца, курсор мыши перемещает наверх, как будто бы шаблон перезагрузился и вставился вновь. Это очень неприятно и приходится каждый раз скроллить заново, и особенно неудобно, если шаблон длинный и мы были в середине или в конце текста :(

 

Пожалуйста помогите исправить этот баг.

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

Никаких прыжков не замечаю.

Пробуйте другой браузер, пусть юзеры проверят.

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

Сейчас на странице 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.