Utworzyłem widok dla węzła, który pokazuje zawartość jako renderowany byt. Między innymi wyprowadzam pole ciała w szablonie gałązki:
{{ content.field_body }}
Teraz chciałbym ograniczyć tekst do 200 znaków i umieścić trzy kropki. Testowałem trzy różne sposoby, aby to zrobić, ale nic nie działało. Problem polega na tym, że każdy sposób liczy i przycina również znaki HTML.
1: Dodałem format „Przycięty” w „Zarządzaj wyświetlaniem” => Tekst jest ograniczony, ale niepoprawny. I nie mam trzech kropek.
2: Obciąłem tekst w szablonie gałązki. Ale żeby policzyć tekst, muszę go najpierw wyrenderować. W ten sposób gałązka wyświetla tekst jako HTML (widzę tagi HTML na mojej stronie!)
{% set text = content.field_body|render %}
{{ text|length > 200 ? text|slice(0, 200) ~ '...' : text }}
3: Próbowałem rozwiązać problem w template_preprocess_node (). Tutaj mam ten sam problem z liczeniem znaczników HTML.
$body_text = $node->get('field_body')->getValue()[0]['value'];
$trimmed_text = substr($body_text, 0, 200) . '...';
Jak mogę odpowiednio przyciąć tekst?
Bardzo ci dziękuje za pomoc!
Możesz to teraz zrobić za pomocą modułu twig_extender i użyć
|truncate
.Oto przykład, jak używać go w szablonie .twig, zauważ, że używam również wartości twig_field_value :
uwaga: zazwyczaj utrzymuję moje ustawienia devel (./admin/config/development/devel) ustawione na używanie Symfony var-dumper i mogę rozgryźć łańcuch z
to znaczy:
{{ devel_dump(content.field_name|field_value) }}
źródło
Ulepszenia:
|trim
aby pozbyć się białych znakówslice()
isplit()
…
) zamiast „...”|raw
wyjście{% set text = content.field_header_intro|render|striptags|trim %}
{{ (text|length > 200 ? text|slice(0, 201)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text)|raw }}</code>
źródło
Tak sobie z tym poradziłem.
Przykład:
field - node - body - article.html.twig
źródło