При создании одного профиля для редактора все работает отлично, даже "Visibility" -> "Show tinymce on specific pages", задаем там нужные нам странички (например, guestbook/*) и все работает. Соответственно указываем там права только для авторизированных пользователей и делаем пару кнопочек (болд, италик, список).
Далее нам нужно что бы группа админов при создании ноды пользовалась не этим профилем, а расширенным.
Делаем еще один профиль там указываем видимость node/* и права группы админов.
И что самое обидное при создании ноды редактор не работает.
Поковырял .. что увидел.
Возвращает первый попавшийся в базе, подходящий по правам профиль. С другой стороны, если мы выбрали показывать второй профиль только админам, вроде можно было бы юзать спокойно, проблема в том, что админы являются и авторизованными пользователями тоже.
Поэтому он подгружает и первый профиль.
А дальше просто грузит профиль по имени
Потом сравнивания визибилити видит что данный профиль не подходит и не грузит его.
В связи с этим в общем то и вопрос ... я может не правильно делал настройки, или все таки он не верно грузит нужный профиль?
Комментарии
Все вы правильно делаете, вы пошли еще дальше в изучение кода воспроизводящего данную ошибку. Когда-то здесь такой вопрос поднимался - и нормального решения небыло найдено. Это так сказать баг-фича редактора
Когда на сайте ставил Tiny, то использовал следующий код в template.php
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 и поэтому думаю разберетесь... в отличии от меня
По-большому счету исправить довольно не сложно, на первый взгляд.
Просто совершенно не хочется переделывать, изначально неверно сделанный модуль .. ИМХО
Непонятно зачем делать несколько идентичных запросов к БД:
SELECT rid FROM p_tinymce_role WHERE name = 'second'
И их количество будет расти пропорционально количеству профилей, одним запросом было бы оптимальнее сделать.
Непонятно зачем делать условие return ($name ? $profiles[$name] : $profiles); в функции tinymce_profile_load($name = ''), если потом функция tinymce_config сразу же напрямую обращается не к массиву объектов, а к определено одному объекту $settings = $profile->settings;
$init = tinymce_config($profile);
Это я бегло осмотрел модуль, попробую какой нить небольшой патчик наваять -)
К тому же непонятно зачем запихивать "визибилити" в БД в общие settings сериализом, потому что по-моему это настолько же важный параметр отображения как и роли, которые можно было бы также вынести и все работало просто шикарно бы.
судя по коду - реально первый попавшийся профиль, однако на практике там где-то есть сортировка по алфавиту, я делал роли с префиксом aa_ , чтобы шли раньше анонима, и все работало (такой совет откопал на ДО)
На скорую руку сделал небольшой хак для тини.
файл tinymce.module
после
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;
}
}
?>
вставляем вот такой кусок:
$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;
}
}
?>
После этого куска происходит подмена имени профиля.
Сначала грузятся все профили, которые подходят по ролям, потом выбирается первый, подходящий по визибилити и только потом грузится.
Отличие в том, что в оригинале выбирается первый не учитывая визибилити, после хака первый подходящий по ролям и визибилити.