Несколько профилей в TinyMCE

Главные вкладки

Аватар пользователя botan botan 14 августа 2007 в 18:21

При создании одного профиля для редактора все работает отлично, даже "Visibility" -> "Show tinymce on specific pages", задаем там нужные нам странички (например, guestbook/*) и все работает. Соответственно указываем там права только для авторизированных пользователей и делаем пару кнопочек (болд, италик, список).
Далее нам нужно что бы группа админов при создании ноды пользовалась не этим профилем, а расширенным.
Делаем еще один профиль там указываем видимость node/* и права группы админов.
И что самое обидное при создании ноды редактор не работает.
Поковырял .. что увидел.

$profile_name = db_result(db_query('SELECT s.name FROM {tinymce_settings} s INNER JOIN {tinymce_role} r ON r.name = s.name WHERE r.rid IN (%s)', implode(',', array_keys($user->roles))));


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

А дальше просто грузит профиль по имени


$profile = tinymce_profile_load($profile_name);

Потом сравнивания визибилити видит что данный профиль не подходит и не грузит его.

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

Комментарии

Аватар пользователя Shedko Shedko 14 августа 2007 в 18:59

Все вы правильно делаете, вы пошли еще дальше в изучение кода воспроизводящего данную ошибку. Когда-то здесь такой вопрос поднимался - и нормального решения небыло найдено. Это так сказать баг-фича редактора Smile

Когда на сайте ставил Tiny, то использовал следующий код в template.php

function НАЗВАНИЕ_ТЕМЫ_tinymce_theme($init, $textarea_name, $theme_name, $is_running) {
switch ($textarea_name) {
        // Disable tinymce for these textareas
        case 'log': // book and page log
        case 'img_assist_pages':
        case 'caption': // signature
        case 'pages':
        case 'access_pages': //TinyMCE profile settings.
        case 'user_mail_welcome_body': // user config settings
        case 'user_mail_approval_body': // user config settings
        case 'user_mail_pass_body': // user config settings
        case 'synonyms': // taxonomy terms
        case 'description': // taxonomy terms

        case 'message':
        case 'nodewords-description': //

        unset($init);
        break;
        // Force the 'simple' theme for some of the smaller textareas.
        case 'signature':
        case 'site_mission':
        case 'comment':
        case 'site_footer':
        case 'site_offline_message':
        case 'page_help':
        case 'user_registration_help':
        case 'user_picture_guidelines':
        $init['theme'] = 'simple';
        foreach ($init as $k => $v) {
        if (strstr($k, 'theme_advanced_')) unset($init[$k]);
        }
        break;
        }
        // Add some extra features when using the advanced theme.
        // If $init is available, we can extend it
        if (isset($init)) {
        switch ($theme_name) {
        case 'advanced':
        $init['width'] = '100%';
        break;
        }
        }
        // Always return $init
        return $init;
}

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

В приведенном примере нет разделения на роли, есть только использование "облегченного" варианта в различных полях ввода которые не требуют сложного форматирования - например комментарии, поля в профиле и т.д. Но судя по вашему же посту вы знаете php и поэтому думаю разберетесь... в отличии от меня Smile

Аватар пользователя botan botan 14 августа 2007 в 21:59

По-большому счету исправить довольно не сложно, на первый взгляд.
Просто совершенно не хочется переделывать, изначально неверно сделанный модуль .. ИМХО
Непонятно зачем делать несколько идентичных запросов к БД:

SELECT rid FROM p_tinymce_role WHERE name = 'main'
SELECT rid FROM p_tinymce_role WHERE name = 'second'

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

Непонятно зачем делать условие return ($name ? $profiles[$name] : $profiles); в функции tinymce_profile_load($name = ''), если потом функция tinymce_config сразу же напрямую обращается не к массиву объектов, а к определено одному объекту $settings = $profile->settings;

$profile = tinymce_profile_load($profile_name);
$init = tinymce_config($profile);

Это я бегло осмотрел модуль, попробую какой нить небольшой патчик наваять -)

К тому же непонятно зачем запихивать "визибилити" в БД в общие settings сериализом, потому что по-моему это настолько же важный параметр отображения как и роли, которые можно было бы также вынести и все работало просто шикарно бы.

Аватар пользователя igdrasil@drupal.org igdrasil@drupal.org 14 августа 2007 в 22:15

судя по коду - реально первый попавшийся профиль, однако на практике там где-то есть сортировка по алфавиту, я делал роли с префиксом aa_ , чтобы шли раньше анонима, и все работало (такой совет откопал на ДО)

Аватар пользователя botan botan 15 августа 2007 в 17:23

На скорую руку сделал небольшой хак для тини.
файл tinymce.module
после

<?php
  if (!$profile_name) {
    $profile_name = db_result(db_query('SELECT s.name FROM {tinymce_settings} s INNER JOIN {tinymce_role} r ON r.name = s.name WHERE r.rid IN (%s)', implode(',', array_keys($user->roles))));
    if (!$profile_name) {
      return $element;
    }
  }
?>

вставляем вот такой кусок:

<?php
        $resurs = db_query('SELECT s.* FROM {tinymce_settings} s INNER JOIN {tinymce_role} r ON r.name = s.name WHERE r.rid IN (%s) ORDER BY s.name ASC', implode(',', array_keys($user->roles))); // выбираем все профили где разрешены для нас роли
        while($pf = db_fetch_object($resurs)){ //перебираем их
                $pf->settings = unserialize($pf->settings); // преобразуем в массив
                if(_tinymce_page_match($pf)){ // проверяем права по визибилити
                        $profile_name = $pf->name; // если подходит визибилити, то первый попавшийся профиль по алфавиту будет выбран
                        break;
                        }
        }
?>

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

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