Obetnij sznurek w szablonach ostrzy Laravel

93

Czy istnieje modyfikator obcięcia dla szablonów ostrzy w Laravel, prawie jak Smarty?

Wiem, że mógłbym po prostu zapisać rzeczywisty php w szablonie, ale szukam czegoś ładniejszego do napisania (nie wchodźmy w całe PHP to debata o silnikach szablonów).

Na przykład szukam czegoś takiego:

{{ $myVariable|truncate:"10":"..." }}

Wiem, że mógłbym użyć czegoś takiego jak Twig za pośrednictwem kompozytora, ale mam nadzieję na wbudowaną funkcjonalność w samym Laravel.

Jeśli nie, możesz stworzyć własne modyfikatory wielokrotnego użytku, takie jak zapewnia Smarty. Podoba mi się fakt, że Blade nie przesadza z całą składnią, ale myślę, że obcinanie to naprawdę przydatna funkcja.

Używam Laravel 4.

fl3x7
źródło
co z laravel 5?
Hos Mercury
1
@HosMercury Dla L5 patrz stackoverflow.com/questions/29281013/ ...
fl3x7

Odpowiedzi:

199

W Laravel 4 i 5 (do 5,7) można użyć str_limit, co ogranicza liczbę znaków w ciągu.

Będąc w Laravel 5.8 w górę, możesz skorzystać z Str::limitpomocnika.

//For Laravel 4 to Laravel 5.5
{{ str_limit($string, $limit = 150, $end = '...') }}
//For Laravel 5.5 upwards
{{ \Illuminate\Support\Str::limit($string, 150, $end='...') }}

Więcej funkcji pomocniczych Laravel http://laravel.com/docs/helpers#strings

Anil Singh
źródło
Prawidłowa odpowiedź, ponieważ przypadek użycia jest w widoku Blade.
Frisbetarian
10
W wersji 5.8 strpomocnicy zostali usunięci, musisz Illuminate\Support\Str::limit($string)zamiast tego użyć
Hassan Azimi
1
str_limit jest przestarzały
Omer
39

Laravel 4 ma, Str::limitktóry obetnie do dokładnej liczby znaków, a także Str::wordsobcina na granicy słowa.

Sprawdzić:

Dustin Graham
źródło
Czy wiesz, czy odpowiednik Str::wordsistnieje w Larvel 5.2?
Jiedara
1
Nie. Wygląda na to, że teraz ogranicza liczbę słów, a nie znaków. github.com/laravel/framework/blob/5.2/src/Illuminate/Support/ ...
Dustin Graham
Właśnie tego szukałem! Dzięki !
Jiedara
32

Edycja: Ta odpowiedź została opublikowana podczas wersji beta Laravel 4, kiedy klasa Str nie istniała. W Laravel 4 jest teraz lepszy sposób na zrobienie tego - na co Dustin odpowiada poniżej. Nie mogę usunąć tej odpowiedzi ze względu na zasady SO (na to mi nie pozwala)

Samo ostrze nie ma takiej funkcjonalności.

W Laravel 3 była klasa Str - co można było zrobić:

{{ Str::limit($myVariable, 10) }}

Na tym etapie nie wierzę, że klasa Str znajduje się w Laravel 4 - ale tutaj jest jej port, który możesz włączyć do kompozytora, aby dodać do własnego projektu

