J'ai créé une vue avec un champ "Texte personnalisé" et je souhaite obtenir ce champ par programme dans Drupal 8.
J'ai:
$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".
}
Le champ $ row n'a pas les champs, ni le nœud $.
Une capture d'écran de la vue:
J'ai maintenant:
$customField = $view->field['nothing'];
customField est une instance de Drupal\views\Plugin\views\field\Custom.
dpm($customField->render($row));
Cela renvoie la classe Drupal\views\Render\ViewsRenderPipelineMarkup avec la chaîne protectecd avec le même balisage: {{ title }} test
.
Merci,
Vous devriez avoir quelque chose comme
//already loaded
$node = $row->_entity;
La meilleure façon d'obtenir facilement des propriétés est probablement d'inspecter les variables avec xdebug
Si c'est un roi d'en-tête/pied de page, vous pouvez obtenir le tableau rendu de cette façon:
$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
Alors 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'];
Veuillez installer le module devel
Allez dans/drupal8/devel/php
Tu peux essayer:
$view = \Drupal\views\Views::getView('my_view');
$view->execute();
foreach($view->result as $row){
dpm($row->_entity->get('Custom text')->getValue());
}
remarque: changez "Texte personnalisé" par le nom de la machine du champ
si votre résultat est similaire à:
Array
(
[0] => Array
(
[value] => 43
)
)
vous pouvez accéder au terrain avec
$row->_entity->get('Custom text')->value
si votre résultat est similaire à:
Array
(
[0] => Array
(
[target_id] => 1
)
)
vous pouvez accéder au terrain avec
$row->_entity->get('Custom text')->target_id
J'ai eu un problème similaire et la seule façon de travailler pour moi était la suivante:
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';
}
}
}
}
C'est ce que j'ai, cependant, je pense qu'il doit y avoir une meilleure façon de le faire.
Quelques notes:
Le code:
// 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));
}