首页 文章

Drupal如何工作? [关闭]

提问于
浏览
149

有人可以提供Drupal 7控制流程的架构概述吗?也许是关于如何生成页面的流程图 . 关于Drupal如何工作,您建议咨询哪些额外资源?

9 回答

  • 7

    http://drupal.org/handbooks

    阅读手册,尤其是主题开发人员指南 . Drupal支持几个主题引擎 . Zen使用phptemplate,所以要注意指南的那一部分 .

    对于模块开发,API在api.drupal.org中有记录 .

    特别是当你需要快速和快速地获取信息时http://www-128.ibm.com/developerworks/ibm/osource/implement.html

  • 4

    Drupal在这方面可能令人困惑,部分原因是因为它具有相对较深的函数堆栈 . 虽然它在其架构中驱动了纯粹的事件/监听器,但主PHP脚本中没有简单的"flow"供您查看 . 我最近做了a presentation on this very subject,幻灯片发布在slideshare上,但快速的高级摘要可能很有用 .

    • Drupal的index.php文件作为前端控制器 . 所有页面都通过它传送,用户请求的"actual" url / path作为参数传递给index.php .

    • Drupal的路径路由器系统(MenuAPI)用于匹配给定插件模块的请求路径 . 该插件模块负责构建页面的"primary content" .

    • 构建主页面内容后,index.php调用theme('page',$ content),将内容交给包含在sidebars / headers / widgets / etc中的Drupal 's theming/skinning system. There, it' .

    • 然后将呈现的页面交还给apache,并将其发送回用户的浏览器 .

    在整个过程中,Drupal和第三方插件模块正在触发事件,并听取它们的响应 . Drupal将其称为'hook'系统,并将其称为hook_user()'s implemented using function naming conventions. The ' blog ' module, for example, can intercept ' user ' related by implementing a function named blog_user(). In Drupal parlance, that' .

    它有点笨拙,但是由于PHP的怪癖(它保留了所有加载函数的内部哈希表),它允许Drupal通过迭代已安装的插件列表来快速检查侦听器 . 对于每个插件,它可以在适当命名的模式上调用function_exists(),并在函数存在时调用该函数 . (“我正在触发'登录'事件 . 'mymodule_login'函数是否存在?我会调用它 . 你的'mymodule_login'存在吗?不行吗?'nextmodule_login'怎么样?”等等)再次,触摸笨重但是它效果很好 .

    在Drupal中发生的事情是因为其中一个事件被触发而发生的 . MenuAPI只知道不同插件模块处理的urls /路径是什么,因为它触发'menu'事件(hook_menu)并收集所有元数据插件模块响应 . ("I'll take care of the url 'news/recent', and here's the function to call when that page needs to be built...")内容仅保存,因为Drupal 's FormAPI is responsible for building a page, and fires the '表单已提交'模块响应的事件 . 每小时维护是因为hook_cron()被触发,并且任何带有mymodulename_cron()作为函数名的模块都将调用其函数 .

    其他一切最终只是细节 - 重要细节,但主题的变化 . index.php是控制器,菜单系统确定“当前页面”是什么,并且在构建该页面的过程中会触发大量事件 . 插件模块可以挂钩这些事件并更改工作流程/提供附加信息等 . 这也是众多Drupal资源专注于制作模块的部分原因 . 没有模块,Drupal实际上除了说“有人要求页面”之外什么都不做!它存在吗?没有?好的,我会提供404.'

  • 9

    Drupal Page Serving Mechanism

    要了解Drupal的工作原理,您需要了解Drupal的页面服务机制 .

    简而言之,所有的调用/ url /请求都由index.php提供,它通过包含各种包含文件/模块来加载Drupal,然后调用模块中定义的适当函数来提供请求/ url .

    以下是本书Dr Proupal Development的摘录,该书解释了Drupal的bootstrap过程,

    The Bootstrap Process

    Drupal通过一系列的bootstrap阶段在每个请求中引导自己 . 这些阶段在bootstrap.inc中定义,并按照以下部分所述进行操作 .

    Initialize Configuration

    此阶段填充Drupal的内部配置数组并 Build 站点的基本URL($ base_url) . settings.php文件通过include_once()进行解析,并应用已 Build 的任何变量或字符串覆盖 . 有关详细信息,请参阅文件sites / all / default / default.settings.php的“Variable Overrides”和“String Overrides”部分 .

    Early Page Cache

    在需要高级别可伸缩性的情况下,可能需要在甚至尝试数据库连接之前调用缓存系统 . 早期页面缓存阶段允许您包含(使用include())包含名为page_cache_fastpath()的函数的PHP文件,该函数接管并返回内容到浏览器 . 通过将page_cache_fastpath变量设置为TRUE来启用早期页面缓存,并通过将cache_inc变量设置为文件路径来定义要包含的文件 . 有关示例,请参阅有关缓存的章节 .

    Initialize Database

    在数据库阶段,确定数据库的类型,并 Build 初始连接以用于数据库查询 .

    Hostname/IP-Based Access Control

    Drupal允许基于每个主机名/ IP地址禁止主机 . 在访问控制阶段,进行快速检查以查看请求是否来自被禁止的主机;如果是,则拒绝访问 .

    Initialize Session Handling

    Drupal利用了PHP的内置会话处理功能,但是用自己的处理程序覆盖了一些处理程序来实现数据库支持的会话处理 . 会话阶段初始化或重新 Build 会话 . 表示当前用户的全局$ user对象也在此处初始化,但为了提高效率,并非所有属性都可用(在需要时通过显式调用user_load()函数添加它们) .

    Late Page Cache

    在页面缓存阶段,Drupal会加载足够的支持代码,以确定是否从页面缓存中提供页面 . 这包括将数据库中的设置合并到初始化配置阶段创建的数组中,以及加载或解析模块代码 . 如果会话指示该请求是由匿名用户发出的并且启用了页面缓存,则从缓存返回该页面并停止执行 .

    Language Determination

    在语言确定阶段,Drupal的多语言支持已初始化,并根据站点和用户设置决定使用哪种语言为当前页面提供服务 . Drupal支持多种用于确定语言支持的备选方案,例如路径前缀和域级语言协商 .

    Path

    在路径阶段,加载处理路径和路径别名的代码 . 此阶段可以解析人类可读的URL并处理内部Drupal路径缓存和查找 .

    Full

    此阶段通过加载常用函数库,主题支持以及对回调映射,文件处理,Unicode,PHP图像工具包,表单创建和处理,邮件处理,自动排序表和结果集分页的支持来完成引导过程 . 设置Drupal的自定义错误处理程序,并加载所有已启用的模块 . 最后,Drupal触发init钩子,这样模块就有机会在正式处理请求之前得到通知 .

    Drupal完成引导后,框架的所有组件都可用 . 现在是时候接受浏览器的请求并将其交给将处理它的PHP函数 . URL和处理它们的函数之间的映射是使用回调注册表完成的,该注册表负责URL映射和访问控制 . 模块使用菜单挂钩注册其回调(更多详细信息,请参阅第4章) .

    当Drupal确定存在一个回调,浏览器请求的URL成功映射到该回调并且用户有权访问该回调时,控制权将被传递给回调函数 .

    Processing a Request

    回调函数执行处理和累积完成请求所需的数据所需的任何工作 . 例如,如果收到对诸如http://example.com/q = node / 3之类的内容的请求,则URL将映射到node.module中的函数node_page_view() . 进一步处理将从数据库中检索该节点的数据并将其放入数据结构中 . 然后,是时候主题了 .

    Theming the Data

    主题涉及将已检索,操作或创建的数据转换为HTML(或XML或其他输出格式) . Drupal将使用管理员选择的主题为网页提供正确的外观 . 然后将生成的输出发送到Web浏览器(或其他HTTP客户端) .

  • 5

    伊顿的回答提供了一个很好的概述 . (我是新来的,所以我不能修改他,因此评论 . )

    对我来说,残酷的时刻是通过index.php实现一切,然后通过模块的瀑布(核心先,然后是网站) . 要扩展核心功能,请不要重写它 . 而是将模块复制到/ sites / all / modules /或/ sites / [yoursite] / modules并扩展THAT,或在这些地方创建一个新模块 . 主题相同 . 模块目录也可以包含显示代码,形式为tpl,css等 .

    如果你被使用了更严格的MVC类型框架,如Rails,Django等等,这一切都让人感到有些困惑 . 模块可以混合使用大量的显示代码,如果您正在查看其他人的模块或模板,您最终会在堆栈中向后移动 . 这就是使用PHP工作的美妙/痛苦 .

    具有讽刺意味的是,“只是构建应用程序”可能是最难学习的方法 . Drupal开箱即用,在您找出控制流程之前,它简直模糊不清 . tpl文件中没有任何内容可以告诉您具有有趣名称的函数(例如l())来自哪里 .

  • 156

    这取决于你正在寻找的理解程度;如果你对php有很好的了解,我建议你阅读代码本身,从index.php开始,然后继续阅读includes / bootstrap.inc,然后是该目录中的其他一些脚本 .

    关键包括文件:

    • menu.inc对于理解整个系统的工作原理非常重要,因为它处理了很多URL到内容的隐式映射 .

    • common.inc具有构成API基础的大多数其他神秘功能 .

    • module.inc处理伊顿提到的钩子调用

    • form.inc处理表单显示,提交和处理

    • theme.inc处理演示文稿 .

    模块/目录中还有一些关键功能;特别是,modules / node / node.module构成了节点系统的基础,通常用于封装站点内容 .

    一般来说,代码非常好评和清晰 . 在注释中使用Doxygen标记意味着代码有效地是规范文档 .

    使用可以快速跳转到函数定义的编辑器也可以做到这一点 . 将vim与ctags结合使用对我有用;你必须告诉ctags将.inc,.module等文件索引为php文件 .

  • 57

    我通过将drupal .php代码导入NetBeans项目来学习负载 . 然后,您可以运行netbeans调试器并观察页面的不同阶段 .

  • 20

    关于这个主题的最好的书籍是“Pro Drupal Development”和“Using Drupal” .

    “Pro Drupal Development”包括几个漂亮的流程图和每个Drupal的API(表单,主题等)的详尽摘要 . 它对于制作自己的模块和主题的人来说特别有启发性,但对于想要了解Drupal的普通PHP开发人员来说有很多 Value . 除此之外,我已经为我构建的每个站点创建了一个自定义模块,只是为了获得对各种形式的选择性隐藏字段等内容的额外控制(为了简化结尾的节点形式,您通常希望这样做 - 用户),所以在你的帽子下掌握这些知识是件好事 .

    “使用Drupal”是针对想要了解如何构建画廊,博客和社交网站等优秀内容的网站开发人员 . 它经历了几个用例,并展示了如何配置现有模块来完成每项工作 . 在此过程中,它使您熟悉必要的附加模块“内容构建工具包”(CCK)和“视图”,如何制作自定义块和模板,以及维护Drupal站点的细节 . 我推荐这本书特别适合那些想要加快速度并立即使用Drupal的人 . 在此过程中,您将了解Drupal的内部组织 .

  • 5

    This(对于Drupal 6)和this(对于Drupal 7)是一个非常好的drupal架构概述 . 如果你想要更多的细节,那么我会开始写一些大部分文档是好的 . 尝试以高水平的细节来学习它而没有具体的东西可以更难以尝试 .

  • 5

    这里有新的贡献者,对话迟了2年;-)

    回复https://stackoverflow.com/a/1070325/1154755

    要扩展核心功能,请不要重写它 . 而是将模块复制到/ sites / all / modules /或/ sites / [yoursite] / modules并扩展THAT,或在这些地方创建一个新模块 . 主题相同 .

    实际上,我从来没有必要复制核心模块来更新它 . Drupal Hooks应该就是您所需要的 .

    对于主题,是的,有时它是唯一的方法,但通常,你可以 Build 一个子主题来获得你需要的结果 .

相关问题