सिम्फनी 2 टहनी पाठ की लंबाई को सीमित करती है और तीन डॉट्स डालती है


128

मैं प्रदर्शन में पाठ की लंबाई, जैसे, 50, और तीन बिंदुओं को कैसे सीमित कर सकता हूं?

{% if myentity.text|length > 50 %}

{% block td_text %} {{ myentity.text}}{% endblock %}

{%endif%}

4
"थ्री डॉट्स" वास्तव में एक एकल पात्र है जिसे एलिप्सिस कहा जाता है। यह तीन पूर्ण विराम है ...और यह एक एलिप्सिस है
ल्यूक कजिन्स

जवाबों:


204
{{ myentity.text|length > 50 ? myentity.text|slice(0, 50) ~ '...' : myentity.text  }}

आपको टहनी 1.6 चाहिए


इसका जवाब होना चाहिए, अभी तक अभी तक काम कर रहे हैं;)
whalesingswee

हम एक लिंक कैसे जोड़ सकते हैं ...?
मलबेकेर्जेन

11
इसके अतिरिक्त, यदि आप एक शब्द पर फसल करना चाहते हैं, तो आप इसे इस तरह से कर सकते हैं {{ text > 50 ? text|slice(0, 51)|split(' ')|slice(0, -1)|join(' ') ~ '…' : text }}:। मैं 3 वास्तविक डॉट्स ( ...) के बजाय दीर्घवृत्त वर्ण ( ) का उपयोग करने की सलाह देता हूं
निमो 64

2
छोटा:{{ myentity.text[:50] ~ (myentity.text|length > 50 ? '...') }}
mts kn

1
@ निमो 64 आप |lengthपहले के बाद ही गायब हैं, textलेकिन यह एकदम सही है, धन्यवाद!
मटिफी

116

क्यों नहीं टहनी के ट्रंकट या वर्डवैप फिल्टर का उपयोग करें? यह ट्विग एक्सटेंशन के अंतर्गत आता है और जैसा कि मैं देख रहा हूं, यह Symfony2.0 का हिस्सा है।

{{ text|truncate(50) }}

5
मैं सिम्फनी 2.3 का उपयोग कर रहा हूं और ट्रंकट फ़िल्टर डिफ़ॉल्ट एक्सटेंशन का हिस्सा नहीं है। इसलिए, मैंने इसके बजाय मैनुअल के समाधान का सहारा लिया।
मोर्ट्स

8
सिम्फनी में विस्तार को सक्षम करने के लिए इसे अपनी एक कॉन्फ़िगरेशन फ़ाइल में जोड़ें: gist.github.com/pschultz/f33bfff72692ca0b6916
पीटर

