web-dev-qa-db-ja.com

プログラムでビューのカスタムテキストを取得する

「カスタムテキスト」フィールドを含むビューを作成し、このフィールドをプログラムでDrupal 8。

私が持っています:

$view = Views::getView('my_view');
$view->execute();
foreach($view->result as $row){
    $node = Node::load($row->nid);
    // Get here the view custom field with label "An example view field".
}

$ rowフィールドにはフィールドも$ nodeもありません。

ビューのスクリーンショット: enter image description here

私は今持っています:

$customField = $view->field['nothing'];

customFieldは、Drupal\views\Plugin\views\field\Customのインスタンスです。

dpm($customField->render($row));

これは、クラスDrupal\views\Render\ViewsRenderPipelineMarkupと同じマークアップを持つProtectecd文字列を返します:{{ title }} test

おかげで、

4
s3go11

次のようなものが必要です

//already loaded
$node = $row->_entity;

プロパティを簡単に取得する最良の方法は、おそらくxdebugで変数を検査することです

ヘッダー/フッターの王の場合、次のようにしてレンダリングされた配列を取得できます。

$view = \Drupal\views\Views::getView('Your view');
$view->execute();
/* @var $area \Drupal\views\Plugin\views\area\Text */
$area = reset($view->header); // $view->header['area'] or something else
$rendered = $area->render(); // rendered array

OK、それから:

$view = \Drupal\views\Views::getView('YOUR VIEW');
$view->execute('YOUR DISPLAY ID OR DEFAULT');
$nothing = $view->getHandler('YOUR DISPLAY ID OR DEFAULT','field', 'nothing');
$text = $nothing['alter']['text'];
2
Oulalahakabu

devel モジュールをインストールしてください

/ drupal8/devel/phpに移動します

あなたが試すことができます:

$view = \Drupal\views\Views::getView('my_view');
$view->execute();

foreach($view->result as $row){
dpm($row->_entity->get('Custom text')->getValue());
}

注:フィールドのマシン名で「カスタムテキスト」を変更

結果が次のようになる場合:

Array
(
    [0] => Array
        (
            [value] => 43
        )

)

あなたはフィールドにアクセスできます

$row->_entity->get('Custom text')->value

結果が次のようになる場合:

Array
(
    [0] => Array
        (
            [target_id] => 1
        )

)

あなたはフィールドにアクセスできます

$row->_entity->get('Custom text')->target_id

私にも同様の問題があり、私のために働く唯一の方法は次のとおりでした:

function MODULENAME_preprocess_views_view_fields(&$vars) {
  $view = $vars['view'];
  if(isset($view) && $view->id() === 'test') {
    foreach ($view->field as $id => $field) {
      // change the global custom text content for a specific
      // result row.
      if ($vars['row']->nid == 149) {
        $vars['fields']['nothing']->content = 'some new text';
      }
    }
  }
}
0
theuni

これは私が持っているものですが、これを行うにはもっと良い方法があるはずだと思います。

いくつかのメモ:

  • $ view-> render();それがなければ重要です、それは動作しません
  • 「nothing」はカスタムフィールドのデフォルト名です。追加のフィールドを追加すると、「nothing_1」、「nothing_2」などになります。フィールド(リンク内)または置換パターンにカーソルを合わせると、名前が表示されます。
  • 多数の\ nが含まれる値が返されました。私はそれらをここで置き換えますが、これは望ましくない副作用をもたらす可能性があります。

コード:

// The machine name of your view.
$viewname = 'name_of_the_view';

// Get the view.
$view = \Drupal\views\Views::getView($viewname);

// Display machine name.
$view->setDisplay('default');

// Execute the view.
$view->preExecute();
$view->execute();
$view->render();

foreach(array_keys($view->result) as $row_index){
  $custom_field = str_replace("\n", '', $view->field['nothing']->tokenizeValue((string)$view->field['nothing']->original_value, $row_index));
}
0