آفلاین
user-avatar

رفتن به کنترلر و بازگشت با ویو بدون رفرش

2 سال پیش
توسط محمدرضا عطوان آپدیت شد
آفلاین
user-avatar
تابش ( 3091 تجربه )
2 سال پیش
تخصص : برنامه نویس ارشد وب

دوستان من یک پروژه دارم میره با کلیک روی دکمه سرچ میره دنبال یک راننده میگرده
در ویو

@if($order->accept == ۱)
    <script>
        window.setTimeout(function () {
            window.location.href = "http://localhost:۸۰۰۰/confirmed/{{$order->id}}";
        }, ۱۲۰۰۰);
    </script>
@endif

بهش میگم برو به کنترلر مربوطه و نتیجه رو بفرست

در کنترلر

public function confirmed($order_id)
    {
        $order = Order::find($order_id);
        if ($order->accept == ۴) {

            $message = '';
            return view('trip.html.trip', compact('order', 'message'));

        } else {
            return view('trip.html.trip', compact('order'));
        }
    }

میره چک های لازمه را انجام میده و برمیگردونه

ولی خب صفحه رفرش میشه
میشه کسی کدی بگه چکار میشه کرد که رفرش نشه صفحه و عملیات انجام بشه عین اسنپ

آفلاین
user-avatar
Igo ( 3869 تجربه )
2 سال پیش

سلام
من منطق کدهاتون رو متوجه نمیشوم چرا دارید از setTimeout استفاده میکنید مگه قرار نیست کاربر روی دکمه جسجتو کلیک کنه؟؟؟؟ خوب وقتی روی دکمه کلیک کرد توی رویداد کلیک دکمه یه درخواست Ajax بفرستین.
توی کنترولر هم شما View رو برمیگردونید در صورتی که باید یک آبجکت در قالب json بفرستید.

آفلاین
user-avatar
تابش ( 3091 تجربه )
2 سال پیش
تخصص : برنامه نویس ارشد وب

@Igo
نه بدین صورت است که کاربر یکبار روی دکمه جستجو کلیک میکنه
حالا صفحه میره به کنترلر و اکشن check رو اجرا میکنه و یکی یکی راننده را خبر میکنه
هر کدوم که رد میکنن به طور خودکار صفحه رفرش میشه و و اطلاعات ارسال میشه برا راننده بعدی
و دوباره اطلاعات اردر به صفحه ویو فرستاده میشه اگر راننده تایید کرده باشه ادرد accep =1 میشه و اطلاعات نشون داده میشه در غیر این صورت accept = 0 است و دوباره به صفحه مورد نظر ریدایرکت میشه

آفلاین
user-avatar
Igo ( 3869 تجربه )
2 سال پیش

اول اینکه شما وقتی به صورت Localhost آدرس دهی میکنی بعدا که پروژه رو آپلود کردی دیگه Localhost معنی نداره
دوم اینکه کاربردlocation.href اینجا نیست. به جای location.href باید درخواست Ajax بفرستی
سوم هم توی اکشن ب جای View باید Json برگردونی

آفلاین
user-avatar
سیروس ( 5250 تجربه )
2 سال پیش

lgo@ من تموم این کارا کردم باز نمیتونم
شما یه کد ساده ک اینکار رو بکنه دارین؟
فقط با ایجکس مطالب بخونه نه ساده که با retirn view انجام میدیم

آفلاین
user-avatar
محمدرضا عطوان ( 9831 تجربه )
2 سال پیش

خب شما وقتی بش میگی window.href یعنی میخوای که صفحه عوض شه!
شما این امکان رو به راحتی می تونی با $.ajax و یا $.post پیاده سازی کنی
خیلی سادس
برای نمونه کد ها هم میتونی سری به سایت اصلی jquery بزنی
در کل شما یه $order->id رو میفرستی به کنترلر و بعد از چک شدن فقط return میکنی بدون نمایش ویو!
بعدش json دریافت شده رو تحلیل میکنی در هون صفحه
این کد رو برات آماده کردم
ازش استفاده کن

<script>
    function getDetail(order_id)
    {
        $.ajax({
            type: "GET",
            url: "site.com/order/{{ $order->id }}",
            dataType : 'json',
            success: function(data)
            {
               // انجام عملیات مورد نظر در صورت موفقیت
            },
            error : function(data)
            {
                // انجام عملیات مورد نظر در صورت ارور و یا نبود جواب درست
            }
        });
        return false;
    }
