Проверьте валидацию времени с областью в laravel - PullRequest
0 голосов
/ 30 мая 2018

Я храню 2 даты в моей таблице продуктов start_discounted и end_discounted, эти 2 столбца отвечают за срок действия моей скидки.Теперь, когда срок действия скидки на мой продукт истекает, за исключением того, что он возвращается к нормальной цене, он остается по сниженной цене, и мой таймер уходит в минус.

screen 1

screen 2

Коды

Объем моей модели

public function scopeValidDiscount($query){
       return $query->where('start_discounted', '<=', Carbon::now()->toDateTimeString())
                    ->where('end_discounted', '>=', Carbon::now()->toDateTimeString());
    }

controller

public function product($slug){
     $product = Product::where('slug', $slug)->firstOrFail();
     $validdiscount = $product->ValidDiscount()->get();
     //...
}

blade

@if($validdiscount)
  show timer
@endif

PS: Мне нужно не показывать таймер в 2 условиях, 1 даты скидок истекли.2 Даты скидок на товары равны нулю.

Есть идеи, где моя ошибка?

ОБНОВЛЕНИЕ

Мой таймер в лезвии:

@if($validdiscount)
<div class="deals_timer row align-items-center">
<div class="col-md-6 deals_timer_title_container">
<div class="deals_timer_title">{{__('store.hurryup')}}</div>
<div class="deals_timer_subtitle">{{__('store.endsin')}}</div>
</div>
<div class="col-md-6 deals_timer_content ml-auto">
<div class="deals_timer_box clearfix" data-target-time="{{$end}}">
<div class="text-center deals_timer_unit">
<div id="deals_timer3_hr" class="deals_timer_hr"></div>
<span>{{__('store.hours')}}</span>
</div>
<div class="text-center deals_timer_unit">
<div id="deals_timer3_min" class="deals_timer_min"></div>
<span>{{__('store.mins')}}</span>
</div>
<div class="text-center deals_timer_unit">
<div id="deals_timer3_sec" class="deals_timer_sec"></div>
<span>{{__('store.secs')}}</span>
</div>
</div>
</div>
</div>
@endif

Обратите внимание на data-target-time="{{$end}}" Я думаю, что проблема может быть здесь ...

Мой сценарий таймера:

<script>
    $(document).ready(function(){
        if($('.deals_timer_box').length)
        {
            var timers = $('.deals_timer_box');
            timers.each(function()
            {
                var timer = $(this);

                var targetTime;
                var target_date;

                // Add a date to data-target-time of the .deals_timer_box
                // Format: "Feb 17, 2018"
                if(timer.data('target-time') !== "")
                {
                    targetTime = timer.data('target-time');
                    target_date = new Date(targetTime).getTime();
                }
                else
                {
                    var date = new Date();
                    date.setDate(date.getDate() + 2);
                    target_date = date.getTime();
                }

                // variables for time units
                var days, hours, minutes, seconds;

                var h = timer.find('.deals_timer_hr');
                var m = timer.find('.deals_timer_min');
                var s = timer.find('.deals_timer_sec');

                setInterval(function ()
                {
                    // find the amount of "seconds" between now and target
                    var current_date = new Date().getTime();
                    var seconds_left = (target_date - current_date) / 1000;
                    console.log(seconds_left);

                    // do some time calculations
                    days = parseInt(seconds_left / 86400);
                    seconds_left = seconds_left % 86400;

                    hours = parseInt(seconds_left / 3600);
                    hours = hours + days * 24;
                    seconds_left = seconds_left % 3600;


                    minutes = parseInt(seconds_left / 60);
                    seconds = parseInt(seconds_left % 60);

                    if(hours.toString().length < 2)
                    {
                        hours = "0" + hours;
                    }
                    if(minutes.toString().length < 2)
                    {
                        minutes = "0" + minutes;
                    }
                    if(seconds.toString().length < 2)
                    {
                        seconds = "0" + seconds;
                    }

                    // display results
                    h.text(hours);
                    m.text(minutes);
                    s.text(seconds); 

                }, 1000);
            }); 
        }
    }); 
</script>

{{$ end}}

Это то, что у меня есть в контроллере, чтобы получить дату истечения срока действия и использовать, если в моем JavaScript выше:

$mytime = Carbon::now();
if(!empty($product->start_discounted && $product->end_discounted)){
  $start = $product->start_discounted->format('M d, Y');
  $end = $product->end_discounted->format('M d, Y');
}

, тогда у меня также есть мой код области действия:

$validdiscount = $product->ValidDiscount()->get();

теперь я думаю, что моя проблема вызвана тем, что: я получаю дату истечения срока действия продукта напрямую $product->end_discounted, пока я пытаюсь избежать этого, пока я использую область действия, которая делает то же самое с углеродом в моей модели, не уверен!(может быть, я тоже получу $end по объему?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вы не используете области правильно. Области действия используются в построителе запросов, а не в уже извлеченной модели.

Для этого вам просто нужен обычный метод:

public function validDiscount() {
    return $this->start_discounted <= now()->toDateTimeString()
        && $this->end_discounted >= now()->toDateTimeString();
}

А затем, на ваш взгляд, отметьте это следующим образом:

@if($product->validDiscount())
  show timer
@endif

И удалите ненужные$validdiscount = $product->ValidDiscount()->get(); (где вы используете область запроса для экземпляра модели).

0 голосов
/ 30 мая 2018

Вы можете использовать javascript / jquery во внешнем интерфейсе, чтобы сделать это.

  1. Когда вы заполняете эту страницу, вызовите эту функцию js, чтобы проверить это значение следующим образом $(document).ready(function(){ check_timer() })

  2. Затем снова активируйте этот метод после истечения таймера, чтобы обновить вид (скрыть рекламную цену, скрыть таймер и показать фактическую цену)

Функция check_timer можетбыть таким

function check_timer(){
  if(!{{ $validdiscount }}){
   //hide your required div 
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...