راکت
حل شده

دریافت اطلاعات foreach در ویو بدون رفرش شدن صفحه

13 پاسخ

سلام دوستان.وقتتون بخیر.
توی لیست محصولات میخوام هر 10 دقیقه قیمت محصول از جدول محصولات خونده بشه و بدون اینکه صفحه رفرش بشه قیمت محصول به روز بشه.محصولات رو از طریق ی foreach دارم به کاربر نمایش میدم

foreach($products as $product)
{{$product->id}}
{{$product->name}}
{{$product->price}}
endforeach

ممنون میشم راهنمایی کنین چجوری اینکار رو انجام بدم
@mohaligateway
@muhammad
@ali.bayat
@hesammousavi
@mrn
@juza66

ثبت پرسش جدید

پاسخ‌ها

13
فرشید مرادی
فرشید مرادی
@eniack

تخصص: noob

بهترین پاسخ

سلام وقت بخیر ، من یه راه حل ساده و کاربردی واسه این سوال شما دارم:
چرا شما دوباره محصول رو بگیری از دیتابیس؟ فقط کافیه اون دیوی ک محصولات رو نمایش میده رفرش کنی(همون جایی که foreach قرار داره) به این صورت

$('.parent').load(document.URL + ' #wrapper);

داخل این کد parent دیو بالایی محصولات هست و wrapper دیو اصلی ماست که محصولات رو نمایش میده شما یک interval بزار مثلا ۵ ثانیه ای و کد بالا رو داخل این interval بزار و یک محصول اضافه کن به دیتابیس

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

سلام میتونی با تابع setInterval در جاوا اسکریپت این کارو انجام بدی در این تابع که زمان اجراشو مشخص میکنی در بازه های زمانی خاصی اجرا میشه و میتونی با ایجکس لیست محصولاتو دریافت و نشون بدی.
یه سرچ در باره نحوه کار کرد تابع setInterval انجام بده.
میتونی لیست کل محصولاتو بگیری یا فقط قیمتهارو بخونی که خوندن فقط قیمت ها مقداری پیچیده تره.
راه آسونش اینه لیست کامل محصولو در ده دقیقه بگیری با foreach نمایشش بدی.

Muhammad
Muhammad
@muhammad

تخصص: Back-End Developer

سلام شب به‌خیر.

کی توی سایت 10 دقیقه منتظر می‌مونه تا نیاز به چنین کاری باشه؟
اگه نیاز بود باید با جاواسکریپت، ریکوست HTTP بفرستین یا از Socket استفاده کنین. راه اول اوکی و راحته: یه ریکوست می‌زنین و لیست محصولات رو می‌گیرین، بعد با دستکاری DOM اون باکس رو آپدیت می‌کنین. اولین بار foreach داخل blade رو استفاده کردین ولی بعدش دیگه کارایی نداره چون با جاواسکریپت ریفرش میشه.

شاید پاسخ شما همین‌جا باشد

مصطفی
مصطفی
@alavi.it88

@hosseinshirinegad98
مهندس ممنون میشم اگر آموزش خوبی در این مورد داری بهم بدی؟ setInterval این رو توی چندتا از آموزش ها دیدم ولی نحوه ای که بخواد فقط اون foreach آپدیت بشه رو نفهمیدم.

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

ببینید همانطور که در بالا اشاره شد هیچ کس به مدت ده دقیقه در یه صفحه محصولات نمیمونه و شاید انجام چنین کاری اشتباه محض باشه ولی ایرادی نداره طریق انجامشو یاد بگیری بد نیست.
شما باید اون foreach رو به تنهایی برداری ببری تو یک ویو و بجاش از دستور include برای ایمپورت کردن اون foreach استفاده کنی و در دفعات بعد هم با ایجکس اون ویوی foreach رو سر جاش بزای. کافیه یه المنت دور foreach بزاری و با ایجکس ویوی موردنظرو برگردونی و قرارش بدی تو اون تگه.
اگه لازم داری یه نمونه کد برات ارسال کنم

مصطفی
مصطفی
@alavi.it88

@hosseinshirinegad98 نیکی و پرسش مهندس جان اگر یک نمونه بدی ممنون میشم.در مورد اون 10 دقیقه مهندس اصلا این چیزی که گفتم نیست چیزی که مد نظرمه یک اپ تحت وبه و اصلا محصول نیست من برای اینکه ملموس تر و باشه و درگیر توضیحات اون سمت نشیم گفتم محصول که زودتر به مقصود برسم

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

اجازه بده تو سیستم پیادش کنم بعد نمونه کدشو برات میفرستم

مصطفی
مصطفی
@alavi.it88

@hosseinshirinegad98 ممنون مهندس خیلی خیلی لطف می کنین

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

روت خوندن اطلاعات :

Route::get('products', 'ProductController@products');

کدهای کنترلر

class ProductController extends Controller
{
    public function products()
    {
        $products = Product::orderBy('id', 'DESC')->get();

        return view('products', compact('products'));
    }
}

ویوی برنامه با نام : products.blade.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta name="CSRF-TOKEN" content="{{ csrf_token() }}">
    <title>Document</title>
    <link rel="stylesheet" type="text/css" href="https://roocket.ir/{{url('css/app.css')}}">
</head>
<body>
    <div id="products">
        @if($products->count())
            <table class="table table-bordered">
                <thead>
                    <tr>
                        <th>عنوان</th>
                        <th>قیمت</th>
                    </tr>
                </thead>
                <tbody>
                    @foreach($products as $product)
                        <tr>
                            <td>{{$product->title}}</td>
                            <td>{{ $product->price }}</td>
                        </tr>
                    @endforeach
                </tbody>
            </table>
        @else
            <p class="alert alert-warning">محصولی برای نمایش یافت نشد</p>
        @endif
    </div>
</body>
</html>

<script src="{{url('js/jquery-2.1.1.min.js')}}"></script>
<script>
        setInterval(function() {
            $("#products").load(document.URL+ ' table');
        }, 600000); 
</script>

600000 معادل 10 دقیقه

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

سلام مرسی
استفاده شد.
@eniack

مصطفی
مصطفی
@alavi.it88

آقا خیلی خیلی ممنون.
@hosseinshirinegad98
@eniack
مهندس فقط مشکلی که خوردم اینه که من دارم از data table استفاده می کنم و بعد از اولین برروز رسانی سرچ و پیج بندی data table از بین میره.راه حلی برای این قضیه هست؟

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

راحلش اینه که پارامترهای سرچو به لینکهای صفحه بندی بچسبونی.
در مورد متد appends در لاراول یه تحقیقی بکن یا متد withQueryString
و همینطور withPath با این متد ها میتونی پارامترهای سرچو به آخر لینک های صفحه بندی اضافه کنی .
سرچی بزنی کار دستت میاد . انگلیسی هم سرچ کن

مصطفی
مصطفی
@alavi.it88

@hosseinshirinegad98
مهندس appends تا جایی که می دونم مال زمانیه که از پجینیت خود لاراول استفاده کنی.
من الان از data table استفاده کردم و منظورم از رفتن سرچ و پیج بندی محو شدن باکس سرچ و دکمه های پجینیت هست.
تو data table اصلا پارامتری به آخر لینک های صفحه بندی اضاف نمیشه که که بخوام withPath کنمش.
به هر حال خیلی خیلی ممنون تا همینجا هم خیلی لطف کردین.کلی کارمو راه انداختین.

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام