İçeriksel filtrelerle programlı olarak nasıl görünüm oluştururum?


20

Drupal 8'de bağlamsal filtrelerle programlı olarak nasıl görünüm oluşturabilirim?

Drupal 7'de genellikle aşağıdaki kodu kullanıyorum.

$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'de bunu başarmanın alternatif bir yolu var mı?


Tartışma olarak tam olarak ne geçmek istiyorsun? belki Görünüm'ün kullanıcı arayüzünden istediğinizi elde edebilirsiniz.
Hayır Sssweat

Evet ben görünüm UI kullanarak elde edebilirsiniz biliyorum ama bu benim durumumda mümkün değil, ben sadece bazı kod ile ulaşmak istiyorum.
Sanjay

Yanıtlar:


36

Tarafından kullanılan koda dayanarak views_get_view_result(), soruda göstermek için eşdeğer kod olarak aşağıdaki kodu kullanırdım.

  $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
Bu sonuç vermiyor, sadece sonuçları alıyor. Aynı değil :) Bunu yapmanın tercih edilen yolu $ view-> buildRenderable ($ display, $ argümanlar) kullanmaktır, bkz. Drupal.stackexchange.com/questions/198920/…
Berdir

Evet, sonuçla render arasında aynı şeyi merak ediyordum. :D
kiamlaluno

1
@GiorgosK Drupal 8 ile asla kullanmazsınız drupal_render(). Bir denetleyici sınıfının bile yapabileceği, okunabilir bir dizi döndürmeniz yeterlidir.
kiamlaluno

1
@kiamlaluno de sadece json çıktısı üzerinde "Array" çıkış olanağı edildi değiştir / a görünümler DİNLENME İHRACAT (json çıktısı) alanı biçimlendiriciye $ içeriği geçtikten çıktı geçersiz kılmak için benim kullanımı ... için ben öldükten sonra drupal_render($content)onu aslında bana json çıkışında işlenen çıktı verdi ... bir şey eksik mi? Az önce açıkladığınız şeyi anlayabileceğiniz bir yer var mı?
GiorgosK

1
@GiorgosK: Drupal'ı görüntüleme için kullanırsanız, bu günleri oluşturmazsınız, her şeyi bir render dizisinde son noktaya kadar bırakır ve sistemin gerisini yapmasına izin verirsiniz. Ancak sonucu Drupal'dan kaldırmanız gerekiyorsa (belki bir bültene veya benzeri bir şeye), o zaman render edersiniz, evet. Ancak kullanmaya başlamayın, kullanımdan drupal_render()kaldırılacak.
Gábor

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

REST Export ekranının gerçek JSON çıktısını almak için aşağıdakine benzer bir şey yapabilirsiniz:

$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);

Cazibe gibi çalışıyor, teşekkürler.
Sathish Sundar

mükemmel çalışır, görünümü isteyen kullanıcı nasıl ayarlanır? örneğin görünüm, düzeltmeleri göstermek için izin gerektirir.
SimoneB

Sürümünüzün bazı revizyonlarla çalışmadığını fark ettiniz, Santo Boldižar'ın yaptığı
SimoneB
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.