Несколько профилей в TinyMCE
Прислано: botan
вт, 14/08/2007 - 14: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);
Потом сравнивания визибилити видит что данный профиль не подходит и не грузит его.
В связи с этим в общем то и вопрос ... я может не правильно делал настройки, или все таки он не верно грузит нужный профиль?
- botan's blog
- Для комментирования войдите или зарегистрируйтесь
Все вы правильно делаете, вы пошли еще дальше в изучение кода воспроизводящего данную ошибку. Когда-то здесь такой вопрос поднимался - и нормального решения небыло найдено. Это так сказать баг-фича редактора =)
Когда на сайте ставил 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 и поэтому думаю разберетесь... в отличии от меня =)
- Для комментирования войдите или зарегистрируйтесь
По-большому счету исправить довольно не сложно, на первый взгляд.
Просто совершенно не хочется переделывать, изначально неверно сделанный модуль .. ИМХО
Непонятно зачем делать несколько идентичных запросов к БД:
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 сериализом, потому что по-моему это настолько же важный параметр отображения как и роли, которые можно было бы также вынести и все работало просто шикарно бы.
- Для комментирования войдите или зарегистрируйтесь
судя по коду - реально первый попавшийся профиль, однако на практике там где-то есть сортировка по алфавиту, я делал роли с префиксом aa_ , чтобы шли раньше анонима, и все работало (такой совет откопал на ДО)
- Для комментирования войдите или зарегистрируйтесь
На скорую руку сделал небольшой хак для тини.
файл 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; } } ?>
После этого куска происходит подмена имени профиля.
Сначала грузятся все профили, которые подходят по ролям, потом выбирается первый, подходящий по визибилити и только потом грузится.
Отличие в том, что в оригинале выбирается первый не учитывая визибилити, после хака первый подходящий по ролям и визибилити.
- Для комментирования войдите или зарегистрируйтесь



Комментарии