Як я можу програматично відображати подання за допомогою контекстних фільтрів?


20

Як я можу програматично переглянути зображення за допомогою контекстних фільтрів у Drupal 8?

У Drupal 7 я зазвичай використовую наступний код.

$view = views_get_view('test_view'); //test_view is the view machine name
$view->set_display("block"); //block is the view display name
$view->set_arguments($tid); //$tid is the argument to pass
$view->pre_execute();
$view->execute();
$content = $view->render();

Чи є альтернативний спосіб досягти цього в Drupal 8?


Що саме ви хочете передати як аргумент? можливо, ви можете досягти того, що хочете, завдяки інтерфейсу користувача View.
Без зачистки

Так, я знаю, що я можу досягти цього за допомогою інтерфейсу перегляду, але в моєму випадку це неможливо, я хочу досягти цього лише за допомогою коду.
Санджай

Відповіді:


36

Базуючись на використаний код views_get_view_result(), я б використовував наступний код як код, еквівалентний тому, який ви показуєте у запитанні.

  $args = [$tid];
  $view = Views::getView('test_view');
  if (is_object($view)) {
    $view->setArguments($args);
    $view->setDisplay('block');
    $view->preExecute();
    $view->execute();
    $content = $view->buildRenderable('block', $args);
  }

5
Це не є рендерінгом, це лише отримання результатів. Не те саме :) Кращим способом цього є використання $ view-> buildRenderable ($ display, $ argument), див. Drupal.stackexchange.com/questions/198920/…
Бердір

Так, мені було цікаво те саме, про результат проти надання. :D
kiamlaluno

1
@GiorgosK З Drupal 8 ви ніколи не використовуєте drupal_render(). Досить повернути масив, що передається, що може зробити навіть клас контролера.
kiamlaluno

1
@kiamlaluno добре для мого використання, яке полягає в тому, щоб змінити / змінити вихід з представлень даних REST EXPORT (вихід json), передаючи вміст $ на формат поле, просто виводив "масив" на вихід json ... так що після того, як я передав drupal_render($content)його насправді дав мені виведений вихід на вихід json ... я щось пропускаю? чи є де зрозуміти, що ви щойно пояснили?
GiorgosK

1
@GiorgosK: якщо ви використовуєте Drupal для відображення, ви не рендеруєте ці дні, ви залишаєте все це у масиві візуалізації до останньої точки, а система дозволяє іншим. Але якщо вам потрібно зняти результат з Drupal (можливо, розмістити його в інформаційному бюлетені чи подібному), тоді ви надаєте, так. Але почніть не використовувати drupal_render(), це буде застарілим.
Габор

9
/**
 * Return the rendered view with contextual filter.
 * @param string $viewId - The view machine name.
 * @param string $viewId - The display machine name.
 * @param array $arguments - The arguments to pass.
 * 
 * @return object $result
 */
function getView($viewId, $displayId, array $arguments)
{
    $result = false;
    $view = Views::getView($viewId);

    if (is_object($view)) {
        $view->setDisplay($displayId);
        $view->setArguments($arguments);
        $view->execute();

        // Render the view
        $result = \Drupal::service('renderer')->render($view->render());
    }

    return $result;
}

/**
 * Get json output.
 * @return array $data
 */
function jsonData() {
    $data = [];
    $viewId = 'rest_comments';
    $displayId = 'rest_export_1';
    $arguments = [$nid];

    // Get the view
    $result = getView($viewId, $displayId, $arguments);

    if(is_object($result)) {
        $json = $result->jsonSerialize();
        $data = json_decode($json);
    }

    return $data;
}


/**
 * Get the view object.
 * @return object $view
 */
function view() {
    $viewId = 'rest_comments';
    $displayId = 'rest_export_1';
    $arguments = [$nid];

    // Get the view
    $view = getView($viewId, $displayId, $arguments);

    return $view;
}

2

Щоб отримати фактичний вихід JSON на дисплей REST Export, ви можете зробити щось подібне:

$view = Views::getView('view_id');
$render_array = $view->buildRenderable('display_name', $args);
$rendered = \Drupal::service('renderer')->renderRoot($render_array);
$json_string = $rendered->jsonSerialize();
$json_object = json_decode($rendered);

Працює як шарм, дякую нечисто.
Sathish Sundar

працює відмінно, як налаштувати користувача, який запитує перегляд? наприклад, перегляд вимагає дозволу на показ змін.
SimoneB

Щойно зауважив, що у вас версія не працює з деякими версіями, Санто Болдіжар
SimoneB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.