Добавить определенной роли кнопку/ссылку создания новой ноды на странице представления

Главные вкладки

Аватар пользователя vladtulku vladtulku 8 июня 2020 в 3:38

При выводе представления хочется иметь возможность добавлять новый контент со страниц представлений. Делать блок с кучей ссылок всего, что только можно создавать на сайте не вариант.
Зашел пользователь с правами "модератор" в раздел новостей, а там для него ссылочка "добавить новость".
Можно создать блок с ссылкой типа node/add/mycontent, отображать в Содержимом с соответствующей ролью. Да это работает. Но если много типов материалов, то такое количество не используемых блоков напрягает.
Есть вариант создать отдельный тип нод и в Подвале представления отобразить Готовую к выводу сущность. Останется решить вопрос с удалением title через отдельную темизацию этого типа нод.
Какие еще существуют способы решения данной проблемы?

Комментарии

Аватар пользователя ivnish ivnish 8 июня 2020 в 7:51

У представления есть header и footer. Их можно формировать программно через хук. В хуке можно проверять какая роль у текущего пользователя

Аватар пользователя vladtulku vladtulku 10 июня 2020 в 20:11

Спасибо! Решил пока оставить через отдельный тип нод в footer. Title скрыл Exclude node title права определил через Content Access можно через Field Permissions Решил, то так более гибко получается. Легче менять права доступа и можно дополнительных элементов накидать.

Аватар пользователя marassa marassa 8 июня 2020 в 10:15

Вот фрагмент очень корявого, но реально работающего кода:

/**
 * Implements hook_contextual_links_view_alter().
 */

function ****_contextual_links_view_alter(&$element, $items) {
  // This hook is called for EVERY set of contextual links
  // on a page.  We first want to check the $element to make
  // sure we are adding a link to the correct list of contextual
  // links.
  if (isset($element['#contextual_links']['entity.view.edit_form'])
         && $element['#contextual_links']['entity.view.edit_form']['metadata']['name'] == 'photo_slideshow' ) {
    $element['#links']['add_picture'] = array(
      'title' => t('Add picture'),
      'url' => Url::fromRoute('node.add', array(
        'node_type' => 'pictures',
        'edit[field_linked_to]' => '[nid]',
      ))
    );
    unset($element['#links']['config-translationcontextual-linksentityviewconfig-translation-overview']);
    unset($element['#links']['entityviewedit-form']);
  }
};

Я так и не смог тогда настроить правильно кэширование, чтобы контекстная ссылка не кэшировалась раз и навсегда независимо от аргумента, и мне пришлось передавать в ссылку некий псевдотокен "[nid]", который уже в js заменяется на реальный nid Wink Но идея, надеюсь, понятна.