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

Избавление от внешних ссылок

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

Возникла необходимость избавиться от внешних ссылок путем редиректа вида www.forum.ru/out/http://yandex.ru

 

Просмотрев разные варианты, решил пойти по пути правки файла /admin/sources/classes/bbcode/custom/defaults.php, отвечающего за работу с кодом URL.

В самом конце файла идет проверка на внешние ссылки, добавление nofollow и external. Там же вставил такие строчки:

if ($extlink == 1 ) {

if ($this->settings['htaccess_mod_rewrite'] == 1) 	$option = "{$this->settings['board_url']}/out/$option";
else $option = "{$this->settings['board_url']}?/out/$option";
	}

 

Подобное решение, как казалось, позволило сохранить в базе "чистые" урлы на случай, если редирект нужно будет выключить, а с другой стороны позволяет применить систему сразу ко всему сообществу, включая блоги и комментарии.

 

Однако появилось неожиданная проблема: при первичной отправке сообщения оно записывается в базу корректно (то есть там чистый урл _http://yandex.ru ), однако, если мы сообщение редактируем, оно по какой-то причине попадает в редактор уже с "грязным" урлом - _http://www.forum.ru/out/http://yandex.ru Это немного неожиданно, потому что вроде бы добавления касались именно отображаемой информации, html-кода.

 

Подскажите, пожалуйста, где копнуть, чтобы этого избежать.

 

Версия 3.3

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

Опубликовано:
Обратите внимание

По указанному вами в профиле "Board url" находится не IP.Board, либо модифицированный пиратский скрипт с удаленными копирайтами. Если вы указали неверный URL, пожауйста, поправьте его, потому что он скорее всего потребуется при диагностике вашей проблемы. Нелицензионные скрипты не приветствуются, т.к. зачастую именно некорректное "нуление" и является причиной проблем в них.

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

Подобное решение, как казалось, позволило сохранить в базе "чистые" урлы

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

Можно попробовать такой костыль

 

	if( $extlink AND $this->request['do'] != 'edit_post' )
	{
		if( $this->settings['htaccess_mod_rewrite'] == 1 )
			$option = "{$this->settings['board_url']}/out/{$option}";
		else
			$option = "{$this->settings['board_url']}?/out/{$option}";
	}

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

Спасибо огромное. Я как раз сообразил, что в WYSIWYG-редакторе как раз тоже нужно парсить, он же WYSIWYG :rolleyes: Сидел думал, какое бы условие придумать, чтобы понять, что мы не в посте, а в редактировании.

 

Однако, do при редактировании поста отдает значение 'editBoxShow', а не 'edit_post', в комментах в блогах - editentry и showEdit.

 

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

Опубликовано:
AND ! in_array($this->request['do'], array('edit_post', 'editBoxShow', 'editentry', 'showEdit'))

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

Дубль, сорри. Пока писал условие уже ответили...

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

Ну, это понятно, спасибо.

 

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

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

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

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

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

Спасибо, попробую.

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

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

Нет, не так. Контент вызывает не редактор, а событие (do) который вызывает редактор вместе с контеном. Значит этот вариант работать не будет. Ну в общем самый простой способ остается по прежнему проверка do, либо найти единое место через которое проходит текст при полном редактирование или быстром и сделать там замену.

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

Кстати, вот одна явная переменная которая присутствует и при запросе быстрого редактирования и при запросе полно редактирования $this->request['mod_options']

 

if( $extlink AND ! array_key_exists('mod_options', $this->request) )

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

Кстати, вот одна явная переменная которая присутствует и при запросе быстрого редактирования и при запросе полно редактирования $this->request['mod_options']

 

if( $extlink AND ! isset($this->request['mod_options']) )

В контенте, например, нет этой переменной.

Array ( [/articles_html/_/novosti/escho-odna-novost?do] => edit [module] => [section] => [request_method] => get [do] => edit [_isDatabase] => novosti/escho-odna-novost [database] => 1 [record] => 12 [category] => 11 )

Ну и "$this->request['do'] == 'edit'", до кучи.

 

P.S. Да и в блогах не вижу.

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

Значит не судьба у ТСа :)

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

Спасибо. Я упрямый - решение будет найдено обязательно

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

У Вас есть решение:

if( $extlink AND ! in_array( $this->request['do'], array('edit', 'edit_post', 'editBoxShow', 'editentry', 'showEdit') )

Если вдруг обнаружится ещё какой то ключ, просто добавите его в массив.

Сомневаюсь, что найдете что то лучше.

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

В общем, потыкался я и решил все же пойти по пути, предложенному siv1987 - проверять $this->request['do']

 

К сожалению, не смог унивесализировать эту проверку (хотел проверять по вхождению в значении переменной слова edit, но выяснилось, что при сохранении используется значение EditSave), так что где-то может проскочить кривой вариант в редакторе. Но это не смертельно.

 

Дмитрий, не понял, зачем нужен ключ edit_post. Он используется, как я заметил, при отображении списка других сообщений под окном редактирования на форумах. Разве он используется в редакторе?

 

 

siv1987, Dmitriy427 - огромное спасибо за советы!

 

 

P.S. Если вдруг кому-то потребуется решение задачи в целом, обращайтесь

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

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

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