Drupal 7 开发内部培训资料, 分头诗人

d8的目录结构、自动加载及使用自动加载的方式加载第三方库

上周没写,主要是忙了点

d8的目录结构已经有很多人都说了,不在重复他们说过的东西了,只说几个自己的东西,而自己这些都用到了drupal的自动加载

回顾下上次说的那一部分

//看着这行代码
$autoloader = require_once 'autoload.php';
//打开文件,后又是一个包含,继续打开
return require __DIR__ . '/vendor/autoload.php';
 
//注意composer,这个东西,这是一个php管理工具
<?php
 
// autoload.php @generated by Composer
 
require_once __DIR__ . '/composer' . '/autoload_real.php';
 
return ComposerAutoloaderInitDrupal8::getLoader();

d8使用了composer进行自动加载。

composer 这个php管理工具有很多框架都在使用,yii2,d8,symfony等等都在用。

这个自动加载有5种方式,如果你添加了一个新的类库,可以使用其中任意一种,这4种方式分别为class_map,files,namespace,psr4.对应composer文件夹下的autoloder_*.php文件

我只熟悉prs4,其他的没仔细看,有兴趣的朋友看了,可以给我讲讲

psr4是一种标准与其对应的是之前的psr0标准,psr4定义存放目录的方式为,当然这些也没有什么意义,可以作为了解内容。

d8的入口文件及引申

d8入口文件

<?php

/**
 * @file
 * The PHP page that serves all page requests on a Drupal installation.
 *
 * All Drupal code is released under the GNU General Public License.
 * See COPYRIGHT.txt and LICENSE.txt files in the "core" directory.
 */
//使用了两个命名空间,有什么作用呢,后面auto会用到。
use Drupal\Core\DrupalKernel;
use Symfony\Component\HttpFoundation\Request;
// 包含自动加载文件
$autoloader = require_once 'autoload.php';
// 创建一个DrupalKernel对象
$kernel = new DrupalKernel('prod', $autoloader);
//获取请求
$request = Request::createFromGlobals();
//处理对请求处理
$response = $kernel->handle($request);
//向浏览器发出回应
$response->send();
//事件监听,监听整个请求和回应的过程
$kernel->terminate($request, $response);

这一整套流程其实就是Symfony的运行机制

当然为了更好的了解这个运行过程,从网上找了个图片下

其实这里可以用自己的理解方式来理解上述问题,我做了如下方式,当然这只是粗糙的思路,并不是完美的代码

打算使用symfony,系统的搞一搞drupal8

据说drupal8是用symfony写的,不要问我是据说说的,我也是听说的。最近接触了下symfony2做的开源程序,感觉symfony2有点意思,打算从头系统的学下symfony,然后源码分析下drupal8.当然一切都是建立在drupal8是用symfony写的,这一基础上。

争取每星期搞出一篇blog出来

drupal自定汉化

drupal汉化的方式教程已经说过了,说下自定义汉化,但是仍然有很多没有汉化的字符,这些可能是来自第三方的,也有可能是不需要汉化的。这时候需要我们自己汉化了

例如我在编辑页面加了个保存草稿,和保存对于客户来说概念上不好区分,因为他们发表文章需要审核,所以要改为提交,还有列表页的新建提示的红字不好看,改回原来的new

新建一个后缀名为.po的文件例如drupal-tying.zh-hans.po

然后里面添加代码 

msgid "Save configuration"
msgstr "保存"
msgid "Save"
msgstr "提交"
msgid "Participants"
msgstr "发信人"
msgid "Last Updated"
msgstr "发送时间"
msgid "new"
msgstr "new"
msgid "Actions..."
msgstr "操作"

msgid "英文需要翻译字符“
msgstr   ”翻译后字符“

在dupal中只有t()函数里面的字符可以翻译

drupal与普通编程的相同之处

说说drupal的开发的一些想法。

可以吧drupal看做一个集成了大量api的框架

当然有很多东西必须是必须要用的,例如hook_memu,drupal表单、数据库操作函数、权限处理

很多东西不是必须要用,可以直接使用我们常用的php文件,例如自定义模板,当然对已这个框架来说需要记住的api太多了

这么说可能不是很直观,举个例子吧

/*
 *hook_menu
 *这个函数对于有一些需要自定义的页面的人来说是必须的,例如我想做一个提供接口的api给其他程序
 *
 *user_is_logged_in() 这个是判断用户是否为登陆,drupal定义函数,登陆返回true,否则为ffalse,
 *通过这里我们可以根据需求自定义访问的权限,当然不是drupal的方式,但是他可以实现一些需求,drupal的方式通过hook_permission()
 */
function hook_menu(){
    $items['test']=array(
        'title'=>t('_test_hello'),
        'page callback' => '_test',//页面调用函数
        'access callback' => user_is_logged_in(),//如果全部用户可以反问可以为true
    );
    return $items;
}
function _test_hello(){
  $output = "hello word!";
  return $output;
}
?>

访问localhost/drupal/test, 发现hello word! 出现在了前台的内容页面,当然这个只是最简单的例子,但是对于编程来说这是一种方式,假设当views没有开发出来的的时候,我需要在_test_hello()中操作数据库,这是最原始的解决方法,对于views出现之后,对drupaler来说这也是不推荐的,随便在数据库里面新建个表article吧,然后字段随便建几个和node相同吧,多个nid和node以便关联,既可以修改了

drupal8初探,d8和d7关于模块通用的方式

drupal8的bate版本出来了,据说d8手册已经出来了,在百度上面搜了下没有找到 ,T-T,唉,只能自己没事瞎琢磨了

这些只是自己瞎猜测的没有进行实践

发现目录结构变化了很多,网站的theme和module该到了根目录themes和modules里面。 同时兼容d7的方式sites/all/的方式

在sites下的readme 是这么说的,大意差不多

This directory structure contains the settings and configuration files specific
to your site or sites and is an integral part of multisite configurations.

It is now recommended to place your custom and downloaded extensions in the
/modules, /themes, and /profiles directories located in the Drupal root. The
sites/all/ subdirectory structure, which was recommended in previous versions
of Drupal, is still supported.

See core/INSTALL.txt for information about single-site installation or
multisite configuration.

关于模块

然后看了下d8的模块目录,看了下dblog模块,发现这个就是watchdog的记录插入数据库方式

name.module文件最醒目,和d7差不多

订阅 RSS - tying的博客