Create non editable block with text in CKEditor 5

为君一笑 提交于 2021-02-10 13:25:12

问题


How do I Create a non editable block with text in CKEditor 5.

I need something which in the final view generate a:

<div>Non editable message here</div>

I tried to use a UIElement and then set innerHTML but that still makes the element editable.

Just for reference: Her is the plugin I ended up using.

import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
import DecoupledEditor from '@ckeditor/ckeditor5-editor-decoupled/src/decouplededitor';
import Essentials from '@ckeditor/ckeditor5-essentials/src/essentials';
import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
import Bold from '@ckeditor/ckeditor5-basic-styles/src/bold';
import Heading from '@ckeditor/ckeditor5-basic-styles/src/bold';
import Italic from '@ckeditor/ckeditor5-basic-styles/src/italic';
import ButtonView from '@ckeditor/ckeditor5-ui/src/button/buttonview';
import imageIcon from '@ckeditor/ckeditor5-core/theme/icons/image.svg';
import Command from '@ckeditor/ckeditor5-core/src/command';
import { downcastElementToElement,downcastAttributeToAttribute,downcastAttributeToElement } from '@ckeditor/ckeditor5-engine/src/conversion/downcast-converters';
import { upcastElementToElement, upcastAttributeToAttribute,modelToViewAttributeConverter} from '@ckeditor/ckeditor5-engine/src/conversion/upcast-converters';
import attachPlaceholder from "@ckeditor/ckeditor5-engine/src/view/placeholder";
import ViewPosition from '@ckeditor/ckeditor5-engine/src/view/position';
import toWidgetEditable from '@ckeditor/ckeditor5-widget/src/utils';
import ClickObserver from '@ckeditor/ckeditor5-engine/src/view/observer/clickobserver';
import UpcastDispatcher from '@ckeditor/ckeditor5-engine/src/conversion/upcastdispatcher'; 
import { toWidget } from '@ckeditor/ckeditor5-widget/src/utils';

export default class TestWidget2 extends Plugin {
    static get pluginName() {
        return 'TestWidget2';
    }

    init() {
        console.log('TestWidget2::init()');
        const editor=this.editor;
        const model=editor.model;

        model.schema.register( 'myWidget', {
            inheritAllFrom: '$block',
            isObject: true
        } );

        editor.conversion.for( 'dataDowncast' )
            .add( downcastElementToElement( {
                model: 'myWidget',
                view: ( modelItem, writer ) => {
                    const elm=writer.createContainerElement( 'div', { class: 'widget' } );
                    return toWidget( div, writer, { label: 'widget label' } );
                }
            } ) );

        editor.conversion.for( 'editingDowncast' )
            .add( downcastElementToElement( {
                model: 'myWidget',
                view: ( modelItem, writer ) => {
                    const div = writer.createContainerElement( 'div', { class: 'widget' } );

                    return toWidget( div, writer, { label: 'widget label' } );
                }
            } ) );

        editor.conversion.for( 'upcast' )
            .add( upcastElementToElement( {
                view: {
                    name: 'div',
                    class: 'widget'
                },
                model: 'myWidget'
            } ) );
    }
}

回答1:


You can create the widget API for that:

import Widget from '@ckeditor/ckeditor5-widget/src/widget';
import { toWidget } from '@ckeditor/ckeditor5-widget/src/utils';
import { downcastElementToElement } from '@ckeditor/ckeditor5-engine/src/conversion/downcast-converters';
import { upcastElementToElement } from '@ckeditor/ckeditor5-engine/src/conversion/upcast-converters';

ClassicEditor
    .create( document.querySelector( '#editor' ), {
        plugins: [ Essentials, Paragraph, Widget, /* ... other plugins ... */ ],
        toolbar: [ 'undo', 'redo' ]
    } )
    .then( editor => {
        window.editor = editor;

        const model = editor.model;

        model.schema.register( 'myWidget', {
            inheritAllFrom: '$block',
            isObject: true
        } );

        editor.conversion.for( 'dataDowncast' )
            .add( downcastElementToElement( {
                model: 'myWidget',
                view: ( modelItem, writer ) => {
                    return writer.createContainerElement( 'div', { class: 'widget' } );
                }
            } ) );

        editor.conversion.for( 'editingDowncast' )
            .add( downcastElementToElement( {
                model: 'myWidget',
                view: ( modelItem, writer ) => {
                    const div = writer.createContainerElement( 'div', { class: 'widget' } );

                    return toWidget( div, writer, { label: 'widget label' } );
                }
            } ) );

        editor.conversion.for( 'upcast' )
            .add( upcastElementToElement( {
                view: {
                    name: 'div',
                    class: 'widget'
                },
                model: 'myWidget'
            } ) );

        editor.setData(
            '<p>foobar</p>' +
            '<div class="widget">Non editable text goes here</div>' +
            '<p>foobar</p>'
        );
    } )
    .catch( err => {
        console.error( err.stack );
    } );

The key point is to use the toWidget() function when downcasting an element to the editing view. Also, that element should be marked as an object in the schema.

Also don't forget to load the Widget plugin which turns on the support for widgets.




回答2:


According to the documentation isReadOnly : Boolean Set it to true. Official Documentation



来源:https://stackoverflow.com/questions/52298444/create-non-editable-block-with-text-in-ckeditor-5

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!