在CakePHP中使用TranslateBehavior可以通过以下步骤:
vendors/packages/translator/src/Behavior/
目录,并在TranslateBehavior.php
文件中复制并粘贴以下代码:<?php namespace Cake\ORM\Behavior;
use ArrayObject;
use Cake\Cache\CacheTrait;
use Cake\Core\Configure;
use Cake\Event\EventInterface;
use Cake\ORM\Query;
use Cake\ORM\Table;
use Cake\Validation\Validator;
use Psr\Log\LoggerInterface;
class TranslateBehavior extends \Cake\ORM\Behavior\PolymorphicActiveRecordInterface
{
use CacheTrait;
public const T_UNSET = null;
public const T_INT = 'integer';
public const T_FLOAT = 'float';
public const T_STRING = 'string';
public const T_BOOL = 'boolean';
public const T_BOOL\_FALSE = '0';
public const T_BOOL\_TRUE = '1';
/**
* The model name.
*
* @var string
*/
protected $_model;
public function load(array $config)
{
$config = array_merge([
'tables' => [],
'event' => 'Model.initialize',
'class' => $this->_model,
], $config);
if (isset($config['fields'])) {
if (!is_array($config['fields'])) {
$config['fields'] = func_get_args();
}
} else {
$config['fields'] = func_num_args() === 0 ? ['created', 'updated'] : func_get_args();
}
$this->__configure($config);
$this->__config('cache', $config, function () {
return Configure::write('TranslateBehavior.cache');
});
}
public function beforeSave(EventInterface $event, Validator $validator)
{
if (!$this->isNewRecord($event) && $this->getProperty('id')) {
$query = $this->getOriginalEntity() ? : new Query($event->getData());
$query->select('value');
$this->{$this->name} = $query->first();
}
}
public function beforeDelete(EventInterface $event, Validator $validator)
{
if (!$this->isNewRecord($event) && $this->getProperty('id')) {
$query = $this->getOriginalEntity() ? : new Query($event->getData());
$query->select('value');
$this->{$this->name} = $query->first();
}
}
public function afterSave(EventInterface $event)
{
$entity = $this->entity();
$config = $this->get('TranslateBehavior.'.$entity);
if (empty($config)) {
return;
}
if (!empty($this->{$this->name})) {
$langcode = $this->{$this->name}['langcode'];
$langdir = \Locale::getLanguageDirection(\Locale::getId(\Config::get(\Cake\Core\Configure::read('App.locale'))));
foreach ($config as $key => $value) {
if (is_string($value['translate']) && preg_match('/^lang(\d+)\.(.*)$/', $value['name'], $matches)) {
$value['id'] = $matches[2] === '1' ? self::T_SET : self::T_Unset;
}
if (is_array($value['default'])) {
foreach ($value['default'] as $defaultValue) {
$this->{$key} = $defaultValue;
if ($langcode !== $entity->{$key}) {
$this->{$key} = str_ireplace(':langcode:', $entity->{$key}, $value['default'][$langcode]);
}
$this->{$key} = $this->{$key}()
领取专属 10元无门槛券
手把手带您无忧上云