1
संलग्न करने के लिए ..., दूसरा पैरामीटर trueइस तरह निर्धारित किया जाना चाहिए{{ text|truncate(50, true)
मिठु

वास्तव में दूसरे पैरामीटर को सही पर सेट करने से यह पूरे शब्दों को संरक्षित कर देगा। यह डिफ़ॉल्ट रूप से दीर्घवृत्त जोड़ता है। तीसरा पैरामीटर आप जो कुछ भी चाहते हैं उसके लिए दीर्घवृत्त बदल सकते हैं। twig-extensions.readthedocs.io/en/latest/…
beta

1
सिम्फनी 2.8 का उपयोग करते हुए, मुझे इसका उपयोग करने के लिए इस एक्सटेंशन को स्थापित करना पड़ा। require twig/extensions
बीटा

35

एक और है:

{{ myentity.text[:50] ~ '...' }}

7
एकमात्र समस्या यह है कि यह हमेशा डॉट्स दिखाता है ...: / मुझे लगता है कि मैं पहले समाधान के साथ जाऊंगा।
मार्कस कोटलैंडर

1
कृपया, क्या आप उस लिंक को साझा कर सकते हैं जहाँ इस बारे में डॉक्टर [x: x] स्थित है?
बेनार्ड पैट्रिक

हमेशा तीन बिंदुओं के साथ ... वास्तव में इस सवाल का जवाब नहीं है।
dmmd

17

मुझे पता है कि यह एक बहुत पुराना प्रश्न है, लेकिन टहनी 1.6 से आप स्लाइस फ़िल्टर का उपयोग कर सकते हैं;

{{ myentity.text|slice(0, 50) ~ '...' }}

यदि आप उदाहरण के लिए कुछ जोड़ना चाहते हैं तो टिल्ड से दूसरा भाग वैकल्पिक है।

संपादित करें: मेरा बुरा है, मुझे लगता है कि सबसे अधिक मतदान का जवाब टुकड़ा फ़िल्टर का उपयोग करता है।


10

यूटीएफ -8 एलिप्सिस नाम के साथ @ होलगुकस समाधान: {{ (my.text|length > 50 ? my.text|slice(0, 50) ~ '…' : my.text) }}


2
कृपया ध्यान रखें कि यह समाधान, textवैरिएबल के माध्यम से HTML इंजेक्शन को सक्षम करता है।
एमिक्स

1
@ माइकल-ज़ुकोव्स्की आपकी बात सही है। मैंने अपना समाधान बदल दिया है।
मथायस शोबनर

8

@mshobnr / @ एक साधारण मैक्रो में बनाया गया हल:

{% macro trunc(txt, len) -%}
    {{ txt|length > len ? txt|slice(0, len) ~ '…' : txt }}
{%- endmacro %}

उपयोग उदाहरण:

{{ tools.trunc('This is the text to truncate. ', 50) }}

नायब मैं मैक्रो युक्त एक टहनी टेम्पलेट का आयात करता हूं और इसे इस तरह (उपकरण) के रूप में आयात करता हूं (सिम्फनी):

{% import "@AppBundle/tools.html.twig" as tools -%}

इसके अलावा, मैंने वास्तविक चरित्र के साथ html चरित्र कोड को बदल दिया, यह फ़ाइल एन्कोडिंग के रूप में UTF-8 का उपयोग करते समय कोई समस्या नहीं होनी चाहिए। इस तरह आपको उपयोग करने की आवश्यकता नहीं है |raw(क्योंकि यह सुरक्षा समस्या पैदा कर सकता है)।


6

एक और भी सुंदर समाधान शब्दों की संख्या (और वर्णों की संख्या से नहीं) द्वारा पाठ को सीमित करना है। यह बदसूरत आंसू को रोकता है (जैसे 'स्टैकोव ...')।

यहाँ एक उदाहरण है जहाँ मैं केवल 10 शब्दों से अधिक लंबे टेक्स्ट ब्लॉक को छोटा करता हूँ:

{% set text = myentity.text |split(' ') %} 

{% if text|length > 10 %} 
    {% for t in text|slice(0, 10) %}
        {{ t }} 
    {% endfor %}
    ...
{% else %}
    {{ text|join(' ') }}
{% endif %}

और कोई ज़रूरत नहीं है !!! बस मुझे क्या चाहिए, शब्दों से रिक्त स्थान और स्लाइस द्वारा विभाजित, thx !!!
व्लादिमीर Ch

एक आकर्षण की तरह काम करता है
VDarricau

2

आप निम्नलिखित तरीके से सीमित कर सकते हैं। पहला इंडेक्स शुरू कर रहा है और दूसरा पात्रों की संख्या।

**{{ results['text'][4:2] }}**

2

सीमा समाप्त होने के बाद एक स्ट्रिंग को काटने के लिए ट्रंकट फिल्टर का उपयोग करें

{{ "Hello World!"|truncate(5) }} // default separator is ...

हैलो...

आप दूसरे पैरामीटर को सही पर सेट करके पूरे शब्दों को संरक्षित करने के लिए भी छोटा बता सकते हैं। यदि अंतिम शब्द विभाजक पर है, तो पूरे शब्द को ट्रंकट प्रिंट करेगा।

 {{ "Hello World!"|truncate(7, true) }} // preserve words

यहाँ हैलो वर्ल्ड!

यदि आप विभाजक को बदलना चाहते हैं, तो बस तीसरे पैरामीटर को अपने इच्छित विभाजक पर सेट करें।

{{ "Hello World!"|truncate(7, false, "??") }} 

नमस्ते डब्ल्यू ??


1

ट्विग 2 और ट्विग 3 के लिए अपडेट।

truncate फ़िल्टर उपलब्ध नहीं है, इसके बजाय आप इसका उपयोग कर सकते हैं यू-फ़िल्टर का

यहाँ एक उदाहरण है:

{{ 'Lorem ipsum'|u.truncate(8) }}
Lorem ip

{{ 'Lorem ipsum'|u.truncate(8, '...') }}
Lorem...

नोट: यह फ़िल्टर StringExtension का एक हिस्सा है जिसे आवश्यक किया जा सकता है

twig/string-extra

0

मैंने इसी उद्देश्य के लिए यह सरल मार्को लिखा है, आशा है कि इससे मदद मिलेगी:

{%- macro stringMaxLength(str, maxLength) -%}
    {%- if str | length < maxLength -%}
        {{ str }}
    {%- else -%}
        {{ str|slice(0, maxLength) }}...
    {%- endif -%}
{%- endmacro -%}

उपयोग उदाहरण # 1 (आउटपुट: "मेरी लंबी स्ट्रिंग यहाँ ..."):

{{ _self.stringMaxLength("my long string here bla bla bla la", 20) }}

उपयोग उदाहरण # 2 (आउटपुट: "छोटी स्ट्रिंग!"):

{{ _self.stringMaxLength("shorter string!", 20) }}

0

यहाँ नए Drupal 8 क्षमताओं में बगदारी * ने हमें अपना लिखने के लिए प्रेरित किया:

<a href="{{ view_node }}">{% if title|length > 32 %}{% set title_array = title|split(' ') %}{% set title_word_count = 0 %}{% for ta in title_array %}{% set word_count = ta|length %}{% if title_word_count < 32 %}{% set title_word_count = title_word_count + word_count %}{{ ta }} {% endif %}{% endfor %}...{% else %}{{ title }}{% endif %}</a>

यह दोनों शब्दों और वर्णों को ध्यान में रखता है (* D8 में "शब्द सीमा" सेटिंग कुछ भी प्रदर्शित नहीं कर रही थी)।


-1

HTML चरित्र का उपयोग करना बेहतर है

{{ entity.text[:50] }}&#8230;

क्या आप अपने उत्तर में कुछ स्पष्टीकरण जोड़ सकते हैं? HTML इकाई का उपयोग क्यों करना चाहिए? और क्यों आप इसे प्रत्येक और हर मामले में पाठ से जोड़ते हैं, भले ही वह पाठ 50 वर्णों से कम लंबा क्यों न हो?
निको हसे

नमस्ते, यदि आप तीन डॉट्स लिखते हैं तो यह तीन अलग-अलग डॉट्स हैं लेकिन "थ्री डॉट्स" कैरेक्टर को एक दीर्घवृत्त कहा जाता है। दीर्घवृत्त html इकाई है &#8230;
थियो अटेली

और उस दीर्घवृत्त के लिए यूनिकोड वर्ण का उपयोग क्यों नहीं किया गया?
निको हसे

आप इसका भी उपयोग कर सकते हैं! यह टिप्पणी उस टिप्पणी stackoverflow.com/a/17118915/5923187 का जवाब थी, लेकिन यह कदम मेरी प्रतिष्ठा के कारण बंद था
Théo Attali
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.