Laurence
źródło
Dzięki za sugestię, wydaje mi się, że będę musiał się zawalić i użyć portów Meido lol
fl3x7
Obecnie Laravel 4 ma klasę Str. Zobacz odpowiedź Dustina Grahama.
trm42
Tak to jest poprawne. Kiedy pierwotnie opublikowałem tę odpowiedź, było to podczas Laravel 4 Beta, kiedy klasa Str nie istniała
Laurence,
Gdzie jest oryginalna odpowiedź? Nie da się już znaleźć żadnego dokumentu do wersji 4.1 ... :(
Srneczek
15

Aktualizacja dla Laravel 7. * : Fluent Strings, czyli bardziej płynny, zorientowany obiektowo interfejs do pracy z wartościami łańcuchów, umożliwiający łączenie wielu operacji na łańcuchach razem przy użyciu bardziej czytelnej składni w porównaniu do tradycyjnych operacji na łańcuchach.

limit Przykład:

$truncated = Str::of('The quick brown fox jumps over the lazy dog')->limit(20);

Wynik

The quick brown fox...

słowa Przykład:

$string = Str::of('Perfectly balanced, as all things should be.')->words(3, ' >>>');

Wynik

Perfectly balanced, as >>>

Aktualizacja dla Laravel 6. * : Ten pakiet jest wymagany do działania wszystkich pomocników laravelcomposer require laravel/helpers

Aby używać pomocnika w kontrolerze, nie zapomnij również dołączyć / użyć klasy

use Illuminate\Support\Str;

Aktualizacja Laravel 5.8

To służy do obsługi znaków z ciągu :

{!! Str::limit('Lorem ipsum dolor', 10, ' ...') !!}

Wynik

Lorem ipsu ... 

To służy do obsługi słów z ciągu :

{!! Str::words('Lorem ipsum dolor', 2, ' ...') !!}

Wynik

Lorem ipsum ... 

Oto najnowsza dokumentacja pomocnicza dotycząca obsługi pomocników Laravel string

Vipertecpro
źródło
1
bardzo czyste rozwiązanie. pracował dla mnie. najlepsza odpowiedź IMO
maximus1127
@ maximus1127 Dziękuję bardzo za twoje wysiłki w nauce, cieszę się, że mogę być dla ciebie przydatny.
Vipertecpro
1
Świetny! Rodzaj odpowiedzi, chciałbym zobaczyć więcej.
mhrabiee
Co się stanie, jeśli masz ciąg taki jak dolor Lorem ipsum, czy zwróci poprawny wynik?
Rishi
@Rishi Tak, zwróci prawidłowy wynik, przy okazji o której metodzie mówisz o limicie? lub słowa?
Vipertecpro
7

Możesz ustawić przestrzeń nazw na przykład:

{!! \Illuminate\Support\Str::words($item->description, 10,'....')  !!}
Raman Bhasker
źródło
5

Aby kod był SUCHY, a treść pochodzi z modelu, należy przyjąć nieco inne podejście. Edytuj swój model w ten sposób (testowane w L5.8):

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Comment extends Model
{
    public function getShortDescriptionAttribute()
    {
        return Str::words($this->description, 10, '...');
    }
}
?>

Zatem Twoim zdaniem:

{{ $comment->short_description }}
Guillaume Pommier
źródło
2

Działa to na Laravel 5:

{!!strlen($post->content) > 200 ? substr($post->content,0,200) : $post->content!!}
Ofor Emma
źródło
2

Możesz ustawić limit ciągu, jak na poniższym przykładzie:

<td>{{str_limit($biodata ->description, $limit = 20, $end = '...')}}</td>

Wyświetli tylko 20 liter, w tym spacje i kończy się na ....

Przykładowe zdjęciePokazuje przykład ograniczenia ciągów

Ganesh Khadka
źródło
Hej, bracie, przestarzałe. Zaktualizuj swoją odpowiedź
Mahdi Safari
1

W przypadku prostych rzeczy, takich jak ta, wolałbym zrobić pomocnika - na przykład:

utwórz helpers.phpplik w swoim /app/helpers.phpz następującą zawartością:

<?php
if (! function_exists('short_string')) {
    function short_string($str) {
            $rest = substr($str, 0, 10);
            return $rest;
    }
}

Zarejestruj helper.phpat autoload w swoimcomposer.json

   "autoload": {
        "files": [
            "app/helpers.php"
        ],
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    }

Następnie możesz użyć w swoim pliku ostrza na przykład:

{{ short_string($whatever_as_text) }}

Możesz więc używać tej prostej funkcji globalnie w swojej aplikacji.

stefanr
źródło
0

Aktualizacja Laravel 6:

@php
$value = 'Artificial Intelligence';
$var = Str::limit($value, $limit = 15, $end = '');
print_r($var);
@endphp

<p class="card-text">{{ Illuminate\Support\Str::limit($value, 7) }}</p>
<h2 class="main-head">{!! Str::limit($value, 5) !!}</h2>
Shamsheer
źródło
0

W Laravel 4 i 5 (do 5.7) możesz użyć str_limit, który ogranicza liczbę znaków w ciągu.

Będąc w Laravel 7 w górę, możesz skorzystać z pomocnika Str :: limit.

//For Laravel  to Laravel 7

{{ Illuminate\Support\Str::limit($post->title, 20, $end='...') }}
zahidsoft
źródło
Laravel 7, użyj tylko {{Str :: limit ($ chamado-> subClient-> name, 10)}}
João Mello