Обновление кэша записей (cache_db) при расширении собственного класса
        Была у меня задача (может, кому-то поможет по признакам схожести): расширить стандартный класс xPDOSimpleObject шаблоном, который потом нужно расширить другими классами. Естественно, с панелью в админке в виде грида (Ext JS Grid). Так вот столкнулся с тем, что когда активен кэш БД (cache_bd), при создании или удалении дочерних классов (в которых не прописаны таблицы БД — object class=«myChildClass» extends=«myClass») от моего шаблонно-родительского (в котором указана таблица БД — object class=«myClass» table=«my_records» extends=«xPDOSimpleObject»), ничего в таблице не меняется, пока не скинуть системный кэш. Ковыряя несколько дней тему кэширования пришел, на мой взгляд, к весьма простому способу это дело поправить.
Так как все это происходит через процессоры, туда нам и нужно. Нужно поправить, собственно, два процессора — создания и удаления (например, create.class.php и remove.class.php для тех, кто использует modExtra, например, от Василия), а точнее, добавить очистку кэша БД для данного модуля (данной модели), или вообще очистку для кэша БД:
Процессор создания (create.class.php), добавляем два метода:
процессор удаления (remove.class.php), добавляем один метод и поправляем метод process():
Всем хороших выходных ;)
    
    
                                                                                
            Так как все это происходит через процессоры, туда нам и нужно. Нужно поправить, собственно, два процессора — создания и удаления (например, create.class.php и remove.class.php для тех, кто использует modExtra, например, от Василия), а точнее, добавить очистку кэша БД для данного модуля (данной модели), или вообще очистку для кэша БД:
Процессор создания (create.class.php), добавляем два метода:
public function cleanup()
{
	$this->clearCache();
	return parent::cleanup();
}
public function clearCache()
{
	$this->modx->cacheManager->refresh([
		'db' => [
			'objects' => 'myClass' // Это можно не указывать, тогда почистим весь кэш БД
		],
	]);
	return true;
},процессор удаления (remove.class.php), добавляем один метод и поправляем метод process():
public function process()
{
	...
	$this->clearCache();
	return $this->success();	
}
public function clearCache()
{
	$this->modx->cacheManager->refresh([
		'db' => [
			'objects' => 'myClass'
		],
	]);
	return true;
}Всем хороших выходных ;)
Комментарии: 3
                Насколько вообще целесообразно включать кэширование бд? Проверял на нескольких проектах — прирост скорости просто отсутствует же            
                    
                Да все зависит и от хостинга и от задачи, думаю. Я не проводил тестов на эту тему, но в моем случае — доска объявлений, база для хранения админ. единиц страны, в базе будет около 22 000 населённых пунктов и прочих единиц, много запросов разнобойных по разным админ единицам, может помочь. Наверное :)            
                    
                Наверное — это при том условии, что я не ресурс расширяю и своего кэш-менеджера, как у ресурсов не делал, не много полей и немного данных, но все таки без него как-то будет не так, думаю. Почему я так думаю — cache_db создает не только файл кэша с массивом элементов таблицы, но и создает кэш-файлы для каждого значения, почти так же, как сам MODx создает свой кэш для ресурсов. Это из наблюдений и поверхностного анализа XPDO кэша, модкэшменеджера и работы кэширования процессорами ресурсов. Но я не претендую на знатока вопроса.            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.