【问题标题】:Comparing dates in view and applying class比较视图中的日期和应用类
【发布时间】:2016-12-20 23:50:39
【问题描述】:

我目前正在使用 foreach 循环在视图中显示项目。

@foreach ($projects as $project)
    <div class="col-xs-4 col-sm-4 col-md-4 col-lg-4">
        {!! Form::open(array('class' => 'form-inline delete', 'method' => 'DELETE', 'route' => array('projects.destroy', $project->id))) !!}
            <div class="panel panel-default">
                <div class="panel-heading projectPanelHeading">
                    <h4>{{ $project->projectName  }}</h4>
                </div>
                <div class="panel-body projectPanel">
                    <p>Deployment Date: {{ ($project->deploymentDate ? date('d-m-Y', strtotime($project->deploymentDate)) : '') }}</p>
                    <p>Status: {{ $project->status or '' }}</p>
                </div>
            </div>
        {!! Form::close() !!}
    </div>
@endforeach

如您所见,每个项目都有一个 $project->deploymentDate,我将其转换为格式为 d-m-Y 的日期对象。

我要做的是将部署日期与当前日期进行比较,如果部署日期已过,则将面板红色类应用于面板。

我正在考虑做这样的事情

{!! Form::open(array('class' => 'form-inline delete', 'method' => 'DELETE', 'route' => array('projects.destroy', $project->id))) !!}
    @if(date('d-m-Y', strtotime($project>deploymentDate)) < date('d-m-Y'))
        <div class="panel panel-default panel-red">
            <div class="panel-heading projectPanelHeading">
                <h4>{{ $project->projectName  }}</h4>
            </div>
            <div class="panel-body projectPanel">
                <p>Deployment Date: {{ ($project->deploymentDate ? date('d-m-Y', strtotime($project->deploymentDate)) : '') }}</p>
                <p>Status: {{ $project->status or '' }}</p>
            </div>
        </div>
        @else
        <div class="panel panel-default">
            <div class="panel-heading projectPanelHeading">
                <h4>{{ $project->projectName  }}</h4>
            </div>
            <div class="panel-body projectPanel">
                <p>Deployment Date: {{ ($project->deploymentDate ? date('d-m-Y', strtotime($project->deploymentDate)) : '') }}</p>
                <p>Status: {{ $project->status or '' }}</p>
            </div>
        </div>
    @endif
{!! Form::close() !!}

我不喜欢这种方法的是面板块的重复。此外,将panel-red应用于deploymentDate尚未过去的项目会出现很多错误,反之亦然。

有没有更好的方法来实现我所追求的既正确又不需要重复的方法?

谢谢

【问题讨论】:

    标签: laravel laravel-5 laravel-5.2


    【解决方案1】:

    首先,将deploymentDate 属性添加到项目模型中的$dates 数组中。这将确保您的 deploymentDate 拥有 Carbon 实例。

    项目.php

    protected $dates = ['deploymentDate'];
    

    一旦实现,您可以通过简单的函数检查它是否小于:

    @if($project->deploymentDate->lt(\Carbon\Carbon::Now()))
    

    这也可以通过模型上的方法来实现,在您的 Project.php 中

    public function checkDeploymentDate()
    {
        return $this->deploymentDate->lt(\Carbon\Carbon::Now());
    }
    

    那么在你看来:

    @if($project->checkDeploymentDate())
    

    最后对于面板部分,你可以为其添加一个 Blade 指令:

    AppServiceProvider.php

    <?php
    
    namespace App\Providers;
    
    use Blade;
    use Illuminate\Support\ServiceProvider;
    
    class AppServiceProvider extends ServiceProvider
    {
        /**
         * Perform post-registration booting of services.
         *
         * @return void
         */
        public function boot()
        {
            Blade::directive('deploymentDate', function($expression) {
                return "<?php echo($expression); ?>";
            });
        }
    
    }
    

    Blade 指令将帮助您将新功能扩展到 Blade 模板。所以在上面的例子中,在你的视图模板中:

    {{@deploymentDate(test)}} 会回显测试

    【讨论】:

    • 感谢您的评论,日期部分完美运行。你能详细说明一下ServiceProvider吗?这将如何实施?谢谢
    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多