Tronquer la chaîne dans les modèles de lames Laravel

92

Existe-t-il un modificateur tronqué pour les modèles de lames dans Laravel, un peu comme Smarty?

Je sais que je pourrais simplement écrire le php réel dans le template mais je cherche quelque chose d'un peu plus agréable à écrire (n'entrons pas dans l'ensemble de PHP est un débat sur le moteur de template).

Par exemple, je recherche quelque chose comme:

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

Je sais que je pourrais utiliser quelque chose comme Twig via composer mais j'espère des fonctionnalités intégrées dans Laravel lui-même.

Sinon, il est possible de créer vos propres modificateurs réutilisables comme Smarty le propose. J'aime le fait que Blade ne soit pas excessif avec toute la syntaxe, mais je pense que truncate est une fonction vraiment pratique à avoir.

J'utilise Laravel 4.

fl3x7
la source
qu'en est-il de laravel 5?
Hos Mercury
1
@HosMercury Pour L5, voir stackoverflow.com/questions/29281013/…
fl3x7

Réponses:

198

Dans Laravel 4 & 5 (jusqu'à 5.7), vous pouvez utiliser str_limit, ce qui limite le nombre de caractères dans une chaîne.

Dans Laravel 5.8 up, vous pouvez utiliser l' Str::limitassistant.

//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='...') }}

Pour plus de fonctions d'assistance Laravel http://laravel.com/docs/helpers#strings

Anil Singh
la source
Bonne réponse car le cas d'utilisation est en vue Blade.
Frisbetarian
10
Dans la version 5.8, les straides ont été supprimées, vous devez les utiliser à la Illuminate\Support\Str::limit($string)place
Hassan Azimi
1
str_limit est obsolète
Omer
39

Laravel 4 a Str::limitce qui tronquera au nombre exact de caractères, et aussi Str::wordsqui tronquera sur la limite du mot.

Check-out:

Dustin Graham
la source
Savez-vous si un équivalent de Str::wordsexiste dans Larvel 5.2?
Jiedara
1
Non. On dirait que cela limite maintenant le nombre de mots, pas de caractères. github.com/laravel/framework/blob/5.2/src/Illuminate/Support/…
Dustin Graham
C'était ce que je cherchais! Merci !
Jiedara
32

Edit: Cette réponse a été publiée lors de la version bêta de Laravel 4, lorsque la classe Str n'existait pas. Il existe maintenant une meilleure façon de le faire dans Laravel 4 - qui est la réponse de Dustin ci-dessous. Je ne peux pas supprimer cette réponse en raison des règles SO (cela ne me laissera pas)

Blade lui-même n'a pas cette fonctionnalité.

Dans Laravel 3, il y avait la classe Str - ce que vous pouviez faire:

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

À ce stade, je ne pense pas que la classe Str soit dans Laravel 4 - mais en voici un portage que vous pouvez inclure dans composer pour l'ajouter à votre propre projet

Laurence
la source
Merci pour la suggestion, il semble que je
devrai céder
Aujourd'hui, Laravel 4 a la classe Str. Voir la réponse de Dustin Graham.
trm42
Oui c'est correct. Quand j'ai initialement publié cette réponse, c'était pendant la bêta de Laravel 4, quand la classe Str n'existait pas
Laurence
Où est la réponse originale? Son effrayant impossible de trouver des documents pour 4.1 maintenant ... :(
Srneczek
15

Mise à jour pour Laravel 7. * : Fluent Strings, c'est-à-dire une interface plus fluide et orientée objet pour travailler avec des valeurs de chaîne, vous permettant d'enchaîner plusieurs opérations de chaîne en utilisant une syntaxe plus lisible par rapport aux opérations de chaîne traditionnelles.

Exemple de limite :

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

Production

The quick brown fox...

mots Exemple:

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

Production

Perfectly balanced, as >>>

Mise à jour pour Laravel 6. * : Vous avez besoin de ce package pour fonctionner avec tous les helpers laravelcomposer require laravel/helpers

Pour utiliser helper dans le contrôleur, n'oubliez pas d'inclure / utiliser également la classe

use Illuminate\Support\Str;

Mise à jour Laravel 5.8

C'est pour gérer les caractères de la chaîne :

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

Production

Lorem ipsu ... 

C'est pour gérer les mots de la chaîne :

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

Production

Lorem ipsum ... 

Voici la dernière documentation d'aide pour la gestion des chaînes Laravel Helpers

Vipertecpro
la source
1
solution très propre. travaillé pour moi. meilleure réponse IMO
maximus1127
@ maximus1127 Merci beaucoup pour vos efforts d'apprentissage, je suis heureux de pouvoir vous être utile.
Vipertecpro
1
Génial! Genre de réponse j'aimerais en voir plus.
mhrabiee le
Que se passera-t-il si vous avez une chaîne comme la couleur de Lorem ipsum retournera-t-elle un résultat correct?
Rishi
@Rishi Oui, il retournera le résultat correct, btw de quelle méthode parlez-vous de limite? ou des mots?
Vipertecpro
7

Vous pouvez définir l'espace de noms comme:

{!! \Illuminate\Support\Str::words($item->description, 10,'....')  !!}
Raman Bhasker
la source
5

Pour garder votre code SEC, et si votre contenu provient de votre modèle, vous devez adopter une approche légèrement différente. Modifiez votre modèle comme tel (testé en 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, '...');
    }
}
?>

Ensuite, à votre avis:

{{ $comment->short_description }}
Guillaume Pommier
la source
2

Cela fonctionne sur Laravel 5:

{!!strlen($post->content) > 200 ? substr($post->content,0,200) : $post->content!!}
Ofor Emma
la source
2

Vous pouvez définir une limite de chaîne comme dans l'exemple ci-dessous:

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

Il n'affichera que les 20 lettres, espaces compris et se termine par ...

Exemple d'imageIl montre l'exemple de limite de chaîne

Ganesh Khadka
la source
Hé, mon frère, il est obsolète de mettre à jour votre réponse
Mahdi Safari
1

Pour des choses simples comme celle-ci, je préférerais faire une aide - par exemple:

créez un helpers.phpfichier dans votre /app/helpers.phpavec le contenu suivant:

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

Enregistrez le helper.phpat autoload dans votrecomposer.json

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

Après cela, vous pouvez utiliser dans votre fichier lame par exemple:

{{ short_string($whatever_as_text) }}

Vous pouvez utiliser cette fonction simple, ensuite, globalement dans votre application.

Stefanr
la source
0

Mise à jour de 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
la source
0

Dans Laravel 4 & 5 (jusqu'à 5.7), vous pouvez utiliser str_limit, qui limite le nombre de caractères dans une chaîne.

Dans Laravel 7, vous pouvez utiliser l'assistant Str :: limit.

//For Laravel  to Laravel 7

{{ Illuminate\Support\Str::limit($post->title, 20, $end='...') }}
zahidsoft
la source
Laravel 7, utilisez uniquement {{Str :: limit ($ chamado-> subClient-> name, 10)}}
João Mello