92 public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, array $third_party_settings,
FieldValueManagerInterface $field_value_manager, DomProcessorInterface $dom_processor, EntityDisplayRepositoryInterface $entity_display_repository, array $plugin_managers) {
93 parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $third_party_settings);
94 $this->fieldValueManager = $field_value_manager;
95 $this->domProcessor = $dom_processor;
96 $this->entityDisplayRepository = $entity_display_repository;
97 $this->bundleSelectorManager = $plugin_managers[
'bundle_selector'];
98 $this->deliveryProviderManager = $plugin_managers[
'delivery_provider'];
104 public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
105 $plugin_managers = [];
106 foreach ($container->getParameter(
'paragraphs_editor.plugin_managers') as $name => $def) {
107 $plugin_managers[$name] = $container->get($def->id);
112 $configuration[
'field_definition'],
113 $configuration[
'settings'],
114 $configuration[
'third_party_settings'],
115 $container->get(
'paragraphs_editor.field_value.manager'),
116 $container->get(
'dom_processor.dom_processor'),
117 $container->get(
'entity_display.repository'),
127 'title' => t(
'Paragraph'),
128 'bundle_selector' =>
'list',
129 'delivery_provider' =>
'modal',
130 'view_mode' =>
'default',
131 'prerender_count' =>
'10',
138 public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
139 $editable_data = $this->
process(
'load', $items, $form_state);
146 'markup' => $element + [
147 '#type' =>
'text_format',
148 '#format' => $editable_data->get(
'filter_format'),
149 '#default_value' => $editable_data->get(
'markup'),
151 '#attributes' => $editable_data->get(
'attributes'),
153 'library' => $editable_data->get(
'libraries'),
154 'drupalSettings' => $editable_data->get(
'drupalSettings'),
156 '#allowed_formats' => [$editable_data->get(
'filter_format')],
160 '#default_value' => $editable_data->get(
'context_id'),
168 public function settingsForm(array $form, FormStateInterface $form_state) {
171 $elements[
'title'] = [
172 '#type' =>
'textfield',
173 '#title' => $this->t(
'Paragraph Title'),
174 '#description' => $this->t(
'Label to appear as title on the button "Insert [title]. This label is translatable.'),
175 '#default_value' => $this->getSetting(
'title'),
180 foreach ($this->bundleSelectorManager->getDefinitions() as $plugin) {
181 $options[$plugin[
'id']] = $plugin[
'title'];
184 $elements[
'bundle_selector'] = [
186 '#title' => $this->t(
'Bundle Selection Handler'),
187 '#description' => $this->t(
'The bundle selector form plugin that will be used to allow users to insert paragraph items.'),
188 '#options' => $options,
189 '#default_value' => $this->getSetting(
'bundle_selector'),
194 foreach ($this->deliveryProviderManager->getDefinitions() as $plugin) {
195 $options[$plugin[
'id']] = $plugin[
'title'];
198 $elements[
'delivery_provider'] = [
200 '#title' => $this->t(
'Delivery Handler'),
201 '#description' => $this->t(
'The delivery plugin that controls the user experience for how forms are delivered.'),
202 '#options' => $options,
203 '#default_value' => $this->getSetting(
'delivery_provider'),
207 $elements[
'view_mode'] = [
209 '#title' =>
'Editor View Mode',
210 '#description' => $this->t(
'The view mode that will be used to render embedded entities.'),
211 '#options' => $this->entityDisplayRepository->getViewModeOptions(
'paragraph'),
212 '#default_value' => $this->getSetting(
'prerender_count'),
216 $options = [0 => $this->t(
'None')];
217 for ($i = 5; $i <= 50; $i += 5) {
220 $options[-1] = $this->t(
'All');
221 $elements[
'prerender_count'] = [
223 '#title' =>
'Maximum Pre-Render Items',
224 '#description' => $this->t(
"The maximum number of embedded paragraphs to render before an editor is initialized. Additional entities will be rendered via ajax on demand, and won't be available to edit until their respective ajax calls finish."),
225 '#options' => $options,
226 '#default_value' => $this->getSetting(
'prerender_count'),
237 $bundle_selector = $this->bundleSelectorManager->getDefinition($this->getSetting(
'bundle_selector'));
238 $delivery_provider = $this->deliveryProviderManager->getDefinition($this->getSetting(
'delivery_provider'));
239 $prerender_count = $this->getSetting(
'prerender_count');
240 if ($prerender_count ==
'-1') {
241 $prerender_count =
'All';
243 elseif ($prerender_count ==
'0') {
244 $prerender_count =
'None';
247 $summary[] = $this->t(
'Title: @title', [
'@title' => $this->getSetting(
'title')]);
248 $summary[] = $this->t(
'Bundle Selector: @bundle_selector', [
'@bundle_selector' => $bundle_selector[
'title']]);
249 $summary[] = $this->t(
'Delivery Provider: @delivery_provider', [
'@delivery_provider' => $delivery_provider[
'title']]);
250 $summary[] = $this->t(
'View Mode: @mode', [
'@mode' => $this->getSetting(
'view_mode')]);
251 $summary[] = $this->t(
'Maximum Pre-Render Items: @prerender_count', [
'@prerender_count' => $prerender_count]);
258 public function extractFormValues(FieldItemListInterface $items, array $form, FormStateInterface $form_state) {
260 $path = array_merge($form[
'#parents'], [$field_name]);
261 $values = NestedArray::getValue($form_state->getValues(), $path);
262 $this->
process(
'update', $items, $form_state, $values[
'markup'][
'format'], $values[
'markup'][
'value'], $values[
'context_id']);
268 public static function isApplicable(FieldDefinitionInterface $field_definition) {
269 return \Drupal::service(
'paragraphs_editor.field_value.manager')->isParagraphsEditorField($field_definition);
276 $this->settings += $this->
getFieldConfig()->getThirdPartySettings(
'paragraphs_editor');
277 $this->settings += static::defaultSettings();
278 $this->defaultSettingsMerged = TRUE;
309 protected function process($variant, FieldItemListInterface $items, FormStateInterface $form_state, $format = NULL, $markup = NULL, $context_id = NULL) {
310 $field_value_wrapper = $this->fieldValueManager->wrapItems($items);
312 if (!isset($markup)) {
313 $markup = $field_value_wrapper->getMarkup();
316 if (!isset($format)) {
317 $format = $field_value_wrapper->getFormat();
320 if (empty($format)) {
321 $format = $this->
getFieldConfig()->getThirdPartySetting(
'paragraphs_editor',
'filter_format');
325 $form_object = $form_state->getFormObject();
326 if (!$form_object instanceof EntityFormInterface) {
327 throw new \Exception(
'Could not locate entity to save changes to in paragraphs editor widget.');
331 $entity = $form_object->getEntity();
332 $new_revision = FALSE;
333 if ($entity instanceof RevisionableInterface) {
334 if ($entity->isNewRevision()) {
335 $new_revision = TRUE;
337 elseif ($entity->getEntityType()->hasKey(
'revision') && $form_state->getValue(
'revision')) {
338 $new_revision = TRUE;
342 return $this->domProcessor->process($markup,
'paragraphs_editor', $variant, [
345 'context_id' => $context_id,
346 'is_mutable' => TRUE,
347 'wrapper' => $field_value_wrapper,
351 'new_revision' => $new_revision,
353 'langcode' => $form_state->get(
'langcode'),
354 'settings' => $this->getSettings(),
355 'filter_format' => $format,
static ensureFieldConfig(FieldDefinitionInterface $field_definition=NULL)