On this page
Class ShadowTableStrategy
This class provides a way to translate dynamic data by keeping translations in a separate shadow table where each row corresponds to a row of primary table.
Property Summary
-
$_config protected
array<string, mixed>Runtime config
-
$_configInitialized protected
boolWhether the config property has already been configured with defaults
-
$_defaultConfig protected
array<string, mixed>Default config
-
$_tableLocator protected
Cake\ORM\Locator\LocatorInterface|nullTable locator instance
-
$defaultTable protected
string|nullThis object's default table alias.
-
$locale protected
string|nullThe locale name that will be used to override fields in the bound table from the translations table
-
$table protected
Cake\ORM\TableTable instance
-
$translationTable protected
Cake\ORM\TableInstance of Table responsible for translating
Method Summary
__construct() public
Constructor
_configDelete() protected
Deletes a single config key.
_configRead() protected
Reads a config key.
_configWrite() protected
Writes a config key.
addFieldsToQuery() protected
Add translation fields to query.
afterSave() public
Unsets the temporary
_i18nproperty after the entity has been savedbeforeFind() public
Callback method that listens to the
beforeFindevent in the bound table. It modifies the passed query by eager loading the translated fields and adding a formatter to copy the values into the main table records.beforeSave() public
Modifies the entity before it is saved so that translated fields are persisted in the database too.
buildMarshalMap() public
Build a set of properties that should be included in the marshalling process.
bundleTranslatedFields() protected
Helper method used to generated multiple translated field entities out of the data found in the
_translationsproperty in the passed entity. The result will be put into its_i18nproperty.configShallow() public
Merge provided config with existing config. Unlike
config()which does a recursive merge for nested keys, this method does a simple merge.fetchTable() public
Convenience method to get a table instance.
getConfig() public
Returns the config.
getConfigOrFail() public
Returns the config for this specific key.
getLocale() public
Returns the current locale.
getTableLocator() public
Gets the table locator.
getTranslationTable() public
Return translation table instance.
groupTranslations() public
Modifies the results from a table find in order to merge full translation records into each entity under the
_translationskey.iterateClause() protected
Iterate over a clause to alias fields.
mainFields() protected
Lazy define and return the main table fields.
rowMapper() protected
Modifies the results from a table find in order to merge the translated fields into each entity for a given locale.
setConfig() public
Sets the config.
setLocale() public
Sets the locale to be used.
setTableLocator() public
Sets the table locator.
setupAssociations() protected
Create a hasMany association for all records.
setupHasOneAssociation() protected
Create a hasOne association for record with required locale.
translatedFields() protected
Lazy define and return the translation table fields.
translationField() public
Returns a fully aliased field name for translated fields.
traverseClause() protected
Traverse over a clause to alias fields.
unsetEmptyFields() protected
Unset empty translations to avoid persistence.
Method Detail
__construct() public
__construct(Cake\ORM\Table $table, array<string, mixed> $config = [])
Constructor
Parameters
Cake\ORM\Table$table-
Table instance.
array<string, mixed>$config optional-
Configuration.
_configDelete() protected
_configDelete(string $key): void
Deletes a single config key.
Parameters
string$key-
Key to delete.
Returns
voidThrows
Cake\Core\Exception\CakeExceptionif attempting to clobber existing config
_configRead() protected
_configRead(string|null $key): mixed
Reads a config key.
Parameters
string|null$key-
Key to read.
Returns
mixed_configWrite() protected
_configWrite(array<string, mixed>|string $key, mixed $value, string|bool $merge = false): void
Writes a config key.
Parameters
array<string, mixed>|string$key-
Key to write to.
mixed$value-
Value to write.
string|bool$merge optional-
True to merge recursively, 'shallow' for simple merge, false to overwrite, defaults to false.
Returns
voidThrows
Cake\Core\Exception\CakeExceptionif attempting to clobber existing config
addFieldsToQuery() protected
addFieldsToQuery(Cake\ORM\Query $query, array<string, mixed> $config): bool
Add translation fields to query.
If the query is using autofields (directly or implicitly) add the main table's fields to the query first.
Only add translations for fields that are in the main table, always add the locale field though.
Parameters
Cake\ORM\Query$query-
The query to check.
array<string, mixed>$config-
The config to use for adding fields.
Returns
boolafterSave() public
afterSave(Cake\Event\EventInterface $event, Cake\Datasource\EntityInterface $entity): void
Unsets the temporary _i18n property after the entity has been saved
Parameters
Cake\Event\EventInterface$event-
The beforeSave event that was fired
Cake\Datasource\EntityInterface$entity-
The entity that is going to be saved
Returns
voidbeforeFind() public
beforeFind(Cake\Event\EventInterface $event, Cake\ORM\Query $query, ArrayObject $options): void
Callback method that listens to the beforeFind event in the bound table. It modifies the passed query by eager loading the translated fields and adding a formatter to copy the values into the main table records.
Parameters
Cake\Event\EventInterface$event-
The beforeFind event that was fired.
Cake\ORM\Query$query-
Query.
ArrayObject$options-
The options for the query.
Returns
voidbeforeSave() public
beforeSave(Cake\Event\EventInterface $event, Cake\Datasource\EntityInterface $entity, ArrayObject $options): void
Modifies the entity before it is saved so that translated fields are persisted in the database too.
Parameters
Cake\Event\EventInterface$event-
The beforeSave event that was fired.
Cake\Datasource\EntityInterface$entity-
The entity that is going to be saved.
ArrayObject$options-
the options passed to the save method.
Returns
voidbuildMarshalMap() public
buildMarshalMap(Cake\ORM\Marshaller $marshaller, array $map, array<string, mixed> $options): array
Build a set of properties that should be included in the marshalling process.
Add in _translations marshalling handlers. You can disable marshalling of translations by setting 'translations' => false in the options provided to Table::newEntity() or Table::patchEntity().
Parameters
Cake\ORM\Marshaller$marshallerarray$maparray<string, mixed>$options
Returns
arraybundleTranslatedFields() protected
bundleTranslatedFields(Cake\Datasource\EntityInterface $entity): void
Helper method used to generated multiple translated field entities out of the data found in the _translations property in the passed entity. The result will be put into its _i18n property.
Parameters
Cake\Datasource\EntityInterface$entity-
Entity.
Returns
voidconfigShallow() public
configShallow(array<string, mixed>|string $key, mixed|null $value = null): $this
Merge provided config with existing config. Unlike config() which does a recursive merge for nested keys, this method does a simple merge.
Setting a specific value:
$this->configShallow('key', $value);
Setting a nested value:
$this->configShallow('some.nested.key', $value);
Updating multiple config settings at the same time:
$this->configShallow(['one' => 'value', 'another' => 'value']);
Parameters
array<string, mixed>|string$key-
The key to set, or a complete array of configs.
mixed|null$value optional-
The value to set.
Returns
$thisfetchTable() public
fetchTable(string|null $alias = null, array<string, mixed> $options = []): Cake\ORM\Table
Convenience method to get a table instance.
Parameters
string|null$alias optional-
The alias name you want to get. Should be in CamelCase format. If
nullthen the value of $defaultTable property is used. array<string, mixed>$options optional-
The options you want to build the table with. If a table has already been loaded the registry options will be ignored.
Returns
Cake\ORM\TableThrows
Cake\Core\Exception\CakeExceptionIf `$alias` argument and `$defaultTable` property both are `null`.
See Also
getConfig() public
getConfig(string|null $key = null, mixed $default = null): mixed
Returns the config.
Usage
Reading the whole config:
$this->getConfig();
Reading a specific value:
$this->getConfig('key');
Reading a nested value:
$this->getConfig('some.nested.key');
Reading with default value:
$this->getConfig('some-key', 'default-value');
Parameters
string|null$key optional-
The key to get or null for the whole config.
mixed$default optional-
The return value when the key does not exist.
Returns
mixedgetConfigOrFail() public
getConfigOrFail(string $key): mixed
Returns the config for this specific key.
The config value for this key must exist, it can never be null.
Parameters
string$key-
The key to get.
Returns
mixedThrows
InvalidArgumentExceptiongetLocale() public
getLocale(): string
Returns the current locale.
If no locale has been explicitly set via setLocale(), this method will return the currently configured global locale.
Returns
stringSee Also
\Cake\ORM\Behavior\TranslateBehavior::setLocale()
getTableLocator() public
getTableLocator(): Cake\ORM\Locator\LocatorInterface
Gets the table locator.
Returns
Cake\ORM\Locator\LocatorInterfacegetTranslationTable() public
getTranslationTable(): Cake\ORM\Table
Return translation table instance.
Returns
Cake\ORM\TablegroupTranslations() public
groupTranslations(Cake\Datasource\ResultSetInterface $results): Cake\Collection\CollectionInterface
Modifies the results from a table find in order to merge full translation records into each entity under the _translations key.
Parameters
Cake\Datasource\ResultSetInterface$results-
Results to modify.
Returns
Cake\Collection\CollectionInterfaceiterateClause() protected
iterateClause(Cake\ORM\Query $query, string $name = '', array<string, mixed> $config = []): bool
Iterate over a clause to alias fields.
The objective here is to transparently prevent ambiguous field errors by prefixing fields with the appropriate table alias. This method currently expects to receive an order clause only.
Parameters
Cake\ORM\Query$query-
the query to check.
string$name optional-
The clause name.
array<string, mixed>$config optional-
The config to use for adding fields.
Returns
boolmainFields() protected
mainFields(): array<string>
Lazy define and return the main table fields.
Returns
array<string>rowMapper() protected
rowMapper(Cake\Datasource\ResultSetInterface $results, string $locale): Cake\Collection\CollectionInterface
Modifies the results from a table find in order to merge the translated fields into each entity for a given locale.
Parameters
Cake\Datasource\ResultSetInterface$results-
Results to map.
string$locale-
Locale string
Returns
Cake\Collection\CollectionInterfacesetConfig() public
setConfig(array<string, mixed>|string $key, mixed|null $value = null, bool $merge = true): $this
Sets the config.
Usage
Setting a specific value:
$this->setConfig('key', $value);
Setting a nested value:
$this->setConfig('some.nested.key', $value);
Updating multiple config settings at the same time:
$this->setConfig(['one' => 'value', 'another' => 'value']);
Parameters
array<string, mixed>|string$key-
The key to set, or a complete array of configs.
mixed|null$value optional-
The value to set.
bool$merge optional-
Whether to recursively merge or overwrite existing config, defaults to true.
Returns
$thisThrows
Cake\Core\Exception\CakeExceptionWhen trying to set a key that is invalid.
setLocale() public
setLocale(string|null $locale): $this
Sets the locale to be used.
When fetching records, the content for the locale set via this method, and likewise when saving data, it will save the data in that locale.
Note that in case an entity has a _locale property set, that locale will win over the locale set via this method (and over the globally configured one for that matter)!
Parameters
string|null$locale-
The locale to use for fetching and saving records. Pass
nullin order to unset the current locale, and to make the behavior fall back to using the globally configured locale.
Returns
$thissetTableLocator() public
setTableLocator(Cake\ORM\Locator\LocatorInterface $tableLocator): $this
Sets the table locator.
Parameters
Cake\ORM\Locator\LocatorInterface$tableLocator-
LocatorInterface instance.
Returns
$thissetupAssociations() protected
setupAssociations(): void
Create a hasMany association for all records.
Don't create a hasOne association here as the join conditions are modified in before find - so create/modify it there.
Returns
voidsetupHasOneAssociation() protected
setupHasOneAssociation(string $locale, ArrayObject $options): void
Create a hasOne association for record with required locale.
Parameters
string$locale-
Locale
ArrayObject$options-
Find options
Returns
voidtranslatedFields() protected
translatedFields(): array<string>
Lazy define and return the translation table fields.
Returns
array<string>translationField() public
translationField(string $field): string
Returns a fully aliased field name for translated fields.
If the requested field is configured as a translation field, field with an alias of a corresponding association is returned. Table-aliased field name is returned for all other fields.
Parameters
string$field-
Field name to be aliased.
Returns
stringtraverseClause() protected
traverseClause(Cake\ORM\Query $query, string $name = '', array<string, mixed> $config = []): bool
Traverse over a clause to alias fields.
The objective here is to transparently prevent ambiguous field errors by prefixing fields with the appropriate table alias. This method currently expects to receive a where clause only.
Parameters
Cake\ORM\Query$query-
the query to check.
string$name optional-
The clause name.
array<string, mixed>$config optional-
The config to use for adding fields.
Returns
boolunsetEmptyFields() protected
unsetEmptyFields(Cake\Datasource\EntityInterface $entity): void
Unset empty translations to avoid persistence.
Should only be called if $this->_config['allowEmptyTranslations'] is false.
Parameters
Cake\Datasource\EntityInterface$entity-
The entity to check for empty translations fields inside.
Returns
voidProperty Detail
$_config protected
Runtime config
Type
array<string, mixed>$_configInitialized protected
Whether the config property has already been configured with defaults
Type
bool$_defaultConfig protected
Default config
These are merged with user-provided configuration.
Type
array<string, mixed>$_tableLocator protected
Table locator instance
Type
Cake\ORM\Locator\LocatorInterface|null$defaultTable protected
This object's default table alias.
Type
string|null$locale protected
The locale name that will be used to override fields in the bound table from the translations table
Type
string|null$table protected
Table instance
Type
Cake\ORM\Table$translationTable protected
Instance of Table responsible for translating
Type
Cake\ORM\Table© 2005–present The Cake Software Foundation, Inc.
Licensed under the MIT License.
CakePHP is a registered trademark of Cake Software Foundation, Inc.
We are not endorsed by or affiliated with CakePHP.
https://api.cakephp.org/4.4/class-Cake.ORM.Behavior.Translate.ShadowTableStrategy.html