رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
چطور یه فیلتر به همه کنترلرها اعمال میشود؟
#1
سلام

اگه بخوام یه فیلترو به همه کنترلرهای مشتق شده از MyController اعمال کنم چطور باید معرفیش کنم؟

public function behaviors()
{
   return [
       [
           'class' => 'yiifiltersHttpCache',
           'only' => ['index'],
           'lastModified' => function ($action, $params) {
               $q = new yiidbQuery();
               return $q->from('post')->max('updated_at');
           },
       ],
   ];
}

متشکرم.
پاسخ
تشکر شده توسط:
#2
همین که از این کلاس مشتق شده باشن کافیه. behaviors رو به ارث میبرن.
پاسخ
تشکر شده توسط: abdollah110110
#3
کد زیرو در ModuleAdmin قرار دادم و برای اینکه در همه کنترلرها جواب بده تغییراتی رو اعمال کردم:

public function behaviors() {
   return [
       [
           'class' => 'yiifiltersHttpCache',
           'only' => ['index'],
           'lastModified' => function ($action, $params) {
               $q = new yiidbQuery();
               return $q->from(Yii::$app->controller->id)->max('id');
           },
       ],
   ];
}

الآن مشکل اینه که نمیدونم کش فعال شده یا نه و خطا هم نمیده.
اگه هیچ رکوردی از جدول کم و زیاد نشه و فقط فیلدها ویرایش شده و تغییر کنند، کش قبلی از بین میره؟
پاسخ
تشکر شده توسط:
#4
خیر الان از بین نمیره چون شما ماکسیمم id رو معیار کش گذاشتین. یک فیلد از نوع timestamp به جدول اضافه کنید و DEFAULT CURRENT_TIMESTAMP و همینطور ON UPDATE CURRENT_TIMESTAMP رو براش ست کنید تا خودش بطور خودکار هروقت رکوردی آپدیت شد، تغییرش بده. بعد هم اون فیلد رو بعنوان شرط lastModified بگذارین.
پاسخ
تشکر شده توسط: abdollah110110
#5
منظورتون افزودن دو فیلد از نوع timestamp هست به صورت زیر:

`ts_create` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`ts_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

؟
پاسخ
تشکر شده توسط:
#6
نه فقط یکی هم کافیه و اسمش رو هم هرچی دوست داشتین بگذارین. البته بین دو موردی که گفتین، دومی درسته چون ON UPDATE هم داره.
پاسخ
تشکر شده توسط: abdollah110110
#7
1- چطور بدونم کش فعال شده یا نه؟
2- وقتی Pjax رو فعال کرده ایم نیازی به استفاده از کش داریم؟
3- کد در نهایت بصورت زیر خواهد بود؟

public function behaviors() {
   return [
       [
           'class' => 'yiifiltersHttpCache',
           'only' => ['index'],
           'lastModified' => function ($action, $params) {
               $q = new yiidbQuery();
               return $q->from(Yii::$app->controller->id)->max('ts');
           },
       ],
   ];
}
پاسخ
تشکر شده توسط:
#8
1- چک کنید. توی صفحه کدی مثل زیر بگذارین:
<?= time() ?>
اگه با ریفرش شدن صفحه بدون درج یا ویرایش یک رکورد، اطلاعات تغییر نکرد یعنی کش فعال شده.

2- کلاً فعال کردن کش باعث میشه جواب درخواستهای AJAX هم بصورت کش شده بیاد مگه اینکه با قراردادن یک عدد تصادفی در انتهای آدرس، هربار مرورگر رو مجبور به ByPass کردن کش قبلی خودش کنید.

3- بله کدتون بنظر درست میاد.
پاسخ
تشکر شده توسط: abdollah110110
#9
متد behaviors رو در moduleAdmin تعریف کردم.
وقتی کد بصورته زیر هست کش فعال نمیشه:

public function behaviors() {
   return [
       [
           'class' => 'yiifiltersHttpCache',
           'only' => ['index'],
           'lastModified' => function ($action, $params) {
               $q = new yiidbQuery();
               return $q->from(Yii::$app->controller->id)->max('ts');
           },
       ],
   ];
}

وقتی only رو بصورت زیر تعریف میکنم:

'only' => ['products/index'],

خطا میده.
در متد actionUpdate فیلد ts رو اینطور مقداردهی میکنم:

$model = $this->findModel($id);
$model->ts = date('Y-m-d H:i:s');


فایل‌های پیوست تصاویر بندانگشتی
   
پاسخ
تشکر شده توسط:
#10
توی ماژول نگذارین. باید توی کلاس کنترلری باشه که بقیه کنترلرهای شما از اون مشتق میشن.
پاسخ
تشکر شده توسط:
#11
متد behaviors رو در AdminController قرار دادم، دیگه خطا نمیده ولی کش فعال نشده.

فرقی میکنه کد زیر کجای صفحه قرار بگیره؟ من قبل از لینک ایجاد محصول جدید قرار دادم.

<?= time() ?>
پاسخ
تشکر شده توسط:
#12
برای استفاده از کش، چه کلاسهایی باید use بشن؟
من کلاس HttpCache رو use کرده ام.
کلاس دیگه ای هم لازمه؟
پاسخ
تشکر شده توسط:
#13
نه همون کلاس کش که نیاز دارین رو فقط باید بکار ببرین.
پاسخ
تشکر شده توسط:
#14
با اجرا شدن کد زیر، کش فعال نمیشه:


public function behaviors() {
  return [
      'cache' => [
           'class' => 'yiifiltersHttpCache',
           'only' => ['products/index'],
           'lastModified' => function ($action, $params) {
                $q = new yiidbQuery();
                return $q->from(Yii::$app->controller->id)->max('ts');
           },
       ],
   ];
}

خطا نداره و فقط کش فعال نمیشه.
پاسخ
تشکر شده توسط:
#15
این کد رو دارین کجا مینویسین؟
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 1 مهمان