Как добавить ссылку на редактирование содержимого в пользовательском режиме просмотра?


У меня есть тип контента (Образец ), который включает поле (A ), тип виджета которого Представление . Для этого я использую модуль Представление виджета "Представление ссылки на сущность" .

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

Насколько я знаю, вывод вида виджета "Представление ссылки на объект" может быть напечатан в любом пользовательском режиме просмотра. Я есть попытка добавить ссылку на редактирование узла в этом пользовательском режиме просмотра.

У вас есть какие-либо идеи о том, как добавить пользовательское поле со ссылкой на редактирование в режиме просмотра?Шаги, которые я выполнил, следующие:

Шаг 1: Я выбрал конкретный режим просмотра в настройках поля тип контента A: Вот снимок экрана:

enter image description here

Шаг 2: В полях отображения костюма (администратор/структура/ds/поля) я добавил пользовательское поле ссылки для редактирования, например <a href="node/edit/[node:nid]">Edit</a> Я вижу ссылку на редактирование в выводе, но значение токена, которое я предоставил [node:nid], не извлекает идентификатор узла. Ссылка перенаправляет на node/edit/%5Bnode%3Anid%5D. Кто-нибудь может мне в этом помочь? Пожалуйста, сделайте скриншот ниже enter image description here

Поправьте меня, если я ошибаюсь. Любой другой подход или метод также хорош.

Author: rks, 2016-06-30

1 answers

Entity reference widget modal with edit link

Вы можете включить views_ui на странице модуля, затем перейти в раздел структура/представления и отредактировать представления, которые вы используете для виджета. Добавьте Content: Edit link в поля и сохраните его. Он получит ссылки на редактирование для каждой сущности, как показано на рисунке выше.


Переопределение функции темы пользовательским модулем

Нет простого способа добавить ссылку на редактирование виджета на странице узла. Но вы все равно можете сделать это, переопределив функции темы, предоставляемые сущностью Представление виджета Справочного вида

Entity reference widget with edit link on node edit page

Ниже приведен пример фрагмента с предположением, что имя вашего пользовательского модуля mymodule. Вы можете скопировать и вставить его в пользовательский модуль для тестирования. (Не забудьте изменить mymodule, если у вас другое имя для вашего пользовательского модуля.)

<?php

/**
 * Implements hook_theme_registry_alter().
 */
function mymodule_theme_registry_alter(&$theme_registry) {
  if (isset($theme_registry['entityreference_view_widget_widget']['function'])) {
    $theme_registry['entityreference_view_widget_widget']['function'] = 'mymodule_entityreference_view_widget_widget';
  }
  if (isset($theme_registry['entityreference_view_widget_rows']['function'])) {
    $theme_registry['entityreference_view_widget_rows']['function'] = 'mymodule_entityreference_view_widget_rows';
  }
} 

/**
 * Override theme_entityreference_view_widget_widget().
 */
