Drupal WYSIWYG - различный редактор CSS для каждого типа узла, страницы и т. Д.? - PullRequest
2 голосов
/ 22 марта 2011

Я использую Drupal с модулем WYSIWYG.

Я хочу, чтобы CSS в моем редакторе был таким же, как моя страница, поэтому цвета, шрифты и т. Д. Все выглядят так, как они будут при сохранении страницы. У меня разные CSS для разных типов узлов и на определенных страницах. Как я могу импортировать эти правила CSS в редактор?

Использование обычных селекторов CSS не работает, если html находится за пределами iframe, используемого Wysiwyg. Использование «.cke_show_borders» в качестве селектора работает, но тогда я не могу загрузить разные стили на разных страницах редактирования узла.

Я разместил этот вопрос на странице модулей, и кажется, что нет встроенного решения, но кто-нибудь нашел решение этой проблемы? Будет ли какой-нибудь способ javascript для переноса стилей в iframe со страницы за его пределами?

Спасибо

Ответы [ 3 ]

2 голосов
/ 01 декабря 2011

У меня была похожая проблема с ckeditor, и мне удалось ее решить с помощью hook_js_alter (которая пока присутствует только в drupal7)

Использовать этот хук для этой проблемы не друпалвей, но все равно работает.

Может быть, этот подход может помочь вам достичь того же результата для других редакторов, таких как tinymce

Итак, в результате я изменяю настройки js, которые обычно загружаются через drupal_add_js ($ data, 'setting').Так что есть что-то вроде Drupal.settings.wysiwyg.configs.ckeditor.formatfull_html.contentsCss, и я добавляю в него новый элемент.Это массив стилей CSS, который загружает ckeditor / wysiwyg, когда запускает редактор.Этот фрагмент кода относится к полному редактору html (formatfull_html), вам придется изменить его или изменить в соответствии с вашими потребностями.

function mymodule_js_alter(&$javascript) {
  // Checking if we're editing a node.
  if (arg(0) == 'node' && arg(2) == 'edit') {
    $nid = arg(1);

    // Loading a node to check it's type. 
    // we may be certain that it's loaded from cache.
    $node = node_load((int) $nid);
    if ($node->type == 'your-node-type') {
      foreach ($javascript['settings']['data'] as &$row) {
        // This will make changes to the proper js-settings record.
        if (isset($row['wysiwyg']['configs']['ckeditor']['formatfull_html']['contentsCss'])) {
          $row['wysiwyg']['configs']['ckeditor']['formatfull_html']['contentsCss'][] = url(drupal_get_path('module','mymodule') . '/wysiwyg-style.css');
        }
      }
    }
  }
}

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

Редактировать: Мне только что удалось найти более «Drupalway» решение этой проблемы, но подход тот же.

function mymodule_element_info_alter(&$types) {
  $types['text_format']['#pre_render'][] = 'mymodule_pre_render_text_format';
}

function mymodule_pre_render_text_format($element) {
  if ($element['#entity_type'] == 'node' && $element['#bundle'] == "your-node-type" && $element['#type'] == 'textarea') {
    $setting = array();
    $setting['wysiwyg']['configs']['ckeditor']['formatfull_html']['contentsCss'][] =  url( drupal_get_path('module','mymodule') . '/wysiwyg-style.css');
    drupal_add_js($setting , 'setting');
  }
  return $element ;
}
0 голосов
/ 23 марта 2011

Боюсь, что основной ответ: «К сожалению, в данный момент не для Drupal».Чтобы действительно видеть CSS, который меняется от страницы к странице, система WYSIWYG должна быть очень, очень «умной» и тесно интегрированной с другими частями системы, такими как создание заголовков, которые создают ссылки на файлы CSS.

На самом деле я работал над модулем, чтобы попытаться реализовать некоторые функции, которые вы здесь описываете - позволить страницам выбирать разные группы стилей CSS на разных подготовленных таблицах стилей, где эти таблицы стилей затем были повторно проанализированы.для конкретного использования в редакторе WYSIWYG.Это была большая работа, и, к сожалению, она не находится на том этапе разработки, на котором было бы хорошо поделиться.Следующим вероятным шагом для Drupal будет включение этого типа функциональности вместо того, чтобы автоматически узнавать, какие css вы добавляете в свой шаблон - просто потому, что свобода, которую Drupal предоставляет вам с шаблонами, означает, что «ядро» понятия не имеет овсе действительно то, что вы делаете с CSS.Если бы Drupal попытался интегрировать шаблон и редактор CSS так, как вы описали, шаблонирование было бы либо сильно ограничено, либо намного сложнее, чем сейчас.

Если вы используете WYSIWYG API, вы можете назначить свойтам есть собственная таблица стилей для редактора - к сожалению, она не динамическая, поэтому вы не можете рассчитать путь таблицы стилей на основе кода PHP.

0 голосов
/ 22 марта 2011

Вы можете определить стили в редакторе WYSIWYG (вы используете CKeditor или TinyMCE?), Чтобы установить некоторые пользовательские классы вокруг вашего текста (читайте в iframe). После этого вы можете использовать hook_init () для добавления загрузки контекстных файлов CSS через функцию drupal_add_css () .

...