web-dev-qa-db-fra.com

Obtenir par programme Afficher le texte personnalisé

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: enter image description here

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,

4
s3go11

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'];
2
Oulalahakabu

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';
      }
    }
  }
}
0
theuni

C'est ce que j'ai, cependant, je pense qu'il doit y avoir une meilleure façon de le faire.

Quelques notes:

  • $ view-> render (); est critique, sans ça, ça ne marche pas
  • "rien" est le nom par défaut du champ personnalisé, l'ajout de champs supplémentaires entraînera "rien_1", "rien_2", etc. Vous pouvez voir le nom lorsque vous survolez le champ (dans le lien) ou dans les modèles de remplacement.
  • La valeur est retournée avec beaucoup de\n dedans. Je les remplace ici, mais cela peut avoir des effets secondaires indésirables.

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));
}
0
Maarten De Block