function mymodule_entityreference_view_widget_widget($variables) {
  $widget = $variables['widget'];
  $settings = $widget['add_more']['#ervw_settings'];
  $order_class = drupal_html_class($settings['element'] . '-delta-order');
  $required = !empty($settings['instance']['required']) ? theme('form_required_marker', $variables) : '';

  $header = array(
    array(
      'data' => '<label>' . t('!title !required', array('!title' => $widget['#title'], '!required' => $required)) . "</label>",
      'colspan' => 2,
      'class' => array('field-label'),
    ),
  );
  $header[] = array(
    'data' => "<label>" . t('Edit link') . "</label>",
    'class' => array('field-label'),
  );
  if ($settings['field']['cardinality'] !== '1') {
    $header[] = array(
      'data' => t('Order'),
      'class' => array('tabledrag-hide'),
    );
  }
  $rows = array();

  // Sort items according to '_weight' (needed when the form comes back after
  // preview or failed validation)
  $items = array();
  foreach (element_children($widget) as $key) {
    if ($key === 'add_more') {
      $add_more_button = &$widget[$key];
    }
    else {
      $items[] = &$widget[$key];
    }
  }
  usort($items, '_field_sort_items_value_helper');

  // Add the items as table rows.
  foreach ($items as $item) {
    $item['_weight']['#attributes']['class'] = array($order_class);
    $delta_element = drupal_render($item['_weight']);

    $cells = array(
      array('data' => '', 'class' => array('field-multiple-drag')),
      drupal_render($item),
    );

    $target_id = $item['target_id']['#return_value'];
    $entities = entity_load($settings['target_type'], array($target_id));
    $cells[] = array(
      'data' => _mymodule_entity_edit_link($settings['target_type'], $entities[$target_id]),
    );

    if ($settings['field']['cardinality'] !== '1') {
      $cells[] = array('data' => $delta_element, 'class' => array('delta-order'));
    }
    $rows[] = array(
      'data' => $cells,
      'class' => array('draggable'),
    );
  }

  if (empty($rows)) {
    $rows[][] = array(
      'data' => t('No items have been added yet. Click "Add items" to launch the widget.'),
      'colspan' => '3',
    );
  }

  $output = '<div class="form-item">';
  $form_errors = form_get_errors();
  $classes = array('field-multiple-table');

  // Add an error class to the table in case of error.
  if (isset($form_errors[$settings['element']])) {
    $classes[] = 'error';
  }

  $output .= theme('table', array(
    'header' => $header,
    'rows' => $rows,
    'attributes' => array(
      'id' => $settings['table_id'],
      'class' => $classes,
    ),
  ));
  $output .= $widget['#description'] ? '<div class="description">' . $widget['#description'] . '</div>' : '';
  $output .= '<div class="clearfix">' . drupal_render($add_more_button) . '</div>';
  $output .= '</div>';

  if ($settings['field']['cardinality'] !== '1') {
    drupal_add_tabledrag($settings['table_id'], 'order', 'sibling', $order_class);
  }

  return $output;
}

/**
 * Override theme_entityreference_view_widget_rows().
 */
function mymodule_entityreference_view_widget_rows($variables) {
  $zebra = array('even' => 'odd');

  $settings = $variables['rows']['#widget_settings'];
  foreach (element_children($variables['rows']) as $row) {
    $output[$row]  = '<tr class="draggable ' . current($zebra) . '">';
    $output[$row] .= '<td class="field-multiple-drag"></td>';
    $output[$row] .= '<td>' . render($variables['rows'][$row][$settings['column']]) . '</td>';

    $target_id = $variables['rows'][$row]['target_id']['#return_value'];
    $entities = entity_load($settings['target_type'], array($target_id));
    $output[$row] .= '<td>' . _mymodule_entity_edit_link($settings['target_type'], $entities[$target_id]) . '</td>';

    if ($settings['cardinality'] !== '1') {
      $output[$row] .= '<td class="delta-order tabledrag-hide">' . render($variables['rows'][$row]['_weight']) . '</td>';
    }
    $output[$row] .= '</tr>';

    $zebra = array_flip($zebra);
  }

  return implode("\n", $output);
}

/**
 * Helper function to build the entity edit link.
 */
function _mymodule_entity_edit_link($entity_type, $entity) {
  $uri = entity_uri($entity_type, $entity);
  return l(t('Edit'), $uri['path'] . '/edit');
}

Ключевая концепция здесь заключается в программном переопределении 2 функций темы с помощью hook_theme_регистрация_альтер:

  • theme_entityreference_view_widget_widget()
  • theme_entityreference_view_widget_rows()

Таким образом, теперь мы можем изменить вывод таблицы.

Добавить новый заголовок столбца

$header[] = array(
  'data' => "<label>" . t('Edit link') . "</label>",
  'class' => array('field-label'),
);

Добавить ссылку для нового столбца

Для статического вывода.

$target_id = $item['target_id']['#return_value'];
$entities = entity_load($settings['target_type'], array($target_id));
$cells[] = array(
  'data' => _mymodule_entity_edit_link($settings['target_type'], $entities[$target_id]),
);

Для динамического вывода. (обратный вызов ajax)

$target_id = $variables['rows'][$row]['target_id']['#return_value'];
$entities = entity_load($settings['target_type'], array($target_id));
$output[$row] .= '<td>' . _mymodule_entity_edit_link($settings['target_type'], $entities[$target_id]) . '</td>';

Вспомогательная функция для создания ссылки редактирования

/**
 * Helper function to build the entity edit link.
 */
function _mymodule_entity_edit_link($entity_type, $entity) {
  $uri = entity_uri($entity_type, $entity);
  return l(t('Edit'), $uri['path'] . '/edit');
}
 2
Author: Jimmy Ko, 2016-06-30 14:27:55