Как программно добавить домен в список разрешенных для iframe

В одном из топиков затрагивалась тема ручного добавления нужных доменов в список разрешенных для вставки в топики и комментарии тегами iframe, object и embed. Сегодня я вам расскажу как правильно сделать тоже самое только программно при разработке, например, плагина.

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

  1. Добавить домены с помощью манипуляций с конфигурацией типографа ливстрит (ключ «jevix») внутри конфига разрабатываемого плагина (config/config.php).
  2. Добавить домены в наследуемом классе модуля обработки текста в ЛС, в методе инициализации.

Первый вариант неудобен т.к. конфигурация Jevix описывается множеством вложенных массивов и часть параметров не имеет строковых ключей чтобы можно было прямо добавить значения в массив, а сначала нужно будет найти числовой ключ нужного параметра, а потом добавлять значения. Как минимум граничит с добавлением цикла для перебора значений разрешенных параметров (атрибутов) для тегов. Поэтому этот способ я не рекомендую. Этот способ годится только для добавления новых тегов и их атрибутов — тогда можно просто добавить значения в массив и сохранить изменения. Но редактирование существующих настроек, которые занесены в конфигурацию Jevix`а (/config/jevix.php) по-умолчанию из коробки — не самое удобное занятие при использовании данного способа.

Поэтому перейдем ко второму способу, который значительно удобнее и изящнее.

Немного теории

За обработку текстов в ЛС отвечает модуль текста, который расположен в директории /engine/modules/text/Text.class.php лайвстрита. В публичном методе Init () данного класса производится создание нового объекта типографа Jevix, который используется в ливстрите, загрузка и применение его настроек, заданных в конфигурации (/config/jevix.php).

Практика

Для успешной реализации задуманной нами идеи необходимо наследовать указанный класс и переопределить метод инициализации, вызвать родительский метод и добавить домены.

Редактировать параметры нужно сразу для трех тегов: object, embed и для тега iframe.

Что ж, приступим.

Реализация

1. Наследование модуля текста.

В главном классе плагина, который находится в корне каталога плагина и имеет имя вида PluginYourpluginname.class.php следует добавить в класс PluginYourpluginname который наследует родительский класс Plugin в массив aInherits запись, свидетельствующую о необходимом наследовании:


  protected $aInherits = array (
    'module' => array ('ModuleText')
  );


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

Примечание

Как ранее уже замечалось, нельзя наследовать в листрите два модуля: модуль плагина (Plugin) и модуль Хука (Hook).

2. Переопределение метода инициализации.

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

Наследуемый модуль должен располагаться при использовании указанной записи по пути /classes/modules/text/Text.class.php относительно корня папки плагина.

Создадим класс:


class PluginYourpluginname_ModuleText extends PluginYourpluginname_Inherit_ModuleText {

}


По поводу именования родительского класса можно почитать здесь.

Внутрь класса добавим переопределяемый метод инициализации и вызовем родительский метод дабы ничего не поломать :)

  public function Init () {
    parent::Init ();
    // тут будет код
  }


3. Добавление доменов в настройки типографа.

Внутри класса модуля текста (ModuleText) доступен член класса oJevix — объект типографа. Также есть публичный метод GetJevix (), который возвращает этот же объект. Все правила джевикс хранит в массиве tagsRules своего объекта.

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

Как указано, все правила для типографа хранятся в члене класса tagsRules объекта джевикса, доступ к которым из наследуемого модуля текста можно получить так:


$this -> oJevix -> tagsRules


Следует заметить что структура этого массива отличается от структуры, которую можно увидеть в конфигурации.

Какие записи нужно сделать:

  • Домены для тега iframe записываются в атрибуте src
  • Домены для тега embed записываются также в атрибуте src
  • Домены для тега object записываются в атрибуте data

Для удобства создадим массив соответствий:


array ('iframe' => 'src', 'embed' => 'src', 'object' => 'data')


Также домены, которые мы хотим занести в список разрешенных зададим в конфиге плагина (/config/config.php относительно корня каталога плагина):


// Список разрешенных доменов
$config ['Allowed_Domains_List'] = array (
  'livestreetguide.com',
);


домены следует записывать без указания протокола.

В результате получаем итоговый код:


foreach (array ('iframe' => 'src', 'embed' => 'src', 'object' => 'data') as $sTag => $sSource) {
  $this -> oJevix -> tagsRules [$sTag][Jevix::TR_PARAM_ALLOWED][$sSource]['#domain'] = array_merge (
    $this -> oJevix -> tagsRules [$sTag][Jevix::TR_PARAM_ALLOWED][$sSource]['#domain'],
    Config::Get ('plugin.yourpluginname.Allowed_Domains_List')
  );
}


Небольшие пояснения:

TR_PARAM_ALLOWED — это константа, объявленная в классе типографа Jevix, которая указывает на ключ массива, в котором расположен список разрешенных атрибутов для текущего тега.

Таким образом мы для всех тегов в цикле добавляем заданные в конфиге плагина домены.

UPD: Полный листинг кода модуля:


class PluginYourpluginname_ModuleText extends PluginYourpluginname_Inherit_ModuleText {

  public function Init () {
    parent::Init ();
    //
    // Adding allowed domains list for three tags: iframe, embed and for object
    //
    foreach (array ('iframe' => 'src', 'embed' => 'src', 'object' => 'data') as $sTag => $sSource) {
      $this -> oJevix -> tagsRules [$sTag][Jevix::TR_PARAM_ALLOWED][$sSource]['#domain'] = array_merge (
        $this -> oJevix -> tagsRules [$sTag][Jevix::TR_PARAM_ALLOWED][$sSource]['#domain'],
        Config::Get ('plugin.yourpluginname.Allowed_Domains_List')
      );
    }
  }

}


Резюме

Код выполнен компактным и максимально лаконичным без ущерба читабельности.

Спасибо за внимание. Держимся на связи, livestreetguide.
0 комментариев
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.