سلام
اگه بخوام یه فیلترو به همه کنترلرهای مشتق شده از MyController اعمال کنم چطور باید معرفیش کنم؟
public function behaviors()
{
return [
[
'class' => 'yiifiltersHttpCache',
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new yiidbQuery();
return $q->from('post')->max('updated_at');
},
],
];
}
متشکرم.
همین که از این کلاس مشتق شده باشن کافیه. 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('id');
},
],
];
}
الآن مشکل اینه که نمیدونم کش فعال شده یا نه و خطا هم نمیده.
اگه هیچ رکوردی از جدول کم و زیاد نشه و فقط فیلدها ویرایش شده و تغییر کنند، کش قبلی از بین میره؟
خیر الان از بین نمیره چون شما ماکسیمم id رو معیار کش گذاشتین. یک فیلد از نوع timestamp به جدول اضافه کنید و DEFAULT CURRENT_TIMESTAMP و همینطور ON UPDATE CURRENT_TIMESTAMP رو براش ست کنید تا خودش بطور خودکار هروقت رکوردی آپدیت شد، تغییرش بده. بعد هم اون فیلد رو بعنوان شرط lastModified بگذارین.
منظورتون افزودن دو فیلد از نوع timestamp هست به صورت زیر:
`ts_create` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`ts_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
؟
نه فقط یکی هم کافیه و اسمش رو هم هرچی دوست داشتین بگذارین. البته بین دو موردی که گفتین، دومی درسته چون ON UPDATE هم داره.
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');
},
],
];
}
1- چک کنید. توی صفحه کدی مثل زیر بگذارین:
<?= time() ?>
اگه با ریفرش شدن صفحه بدون درج یا ویرایش یک رکورد، اطلاعات تغییر نکرد یعنی کش فعال شده.
2- کلاً فعال کردن کش باعث میشه جواب درخواستهای AJAX هم بصورت کش شده بیاد مگه اینکه با قراردادن یک عدد تصادفی در انتهای آدرس، هربار مرورگر رو مجبور به ByPass کردن کش قبلی خودش کنید.
3- بله کدتون بنظر درست میاد.
متد 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');
توی ماژول نگذارین. باید توی کلاس کنترلری باشه که بقیه کنترلرهای شما از اون مشتق میشن.
متد behaviors رو در AdminController قرار دادم، دیگه خطا نمیده ولی کش فعال نشده.
فرقی میکنه کد زیر کجای صفحه قرار بگیره؟ من قبل از لینک ایجاد محصول جدید قرار دادم.
<?= time() ?>
برای استفاده از کش، چه کلاسهایی باید use بشن؟
من کلاس HttpCache رو use کرده ام.
کلاس دیگه ای هم لازمه؟
نه همون کلاس کش که نیاز دارین رو فقط باید بکار ببرین.
با اجرا شدن کد زیر، کش فعال نمیشه:
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');
},
],
];
}
خطا نداره و فقط کش فعال نمیشه.
این کد رو دارین کجا مینویسین؟