</script>
آفلاین
user-avatar
تابش ( 3091 تجربه )
2 سال پیش
تخصص : برنامه نویس ارشد وب

@mratwan
با تشکر از شما
من اینها رو نوشتم

<input type="text" id="order">

نتیجه این است :
@if($order->accept == 1)
    <h1>اردر ما یک است</h1>

@elseif($order->accept == 2)
    <h2>اردر ما 2 است</h2>
@elseif($order->accept == 3)
    <h3>اردر ما 3 است</h3>
@endif

<script src="/js/app.js"></script>
<script>
    setInterval(getDetail,5000);

    function getDetail(order_id)
    {
        $.ajax({
            type: "GET",
            url: "http://localhost:8000/check/{{$order->id}}",
            dataType : 'json',
            success: function(data)
            {
               $('#order').val(data.accept);
            },
            error : function(data)
            {

            }
        });
    }
</script>

و در کنترلر

    public function index()
    {
        $order = Order::find(1);
       return view('index',compact('order'));
    }

    public function check($id){
        $order = Order::find($id);
        return Response::json($order);
       // return view('index',compact('order'));
    }

اما حالا میتونم مقدار order را داخل input بگیرم و نمیتونم توی php چک کنم
باید چیکار کنم که شروط ویو کار کنند ؟

آفلاین
user-avatar
حامد صادقی ( 6256 تجربه )
2 سال پیش
تخصص : برنامه نویس

وقتی می خواهی به صورت ایجکس کار کنی فقط بار اول کد های php درون ویو کار میکنه یعنی فقط یک بار بعد از رفرش مرورگر حالا بعد از این اجرا بقه کار ها رو باید با جاوا اسکریپت انجام بدی . توی تابع success همون جایی که order را گرفتی یک شرط قرار بده و تگ های h1 , h2 , h3 را با توجه به اون مخفی کن یا نمایش بده . یا اینکه کلا تک رو با جاوا اسکریپت بساز و به صفحه اضافه کن

آفلاین
user-avatar
Igo ( 3869 تجربه )
2 سال پیش

خوب فقط یک المنت h1 نیاز داری.
برای اینکار برای همونطوری که مقدار input رو تغییر دادی باید مقدار المنت h1 رو هم عوض کنی.

$("h1").innerText=data.accept

البته کنترول و انجام این کارها هم اشتباهه هم وقت گیر
بهتره از یکی از فریم ورک های Angular و Vue و یا React استفاده کنی که خودشون تغییرات رو رهگیری میکنند.

توی تابع ajax هم type رو POST بزار.

آفلاین
user-avatar
تابش ( 3091 تجربه )
2 سال پیش
تخصص : برنامه نویس ارشد وب

@Igo
@sadeghiphp

دوستان به این سادگی که شما میگید نیست
من دارم روی یک پروژه بزرگ کار میکنم
قراره اگر aacept = 1 شد یک سری مشخصات بیاد
اگر 2 شد یک سری دیگه
اگه 3 شد یک سری دیگه
و ...
ولی برای سوال پرسیدن و اینکه شما گیج نشید این کار رو کردم
من بر اساس هر وضعیت یک ویو رو باید لود کنم
مشکل اینجاست که نمیشه متغیر جاواسکریپت رو ریخت توی php

آفلاین
user-avatar
محمدرضا عطوان ( 9831 تجربه )
2 سال پیش

شما وقتی داری اطلاعاتت رو با ایجکس درخواست میکنی از اون url دیگه نیازی نیست که دوباره تو لاراول بش بگی اگه این بو د و اگه اون بود اون کارو کن
باید در قسمت success جاوا اسکریپت وقتی اطلاعات رو میگیره براش شرط بذاری

function getDetail(order_id)
        {
            $.ajax({
                type: "GET",
                url: "site.com/order/{{ $order->id }}",
                dataType : 'json',
                success: function(data)
                {
                   var order = JSON.parse(data);
                   if(order->name == 1)
                   {
                       $("#YourTag").html("H1 is selected");
                       // or
                       $("#YourInput").val("H1 Value");
                   }

                },
                error : function(data)
                {
                    // انجام عملیات مورد نظر در صورت ارور و یا نبود جواب درست
                }
            });
            return false;
        }
برای ارسال پاسخ باید وارد سایت شوید