当前位置:  开发笔记 > 编程语言 > 正文

Drupal如何工作?

如何解决《Drupal如何工作?》经验,为你挑选了7个好方法。

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



1> Eaton..:

Drupal在这方面可能令人困惑,部分原因是因为它具有相对较深的函数堆栈.虽然它是程序化的PHP,但它在其体系结构中是纯粹的事件/监听器驱动,并且主PHP脚本中没有简单的"流程"供您查看.我最近做了一个关于这个主题的演示文稿,幻灯片发布在slidehare上,但快速的高级摘要可能很有用.

Drupal的index.php文件用作前端控制器.所有页面都通过它传送,用户请求的"实际"URL /路径作为参数传递给index.php.

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

构建主页面内容后,index.php调用theme('page',$ content),将内容交给Drupal的主题/皮肤系统.在那里,它包含在侧边栏/标题/小部件/等等.

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

在整个过程中,Drupal和第三方插件模块正在触发事件,并听取它们的响应.Drupal称之为'hook'系统,它是使用函数命名约定实现的.例如,"博客"模块可以通过实现名为blog_user()的函数来拦截"用户".用Drupal的说法,那叫做hook_user().

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

Drupal中发生的一切都是因为其中一个事件被解雇了.MenuAPI只知道不同插件模块处理的urls /路径,因为它触发'menu'事件(hook_menu)并收集所有元数据插件模块响应.("我将处理网址'新闻/最近',这是在需要构建页面时调用的函数...")内容只会被保存,因为Drupal的FormAPI负责构建页面,并触发"表单已提交"事件,模块可以响应.每小时维护是因为hook_cron()被触发,并且任何带有mymodulename_cron()作为函数名的模块都将调用其函数.

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


好问题.这取决于你正在调试什么.安装devel模块可以为您提供一些有用的工具.步骤(在大多数情况下)是确定哪个模块负责构建给定页面.hook_menu()将urls/paths映射到模块,这样可以提供帮助.然后确定它的菜单回调正在做什么 - 调用drupal_get_form()来构建表单,或者调用主题('some_custom_thing')来构建HTML等等.注意使用像drupal_alter()或module_invoke_all()这样的函数来触发其他事件.模块也是......
伟大的解释伊顿,谢谢你在这里闲逛.我的问题是,你如何调试所有这些,除了在每个模块中放入var_dump以找出发生了什么?

2> amitgoyal..:

Drupal页面服务机制

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

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

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

引导程序

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

初始化配置

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

早期页面缓存

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

初始化数据库

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

主机名/基于IP的访问控制

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

初始化会话处理

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

晚页缓存

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

语言决定

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

路径

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

充分

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

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

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

处理请求

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

主题数据

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



3> axoplasm..:

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

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

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

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



4> intuited..:

这取决于你正在寻找的理解程度; 如果你对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文件.



5> Ben Hammond..:

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



6> Jeremy Frenc..:

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



7> Scott Lahtei..:

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

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

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

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有