Несколько профилей в 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);

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

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

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано Shedko в вт, 14/08/2007 - 14:59.

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

Когда на сайте ставил 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 и поэтому думаю разберетесь... в отличии от меня =)


Опубликовано botan в вт, 14/08/2007 - 17: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 в вт, 14/08/2007 - 18:15.

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


Опубликовано botan в ср, 15/08/2007 - 13: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;
			}
	}
?>

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

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