Drupal如何更新注册表?
如何 更新 注册表 Drupal
2023-09-11 14:16:42 时间
Drupal的注册表是指registry和registry_file两个数据表。前一个表保存所有可用的类和接口以及它们所对应的文件,后一个表保存每个文件的hash码。
1. 将所有需要更新的文件都汇总的$files数组:
// 需要更新的文件有两部分:一是系统includes目录下所有的.inc文件,二是模块描述文件中通过files属性声明的文件。 $files = array(); $modules = db_query("SELECT * FROM {system} WHERE type = 'module'")->fetchAll(); foreach ($modules as &$module) { $module->info = unserialize($module->info); $dir = dirname($module->filename); $module->dir = $dir; if ($module->status) { foreach ($module->info['files'] as $file) { $files["$dir/$file"] = array('module' => $module->name, 'weight' => $module->weight); } } } foreach (file_scan_directory('includes', '/\.inc$/') as $filename => $file) { $files["$filename"] = array('module' => '', 'weight' => 0); }
2. 更新$files数组的hash属性:
foreach (db_query("SELECT * FROM {registry_file}")->fetchAllAssoc('filename', PDO::FETCH_ASSOC) as $filename => $file) { // Add the hash for those files we have already parsed. if (isset($files[$filename])) { $files[$filename]['hash'] = $file['hash']; } else { // Flush the registry of resources in files that are no longer on disc // or are in files that no installed modules require to be parsed. db_delete('registry') ->condition('filename', $filename) ->execute(); db_delete('registry_file') ->condition('filename', $filename) ->execute(); } }
3. 更新registry和registry_file表:
$parsed_files = array(); // 重新计算每个文件的Hash码 foreach ($files as $filename => $file) { if (file_exists($filename)) { $hash = hash_file('sha256', $filename); if (empty($file['hash']) || $file['hash'] != $hash) { $file['hash'] = $hash; $parsed_files[$filename] = $file; } } } foreach ($parsed_files as $filename => $file) { // 搜索文件中的类和接口 if (preg_match_all('/^\s*(?:abstract|final)?\s*(class|interface)\s+([a-zA-Z0-9_]+)/m', file_get_contents($filename), $matches)) { foreach ($matches[2] as $key => $name) { // 将类和接口名称更新到registry表 db_merge('registry') ->key(array( 'name' => $name, 'type' => $matches[1][$key], )) ->fields(array( 'filename' => $filename, 'module' => $module, 'weight' => $weight, )) ->execute(); } // Delete any resources for this file where the name is not in the list // we just merged in. db_delete('registry') ->condition('filename', $filename) ->condition('name', $matches[2], 'NOT IN') ->execute(); } // 更新registry_file表 db_merge('registry_file') ->key(array('filename' => $filename)) ->fields(array( 'hash' => $file['hash'], )) ->execute(); }
所以,模块安装时,让Drupal自动更新注册表的关键是要在.info文件中注明files属性。例如,comment模块的.info文件就是这样写的:
name = Comment description = Allows users to comment on and discuss published content. package = Core version = VERSION core = 7.x dependencies[] = text files[] = comment.module files[] = comment.test configure = admin/content/comment stylesheets[all][] = comment.css
相关文章
- Unity3D热更新全书-何谓热更新,为何热更新,如何热更新
- Windows用户如何搭建WordPress博客站点,并发布到公网可访问?
- Word控件Spire.Doc 【表单域】教程(五):如何在 C# 中更新 Ask 字段
- Google Earth Engine(GEE)——如何在线计算NDVI(归一化植被指数)和FVC(植被覆盖度)并批量下载
- c++中enum 如何使用
- redhat 7.6下如何更新YUM源(仓库)?
- linux下如何更新当前的容器镜像?
- 使用EF Model First创建edmx模型,数据库有数据的情况下,如何同时更新模型和数据库
- 【C-文件操作】一文教你如何将代码的数据持久化
- 【Account Kit】如何解决使用Flutter插件集成华为帐号在升级版本时报错:请集成华为HMS版本更新(checkUpdate)?
- ffmpeg用法及如何使用fluent-ffmpeg
- 程序员副业赚钱之我是如何通过编程实现财务独立的
- 如何为 Linux 放弃 Windows
- github 下fork后如何同步源的新更新内容
- 林更新、杨幂带货,2000元一双的小白鞋如何在天猫走红
- 科普篇:家中光纤宽带上网如何快速提高网速(如何提高家中千兆宽带10倍的实际上网速度?)
- 浅析如何保证缓存与数据库的双写一致性:4种更新缓存的设计模式理解
- 【Account Kit】如何解决使用Flutter插件集成华为帐号在升级版本时报错:请集成华为HMS版本更新(checkUpdate)?
- 【AGC】【云函数】云函数如何更新
- 【快应用】快应用中如何实现tab页面切换时更新tab样式?
- 如何在存储过程中实现插入更新数据
- 【基本优化实践】【1.5】如何在线稳定的删除/更新大量数据?
- 如何创建可扩展表视图中的iOS 学习和拓展优化(有待更新)
- c#-中如何退出程序后自动重新启动程序
- NoteExpress 章节合并后如何更新参考文献列表?
- 怎样处理Win10自动更新?如何取消?
- 如何使用树莓派自制网络监视器