CakePHP 3.x - 根据区域设置获取数据库字段

时间:2015-07-09 12:41:23

标签: cakephp internationalization translation locale cakephp-3.0

我开发了一个多语言网站。它在数据库中同时使用了4种以上的语言。它始终遵循以下方案: field_%郎%

  

离。 id | title_en | title_de | description_en | description_de

因为它非常简单,我想写一个我可以在控制器和视图中使用的函数(全局实体?),以保持我的代码DRY。

//function
public function __($field, $language = null){

    if( $language === null ){

        list( $language ) = split('_', I18n::Locale());

    }

    $newField = $field . '_' . strtolower( $language );

    if( $this->has( $newField ) ){
        return $this->{ $newField };
    }else{
        throw new NotFoundException('Could not find "' . $newField . '" field');
    }

}

//usage
$result->__('title'); //returns title_en depending on Locale
$result->__('title', 'de'); //always returns title_de

问题是我不知道在没有制动惯例的情况下在哪里实施它。我在考虑实体,但据我所知,没有"全球"适用于所有模型的实体?

欢迎所有的想法和建议!

麦克

1 个答案:

答案 0 :(得分:2)

AppEntity是所有实体的基类,你不会修改内置的CakePHP类,但没有什么能阻止你创建自己的超类。

我们称之为AppEntity.php,只需在src/Model/Entity下创建一个<?php namespace App\Model\Entity; use Cake\I18n\I18n; use Cake\Network\Exception\NotFoundException; class AppEntity extends \Cake\ORM\Entity { public function __($field, $language = null){ if( $language === null ){ list( $language ) = split('_', I18n::Locale()); } $newField = $field . '_' . strtolower( $language ); if( $this->has( $newField ) ){ return $this->{ $newField }; }else{ throw new NotFoundException('Could not find "' . $newField . '" field'); } } } 文件并将您的代码放入其中:

\Cake\ORM\Entity

然后,当您创建实体类时,不是扩展AppEntity而是扩展<?php namespace App\Model\Entity; class User extends AppEntity { } ; ?>

char readrc(char* array, int r, int c, int n, int m)
{
   return (r > 0 && r <= n && c > 0 && c <= m) ?
                  array[n * (r - 1) + (c - 1)] : '\0';
}

void read_down_right(char* array, int n, int m, vector<string>& list)
{
   for (int sc = 2 - n; sc <= m - 1; sc++)
   {  
      string str = "";
      for (int r = 1, c = sc; r <= n; r++, c++)
      {
         char chr = readrc(array, r, c, n, m);
         if (chr != '\0')
            str += chr;
      }
      list.push_back(str);
   }
}

void read_down_left(char* array, int n, int m, vector<string>& list)
{
   for (int sc = 2; sc <= m + n - 2; sc--)
   { 
      string str = "";
      for (int r = 1, c = sc; r <= n; r++, c--)
      {
         char chr = readrc(array, r, c, n, m);
         if (chr != '\0')
            str += chr;
      }
      list.push_back(str);
   }
}