云客Drupal源码分析之实体Entity(五)内容实体基类

源码分析重点在于在自己的大脑中重现开发者的思维过程,内容实体基类是drupal中很大的一个类,她要处理众多的问题,内容实体的大多数功能都集中在这里,开发者有许多的考虑,要弄清楚她的所有细节,学习者可能会觉得有些困难,这时需要明白任何复杂庞大的事物都是一步步累积发展起来的,初遇的学习者只看到了她的结果,没有看到她的演化历程,所以有这样的感觉很正常,开发者也不是一步到位的,而是从简单到复杂、反复迭代加校正而来,我们由简入深来介绍她。

内容实体基类完成了内容实体的主要功能,具体的内容实体继承她后只需要写少量代码即可使用,不论内容实体类型是否为可版本化的,内容实体类只接受某个版本或默认版本的全部翻译数据,包括源语言,关键词是“一个版本”“全部翻译”,该基类可以为不同语言克隆自己,这些克隆出的实体又关联在一起,这用到了以下设计模式。


设计模式:

为了处理翻译问题,内容实体基类使用了一种少见的设计模式,这是该类的主要运作骨架,明白了这个模式就好理解该基类了,为此云客写了段简化代码用以学习者研究该模式,可以称这个模式叫做多实例共享属性模式、连体模式、分身模式等等,名字是次要的,原理才是主要的,代码见下:

 

<?php
class yunke
{
    public $values = []; //用于存放变量
    public $activeLangcode = "en";  //当前语言
    public $defaultLangcode = "en"; //建立对象时的源语言
    public $translations; //各个翻译对象

    public function __construct($langcode = NULL)
    {
        if (empty($langcode)) {
            $langcode = "en";
        }
        $this->activeLangcode = $langcode;  //设置当前语言
        $this->defaultLangcode = $langcode; //标记源语言
    }

    public function get($key)
    {
        if (isset($this->values[$key][$this->activeLangcode])) {
            return $this->values[$key][$this->activeLangcode];
        }
        return isset($this->values[$key][$this->defaultLangcode]) ? $this->values[$key][$this->defaultLangcode] : NULL;
    }

    public function set($key, $value, $isTranslatable = true)
    {
        if ($isTranslatable) {
            $this->values[$key][$this->activeLangcode] = $value;
            if (!isset($this->values[$key][$this->defaultLangcode])) {
                $this->values[$key][$this->defaultLangcode] = $value;
            }
        } else {
            $this->values[$key][$this->defaultLangcode] = $value;
        }
        return $this;
    }

    public function getTranslation($langcode)
    {
        if (isset($this->translations[$langcode])) {
            return $this->translations[$langcode];
        }
        if ($langcode == $this->activeLangcode) {
            $this->translations[$langcode] = $this;
            return $this;
        }
        return $this->initializeTranslation($langcode);
    }

    public function initializeTranslation($langcod
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值