Provider for CKEditor Internal-Sulu-Link ======================================== `LinkProvider` are used to load data for the "Internal-Sulu-Link" Plugin for the CKEditor. It returns an array of `LinkItem` instances, identified by ids which will be passed to the `TeaserProviderInterface::preload` function. This feature can be used by the CKEditor Plugin "Sulu-Internal-Link" or by adding Markup to your twig-templates (see following example and the chapter :doc:`../bundles/markup/index`). .. code-block:: html The LinkItem consists of the following properties: * id * title * url * published Example ------- This example assumes that the entities will be selected by a datagrid. For this we already build an abstract implementation which can be configured with the `LinkConfiguration`. .. code-block:: php namespace AppBundle\Link; use Sulu\Bundle\ContentBundle\Markup\Link\LinkConfiguration; use Sulu\Bundle\ContentBundle\Markup\Link\LinkItem; use Sulu\Bundle\ContentBundle\Markup\Link\LinkProviderInterface; class LinkProvider implements TeaserProviderInterface { /** * {@inheritdoc} */ public function getConfiguration() { return new LinkConfiguration( 'app.link', 'ckeditor/link/list@sulucontent', [ 'url' => '...', // your api url to load list 'hrefUrl' => '...<%=link.href%>', // your api url to load single item 'idKey' => 'id', 'titleKey' => 'name', 'publishedExpression' => [new DisplayCondition('published', DisplayCondition::OPERATOR_EQUAL, true)], 'resultKey' => '...', // your api result-key 'searchFields' => ['title'], 'matchings' => [ [ 'content' => 'public.title', 'name' => 'title', ], ], ] ); } /** * {@inheritdoc} */ public function preload(array $hrefs, $locale, $published = true) { if (0 === count($hrefs)) { return []; } $items = ...; // load items by id foreach ($items as $item) { $result[] = new LinkItem(...); // create link-item foreach item } return $result; } public function find(array $ids, $locale) { if (0 === count($ids)) { return []; } $items = ...; // load items by id foreach ($items as $item) { $result[] = new Teaser(...); // create teaser foreach item } return $result; } } Now you can create a service for this class and add the tag ``. How to create a custom link-select component? --------------------------------------------- A link-select aura-component, which provides the ability to select or deselect items. The following example is a simple (and not complete) example. If you need a full example please take a look at the components `ckeditor/link/list@sulucontent` or `ckeditor/link/page@sulucontent` or `ckeditor/link/article@suluarticle`. .. code-block:: javascript define(function() { 'use strict'; return { defaults: { options: { link: {}, locale: null, webspace: null, setHref: function(id, title, published) { }, selectCallback: function(id, title, published) { } } }, initialize: function() { this.resolveHref(); this.render(); }, resolveHref: function() { if (!this.options.link.href) { this.options.setHref(); return; } this.loadSingle(this.options.link.href, this.options.locale).then(function(data) { this.options.setHref(data.id, data.title, data.published); }.bind(this)); }, loadSingle: function(href, locale) { return ...; // load selected item by href }, render: function() { var $container = $(this.templates.contentDatasource()); this.$el.append($container); this.sandbox.start( [ { name: 'datagrid@husky', options: { el: '#href-select', instanceName: 'link', url: ..., // your api url resultKey: ..., // your api result-key clickCallback: function(id, item) { this.options.selectCallback(id, item.title, true); }.bind(this), selectedCounter: false, paginationOptions: { dropdown: { limit: 20 } }, viewOptions: { table: { selectItem: false } }, matchings: [ { content: 'public.id', name: 'id' }, { content: 'public.title', name: 'title' } ] } } ] ); } }; });