WYSIWYG + CKEditorがHTMLクラスを削除しないようにする


9

CKEditorでWYSIWYGエディターを使用しています。「ソース」ビューから要素にカスタムクラスを追加すると、ソースビューから切り替えるときにCKEditorがそれらのクラスを取り除きます。

これに対する解決策を探しているときに、CKEditorを単独で使用する場合の修正方法を説明するCKEditorモジュールのページを見つけました。(基本的に、config.allowedContent = true高度なコンテンツフィルター設定でJS構成を設定する必要があります)。

ただし、WYSIWYGを介してCKEditorを使用する場合、これらの設定は管理インターフェースで公開されません。WYSIWYGを介してCKEditorを使用する場合、同じことをどのように実現しますか?

PS:CKEditorはメディアプラグインと統合されていないため、単独では使用できません。


どのCKEditorバージョンをライブラリフォルダーにダウンロードしましたか?
Beebee 2013年

バージョン4.2を使用
jrharshath 2013年

回答:


4

CKEditorのどのバージョンを使用していますか?エディターに定義されていない属性を自動的に削除する自動コンテンツフィルター(ACF)と呼ばれる機能を持つCKEditor 4.1+に問題があります:https : //drupal.org/node/1956778

問題のパッチ#37は私のために働いた。


パッチは私のために失敗している間、私はに「allowedContent = true」をハードコード化されたeditors/ckeditor.incwysiwyg_ckeditor_settingsfunciton
jrharshath

うまくいきました。そのパッチはwysiwygの-devバージョンに適用する必要があるため、適用されなかったのかもしれません。
Dave Bruns 2013年

ただし、パッチにはその1行よりも多くのものが含まれています。すべてが適切に機能するように、十分にテストしてください。
Beebee 2013年

10

解決策を見つけました。

これはフィルタリングをオフにします、それは機能していますが、良い考えではありません...

config.allowedContent = true;

コンテンツ文字列を操作することは、idなどでは正常に機能しますが、クラスとスタイルのフィルタリングでは()と{}があるため、クラスとスタイルの属性では機能しません。

だから私の賭けは、エディタで任意のクラスを許可することです:

config.extraAllowedContent = '*(*)';

これにより、あらゆるクラスとあらゆるインラインスタイルが可能になります。

config.extraAllowedContent = '*(*);*{*}';

すべてのタグにclass = "asdf1"とclass = "asdf2"のみを許可するには:

config.extraAllowedContent = '*(asdf1,asdf2)';

(したがって、クラス名を指定する必要があります)

pタグにのみclass = "asdf"を許可するには:

config.extraAllowedContent = 'p(asdf)';

タグのid属性を許可するには:

config.extraAllowedContent = '*[id]';

などなど

スタイルタグを許可するには(<style type = "text / css"> ... </ style>):

config.extraAllowedContent = 'style';

もう少し複雑に:

config.extraAllowedContent = 'span;ul;li;table;td;style;*[id];*(*);*{*}';

それがより良い解決策であることを願っています...


1
どこ?!?!!?!?どのファイルに!!! インターネット上の誰も、このconfig.allowedContentを設定する必要がある場所について一度も言及していませんか?
coderama 2014年

@coderama / admin / config / content / ckeditorで、編集するプロファイルを選択し、[詳細オプション]を展開して、カスタムJavaScript構成に配置します
UnsettlingTrend

2

これは、WYSIWYGモジュールに追加する必要があるもののようです。カスタム設定をエディターに追加する機能は、かなり広範囲にわたる要件です。しかし、それがない場合でも、アップグレード時に壊れるので、モジュール自体を編集しないことをお勧めします...幸い、モジュールはへの呼び出しを提供するdrupal_alterので、カスタムモジュールでは次のようになります。

function mymodule_wysiwyg_editor_settings_alter(&$settings, $context){
    //check if the editor is ckeditor and the version is at least 4.0
    if($context['profile']->editor=='ckeditor' && $context['editor']['installed version'][0]>3){
        //add custom settings for ckeditor 4.+ here
        $settings['allowedContent'] = TRUE;
    }
}

ここで、「mymodule」は明らかにカスタムモジュールの名前です。これにより、他の人のモジュールを編集することなくタスクを実行できます。


0

次のものをmodules / wysiwyg / editors / ckeditor.incに追加してみてください

'allowedContent' => TRUE,function wysiwyg_ckeditor_settings($editor, $config, $theme)

これで次のようになります:

function wysiwyg_ckeditor_settings($editor, $config, $theme) {
  $settings = array(
    'width' => 'auto',
    // For better compatibility with smaller textareas.
    'resize_minWidth' => 450,
    'height' => 420,
    // @todo Do not use skins as themes and add separate skin handling.
    'theme' => 'default',
    'skin' => !empty($theme) ? $theme : 'kama',
    // By default, CKEditor converts most characters into HTML entities. Since
    // it does not support a custom definition, but Drupal supports Unicode, we
    // disable at least the additional character sets. CKEditor always converts
    // XML default characters '&', '<', '>'.
    // @todo Check whether completely disabling ProcessHTMLEntities is an option.
    // ADDED  'allowedContent' => TRUE, to keep WYSIWYG from removing classes
    'entities_latin' => FALSE,
    'entities_greek' => FALSE,
    'allowedContent' => TRUE, 
  );

0

ソースをハックすることなく、またこれらの設定が読み取られているブリープ音を把握することなく、独自のカスタムモジュールにこれを追加できます。

function mymodule_wysiwyg_editor_settings_alter(&$settings, $context) {
    if ($context['profile']->editor == 'ckeditor') {
        $settings['extraAllowedContent'] = array(
            'a[download,type,length,href]',
            'span;ul;li;table;tr;td;style;*[id];*(*);*{*}'
        );
    }
}

OPが要求する設定は、*(*);*{*}上記の@Tommyの回答からのものです。これは、任意の要素でクラスとスタイルの属性を許可するようです。残りは単なる例のエントリです。別の例として、このエントリはメディアモジュールに必要なタグを許可します。

'img[title,alt,src,data-cke-saved-src](wysiwyg-break,drupal-content);video[width,height,controls,src](*);source[src,type];audio[controls,src](*);img[*](media-element,file-default)',

0

Filtered HTML-filterは、許可されたHTML要素にない要素からクラスを取り除きます。段落タグ(<p>)は、クラスが適用される最も頻繁な要素である可能性がありますが、デフォルトではそこにありません(混乱して不自然になる場合があります)。そこに配置すると、Filtered HTMLはこれらのタグからクラスを削除しなくなります。イメージタグ(<img>)についても同様です。


ただし、HTML要素の[許可]オプションにクラスを配置する方法。私の知る限りでは、HTML要素をリストに配置できます。つまり、<div>、<span>などです。このため、このdivとspanは削除されませんが、そこにクラスを配置する方法を教えてください。
CodeNext 2016年

そこにクラスを置く必要はありません。HTML要素がリストにある場合、そのクラスは変更されず、削除されません。
cptstarling 2016年

なぜ私の投稿が昨日表示されているのか理解できません。数か月前に質問しましたが、何か問題はありますか???????
CodeNextは

奇妙なのは、あなたが返信した答えはたった2日しか
経ってい

誰もいない、非常に奇妙な、私はこれについて何ヶ月も何もしていません...ああ、神様、ログアウトして再度ログインさせてください...
CodeNext
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.