تالار گفتمان nCIS.ir

نسخه‌ی کامل: مشاهده مطالب به صورت AJAX در Yii
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام

استاد من نیاز دارم مقداری رو از یک اکشن هر 60 ثانیه دریافت کنم و با کمک AJAX در قسمتی از سایت نمایش بدم

ممنون میشم راهنمایی کنید چطوری میتونم از AJAX در Yii استفاده کنم و برای انجام این کار چطوری باید کد بنویسم
ارتباطی به Yii نداره با کمک جاوا اسکریپت و جی کوئری بصورت زیر میتونید بنویسید.
این ساده ترین شکل هستش، ممکنه متد ارسالتون متفاوت باشه یا دیتاهای مختلفی برای ارسال داشته باشید.
برای آشنایی بیشتر با نحوه استفاده از ajax با کمک jquery لینک زیر رو مطالعه کنید.
http://api.jquery.com/jquery.ajax/

setInterval(function () {
   $.ajax({
       url: "/controller/action"
   }).done(function (data) {
       $("body").html(data);
   });
}, 60000);
ممنون از پاسختون .

من یکم زیادی jQuery واسم غریبه نمیدونم چرا ...

بطور مثال من در اکشنی یک متغیر یا آرایه دارم مثلا $post حالا در صفحه ای میخوام محتوا این $post را نمایش بدم که هر 1 دقیقه خودکار محتوا جدید $post به نمایش در بیاد

اگر لطف کنید برای این یک نمونه کد بدید ممنون میشم
بهتر بود کدهاتون رو میذاشتید تا تغییرات روی اونها انجام بشه. ولی در هر صورت میتونید کدهای زیر رو نسبت به پروژتون تغییر بدید.

در سمت سرور با yii1 کدهاتون بصورت زیر میتونه نوشته بشه.
class PostController extends Controller
{

   public function filters()
   {
       return array(
           'accessControl',
           'ajaxOnly + view'
       );
   }


   public function actionView()
   {
       header('Content-type: application/json');
       echo CJSON::encode(array(
           'text' => $post
       ));
       Yii::app()->end();
   }

}

در سمت کلاینت کدهای جاوا اسکریپت بصورت زیر میشه:
setInterval(function () {
  $.ajax({
      url: "/post/view"
  }).done(function (data) {
      $("#Post").html(data.text);
  });
}, 60000);

در مثال بالا با فرض اینکه شما اکشنی به نام view در کنترل post دارید کدی نوشته شده تا هر 60 ثانیه یه بار اکشن view صدا زده بشه و متن گرفته شده رو در داخل تگی با آی دی post قرار بده.

در صورتیکه نیاز بود بفرمایید در مورد کدها توضیح بدم.
من یه مثال ساده میزنم خودتون تغییرش بدین. فرض کنید شما میخواین ساعت رو بصورت پویا نشون بدین. خوب یه اکشن توی کنترلر site میسازیم با این کد:
public function actionTime()
{
    if(!Yii::app()->request->isAjaxRequest) {
        Yii::app()->end();
    }
    echo date('l j F Y - H:i:s');
}

این اکشن که خیلی ساده است. داره میگه اگه درخواست AJAX نبود برو از برنامه بیرون. بعدش هم تاریخ و ساعت رو نمایش میده (که وقتی اجرا میشه که درخواست AJAX باشه).

حالا توی ویوی خودتون این کد رو بنویسید:
<div id="time">&nbsp;</div>

<?php Yii::app()->clientScript->registerScript('time', '
    setInterval(function() {
        $.ajax({
            url: "' . Yii::app()->createAbsoluteUrl('site/time') . '",
            success: function(data) {
                $("#time").html(data);
            }
        });
    }, 1000);
');

این کد هر 1000 میلی ثانیه (1 ثانیه) یه درخواست به اکشن time از کنترلر site میزنه و هر خروجی که ازش گرفت رو توی div با آیدی time قرار میده.
بسیار ممنون از لطفتون خیلی کارم راه افتاد .


فقط یک سوال دیگه اگر ما در Action مون کد PHP زیر را داشته باشیم ( مربوط به Extension برای رسم نمودار ) چطوری میتونیم با AJAX این نمودار را به صفحه مورد نظر ارسال کنیم ؟

public function actionRadar()
{        
        $this->widget(
            'chartjs.widgets.ChRadar', 
            array(
                'width' => 600,
                'height' => 300,
                'htmlOptions' => array(),
                'labels' => array("January","February","March","April", "May"),
                'datasets' => array(
                    array(
                        "fillColor" => "rgba(220,220,220,0.5)",
                        "strokeColor" => "rgba(220,220,220,1)",
                        "pointColor" => "rgba(220,220,220,1)",
                        "pointStrokeColor" => "#ffffff",
                        "data" => array(5, 15, 50, 25, 35)
                    ),
                    array(
                        "fillColor" => "rgba(220,220,220,0.5)",
                        "strokeColor" => "rgba(220,220,220,1)",
                        "pointColor" => "rgba(220,220,220,1)",
                        "pointStrokeColor" => "#ffffff",
                        "data" => array(55, 50, 45, 30, 20)
                    )      
                ),
                'options' => array()
            )
        );
} 

و یا برای نمایش این نمودار در صفحه مورد نظر با AJAX چه راهی رو پیشنهاد میکنید .
میتونید خروجی همین متد رو بعنوان محتوای div موردنظر قرار بدین. راه بهتر استفاده از نمودارهای سمت کلاینت مثل Highcharts و... است. کافیه دیتای اونها رو اصلاح کنید.