class FarmLog in farmOS 2.x
Log source from database.
Extends the Log source plugin to include source properties needed for the farmOS migration.
Plugin annotation
@MigrateSource(
id = "d7_farm_log",
source_module = "log"
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
- class \Drupal\migrate\Plugin\migrate\source\SourcePluginBase implements RollbackAwareInterface, MigrateSourceInterface
- class \Drupal\migrate\Plugin\migrate\source\SqlBase implements ContainerFactoryPluginInterface, RequirementsInterface
- class \Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase implements DependentPluginInterface uses DependencyTrait
- class \Drupal\migrate_drupal\Plugin\migrate\source\d7\FieldableEntity
- class \Drupal\log\Plugin\migrate\source\d7\Log
- class \Drupal\farm_migrate\Plugin\migrate\source\d7\FarmLog uses FarmQuickEntity
- class \Drupal\log\Plugin\migrate\source\d7\Log
- class \Drupal\migrate_drupal\Plugin\migrate\source\d7\FieldableEntity
- class \Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase implements DependentPluginInterface uses DependencyTrait
- class \Drupal\migrate\Plugin\migrate\source\SqlBase implements ContainerFactoryPluginInterface, RequirementsInterface
- class \Drupal\migrate\Plugin\migrate\source\SourcePluginBase implements RollbackAwareInterface, MigrateSourceInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of FarmLog
File
- modules/
core/ migrate/ src/ Plugin/ migrate/ source/ d7/ FarmLog.php, line 23
Namespace
Drupal\farm_migrate\Plugin\migrate\source\d7View source
class FarmLog extends Log {
use FarmQuickEntity;
/**
* {@inheritdoc}
*/
public function prepareRow(Row $row) {
$result = parent::prepareRow($row);
if (!$result) {
return FALSE;
}
// Prepare movement information.
$this
->prepareMovement($row);
// Prepare group assignment information.
$this
->prepareGroup($row);
// Prepare quantity information.
$this
->prepareQuantity($row);
// Prepare soil test information (only applicable to soil test logs).
$this
->prepareSoilTest($row);
// Prepare reference to the quick form that created this entity.
$this
->prepareQuickEntityRow($row, 'log');
// Return success.
return TRUE;
}
/**
* Prepare a log's movement information.
*
* @param \Drupal\migrate\Row $row
* The row object.
*/
protected function prepareMovement(Row $row) {
$id = $row
->getSourceProperty('id');
// Determine if we will allow overwriting "Areas" and "Geometry" fields on
// the log with "Move to" and "Movement geometry" fields.
$allow_overwrite = Settings::get('farm_migrate_allow_movement_overwrite', FALSE);
// By default, logs are not movements.
$is_movement = FALSE;
// Get movement field values.
$movement_values = $this
->getFieldValues('log', 'field_farm_movement', $id);
// If the log has a movement, load the Field Collection.
if (!empty($movement_values)) {
// Iterate through movement field values to collect field collection item
// IDs.
$field_collection_item_ids = [];
foreach ($movement_values as $movement_value) {
if (!empty($movement_value['value'])) {
$field_collection_item_ids[] = $movement_value['value'];
}
}
// There should only be one movement field collection associated with a
// log, so take the first.
$fcid = reset($field_collection_item_ids);
// Query the movement area references.
$query = $this
->select('field_collection_item', 'fci');
$query
->leftJoin('field_data_field_farm_move_to', 'fdffmt', "fdffmt.entity_id = fci.item_id AND fdffmt.entity_type = 'field_collection_item' AND fdffmt.bundle = 'field_farm_movement' AND fdffmt.deleted = 0");
$query
->addField('fdffmt', 'field_farm_move_to_tid', 'tid');
$query
->condition('fci.item_id', $fcid);
$result = $query
->execute()
->fetchCol();
$movement_areas = FALSE;
if (!empty($result)) {
foreach ($result as $col) {
if (!empty($col)) {
$movement_areas[] = [
'tid' => $col,
];
}
}
}
// Query the movement geometry.
$query = $this
->select('field_collection_item', 'fci');
$query
->leftJoin('field_data_field_farm_geofield', 'fdffg', "fdffg.entity_id = fci.item_id AND fdffg.entity_type = 'field_collection_item' AND fdffg.bundle = 'field_farm_movement' AND fdffg.deleted = 0");
$query
->addField('fdffg', 'field_farm_geofield_geom', 'geom');
$query
->condition('fci.item_id', $fcid);
$result = $query
->execute()
->fetchField();
$movement_geometry = FALSE;
if (!empty($result)) {
$movement_geometry = [
[
'geom' => $result,
],
];
}
// Get any areas/geometry stored on the log itself.
$log_areas = $this
->getFieldValues('log', 'field_farm_area', $id);
$log_geometry = $this
->getFieldValues('log', 'field_farm_geofield', $id);
// If the log has movement areas, then the log is a movement.
if (!empty($movement_areas)) {
$is_movement = TRUE;
}
// If the log has a movement geometry, but no movement areas, throw an
// exception.
if (empty($movement_areas) && !empty($movement_geometry)) {
$message = 'Movement has a geometry but no areas (log ' . $id . ').';
$this->idMap
->saveMessage([
'id' => $id,
], $message, MigrationInterface::MESSAGE_WARNING);
}
// If the log has area references and movement areas, and they are
// different, throw an exception or print a warning, depending on whether
// or not we are allowing overwrites.
if (!empty($log_areas) && !empty($movement_areas) && $log_areas != $movement_areas) {
$message = 'Log ' . $id . ' has both area references and movement area references. See https://github.com/farmOS/farmOS/blob/2.x/docs/hosting/migration.md#movement-logs';
if (!$allow_overwrite) {
throw new MigrateException($message);
}
else {
$this->idMap
->saveMessage([
'id' => $id,
], $message, MigrationInterface::MESSAGE_WARNING);
}
}
// If the log has a geometry and a movement geometry, and they are
// different, throw an exception or print a warning, depending on whether
// or not we are allowing overwrites.
if (!empty($log_geometry[0]['geom']) && !empty($movement_geometry[0]['geom']) && $log_geometry[0]['geom'] != $movement_geometry[0]['geom']) {
$message = 'Log ' . $id . ' has both a geometry and a movement geometry. See https://github.com/farmOS/farmOS/blob/2.x/docs/hosting/migration.md#movement-logs';
if (!$allow_overwrite) {
throw new MigrateException($message);
}
else {
$this->idMap
->saveMessage([
'id' => $id,
], $message, MigrationInterface::MESSAGE_WARNING);
}
}
// If the log has movement areas, copy them to the log itself.
// This will overwrite existing area references, but an exception should
// be thrown above unless overwriting is explicitly allowed.
if (!empty($movement_areas)) {
$row
->setSourceProperty('field_farm_area', $movement_areas);
}
// If the log has a movement geometry, copy it to the log itself.
// This will overwrite an existing geometry, but an exception should
// be thrown above unless overwriting is explicitly allowed.
if (!empty($movement_geometry)) {
$row
->setSourceProperty('field_farm_geofield', $movement_geometry);
}
}
// Set the "is_movement" property for use in migrations.
$row
->setSourceProperty('is_movement', $is_movement);
}
/**
* Prepare a log's group assignment information.
*
* @param \Drupal\migrate\Row $row
* The row object.
*/
protected function prepareGroup(Row $row) {
$id = $row
->getSourceProperty('id');
// By default, logs are not group assignments.
$is_group_assignment = FALSE;
// Get membership field values.
$membership_values = $this
->getFieldValues('log', 'field_farm_membership', $id);
// If the log has a membership assignment, load the Field Collection.
if (!empty($membership_values)) {
// Iterate through membership field values to collect field collection
// item IDs.
$field_collection_item_ids = [];
foreach ($membership_values as $membership_value) {
if (!empty($membership_value['value'])) {
$field_collection_item_ids[] = $membership_value['value'];
}
}
// There should only be one membership field collection associated with a
// log, so take the first.
$fcid = reset($field_collection_item_ids);
// Query the membership group references.
$query = $this
->select('field_collection_item', 'fci');
$query
->leftJoin('field_data_field_farm_group', 'fdffg', "fdffg.entity_id = fci.item_id AND fdffg.entity_type = 'field_collection_item' AND fdffg.bundle = 'field_farm_membership' AND fdffg.deleted = 0");
$query
->addField('fdffg', 'field_farm_group_target_id', 'target_id');
$query
->condition('fci.item_id', $fcid);
$result = $query
->execute()
->fetchCol();
$membership_groups = FALSE;
if (!empty($result)) {
foreach ($result as $col) {
if (!empty($col)) {
$membership_groups[] = [
'target_id' => $col,
];
}
}
}
// If the log has membership groups, then the log is a group assignment.
if (!empty($membership_groups)) {
$is_group_assignment = TRUE;
}
// If the log has membership groups, store them in property on the log so
// they can be processed during migration.
if (!empty($membership_groups)) {
$row
->setSourceProperty('log_groups', $membership_groups);
}
}
// Set the "is_group_assignment" property for use in migrations.
$row
->setSourceProperty('is_group_assignment', $is_group_assignment);
}
/**
* Prepare a log's quantity information.
*
* @param \Drupal\migrate\Row $row
* The row object.
*/
protected function prepareQuantity(Row $row) {
$id = $row
->getSourceProperty('id');
// Get field collections to migrate to log quantities.
$log_quantities = $this
->getFieldvalues('log', 'field_farm_quantity', $id);
$log_inventories = $this
->getFieldvalues('log', 'field_farm_inventory', $id);
// Iterate through field collection values to collect field collection IDs.
$quantity_ids = [];
foreach (array_merge($log_quantities, $log_inventories) as $field_collection) {
if (!empty($field_collection['value'])) {
$quantity_ids[] = $field_collection['value'];
}
}
// Add the quantity IDs to the row for future processing.
$row
->setSourceProperty('log_quantities', $quantity_ids);
}
/**
* Prepare a log's soil test information.
*
* @param \Drupal\migrate\Row $row
* The row object.
*/
protected function prepareSoilTest(Row $row) {
$id = $row
->getSourceProperty('id');
// Get referenced soil name term IDs.
$soil_name_tids = [];
foreach ($this
->getFieldvalues('log', 'field_farm_soil_names', $id) as $value) {
if (!empty($value['tid'])) {
$soil_name_tids[] = $value['tid'];
}
}
// If no soil names are referenced, bail.
if (empty($soil_name_tids)) {
return;
}
// Look up the term names.
$query = $this
->select('taxonomy_term_data', 't');
$query
->addField('t', 'name');
$query
->condition('t.tid', $soil_name_tids, 'IN');
$result = $query
->execute()
->fetchCol();
$soil_names = [];
if (!empty($result)) {
foreach ($result as $col) {
if (!empty($col)) {
$soil_names[] = $col;
}
}
}
// If there are no names, bail.
if (empty($soil_names)) {
return;
}
// Create a string that summarizes the soil names. If there are multiple,
// separate with newlines.
if (count($soil_names) == 1) {
$summary = $this
->t('Soil name: @name', [
'@name' => $soil_names[0],
]);
}
else {
$summary = $this
->t("Soil names:\n@names", [
'@names' => implode("\n", $soil_names),
]);
}
// The names are going to be appended to the log's Notes field, but we want
// to make sure that whitespace is added if there is already data in the
// Notes field.
$notes = $this
->getFieldvalues('log', 'field_farm_notes', $id);
if (!empty($notes)) {
$summary = "\n\n" . $summary;
}
// Add the soil name summary to the row for future processing.
$row
->setSourceProperty('soil_name_summary', $summary);
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
DependencySerializationTrait:: |
protected | property | ||
DependencySerializationTrait:: |
protected | property | ||
DependencySerializationTrait:: |
public | function | 2 | |
DependencyTrait:: |
protected | property | The object's dependencies. | |
DependencyTrait:: |
protected | function | Adds multiple dependencies. | |
DependencyTrait:: |
protected | function | Adds a dependency. | |
DrupalSqlBase:: |
protected | property | The entity type manager. | |
DrupalSqlBase:: |
protected | property | If the source provider is missing. | |
DrupalSqlBase:: |
protected | property | The contents of the system table. | |
DrupalSqlBase:: |
public | function |
Calculates dependencies for the configured plugin. Overrides DependentPluginInterface:: |
1 |
DrupalSqlBase:: |
public | function |
Checks if requirements for this plugin are OK. Overrides SqlBase:: |
4 |
DrupalSqlBase:: |
public static | function |
Creates an instance of the plugin. Overrides SqlBase:: |
3 |
DrupalSqlBase:: |
protected | function | Retrieves a module schema_version from the source Drupal database. | |
DrupalSqlBase:: |
public | function | Retrieves all system data information from the source Drupal database. | |
DrupalSqlBase:: |
protected | function | Checks if a given module is enabled in the source Drupal database. | |
DrupalSqlBase:: |
protected | function | Reads a variable from a source Drupal database. | |
DrupalSqlBase:: |
public | function |
Constructs a \Drupal\Component\Plugin\PluginBase object. Overrides SqlBase:: |
6 |
FarmLog:: |
protected | function | Prepare a log's group assignment information. | |
FarmLog:: |
protected | function | Prepare a log's movement information. | |
FarmLog:: |
protected | function | Prepare a log's quantity information. | |
FarmLog:: |
public | function |
Adds additional data to the row. Overrides Log:: |
|
FarmLog:: |
protected | function | Prepare a log's soil test information. | |
FarmQuickEntity:: |
public | function | Prepare reference to the 1.x quick form that created this entity. | |
FieldableEntity:: |
protected | function | Gets an entity source language from the 'entity_translation' table. | |
FieldableEntity:: |
protected | function | Returns all non-deleted field instances attached to a specific entity type. | |
FieldableEntity:: |
protected | function | Retrieves field values for a single field of a single entity. | |
FieldableEntity:: |
protected | function | Checks if an entity type uses Entity Translation. | |
Log:: |
public | function |
Returns available fields on the source. Overrides MigrateSourceInterface:: |
|
Log:: |
public | function |
Defines the source fields uniquely identifying a source row. Overrides MigrateSourceInterface:: |
|
Log:: |
public | function |
Overrides SqlBase:: |
|
MessengerTrait:: |
protected | property | The messenger. | 27 |
MessengerTrait:: |
public | function | Gets the messenger. | 27 |
MessengerTrait:: |
public | function | Sets the messenger. | |
MigrateSourceInterface:: |
constant | Indicates that the source is not countable. | ||
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
2 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
SourcePluginBase:: |
protected | property | The backend cache. | |
SourcePluginBase:: |
protected | property | Whether this instance should cache the source count. | 1 |
SourcePluginBase:: |
protected | property | Key to use for caching counts. | |
SourcePluginBase:: |
protected | property | The current row from the query. | |
SourcePluginBase:: |
protected | property | The primary key of the current row. | |
SourcePluginBase:: |
protected | property | Information on the property used as the high-water mark. | |
SourcePluginBase:: |
protected | property | The key-value storage for the high-water value. | |
SourcePluginBase:: |
protected | property | The migration ID map. | |
SourcePluginBase:: |
protected | property | The iterator to iterate over the source rows. | |
SourcePluginBase:: |
protected | property | Flags whether source plugin will read the map row and add to data row. | |
SourcePluginBase:: |
protected | property | The entity migration object. | |
SourcePluginBase:: |
protected | property | The module handler service. | 2 |
SourcePluginBase:: |
protected | property | The high water mark at the beginning of the import operation. | |
SourcePluginBase:: |
protected | property | Whether this instance should not attempt to count the source. | 1 |
SourcePluginBase:: |
protected | property | Flags whether to track changes to incoming data. | 1 |
SourcePluginBase:: |
protected | function | Check if the incoming data is newer than what we've previously imported. | |
SourcePluginBase:: |
public | function | Gets the source count. | 9 |
SourcePluginBase:: |
public | function | ||
SourcePluginBase:: |
protected | function | Gets the cache object. | |
SourcePluginBase:: |
public | function | Gets the currentSourceIds data member. | |
SourcePluginBase:: |
protected | function | The current value of the high water mark. | |
SourcePluginBase:: |
protected | function | Get the name of the field used as the high watermark. | |
SourcePluginBase:: |
protected | function | Get information on the property used as the high watermark. | |
SourcePluginBase:: |
protected | function | Get the high water storage object. | |
SourcePluginBase:: |
protected | function | Returns the iterator that will yield the row arrays to be processed. | |
SourcePluginBase:: |
protected | function | Gets the module handler. | |
SourcePluginBase:: |
public | function |
Gets the source module providing the source data. Overrides MigrateSourceInterface:: |
|
SourcePluginBase:: |
public | function | Gets the iterator key. | |
SourcePluginBase:: |
public | function | ||
SourcePluginBase:: |
public | function |
Performs post-rollback tasks. Overrides RollbackAwareInterface:: |
|
SourcePluginBase:: |
public | function |
Performs pre-rollback tasks. Overrides RollbackAwareInterface:: |
|
SourcePluginBase:: |
public | function | Rewinds the iterator. | |
SourcePluginBase:: |
protected | function | Checks if the incoming row has changed since our last import. | |
SourcePluginBase:: |
protected | function | Save the new high water mark. | |
SourcePluginBase:: |
public | function | Checks whether the iterator is currently valid. | |
SqlBase:: |
protected | property | The count of the number of batches run. | |
SqlBase:: |
protected | property | Number of records to fetch from the database during each batch. | |
SqlBase:: |
protected | property | The database object. | 1 |
SqlBase:: |
protected | property | The query string. | |
SqlBase:: |
protected | property | State service for retrieving database info. | |
SqlBase:: |
protected | function |
Gets the source count using countQuery(). Overrides SourcePluginBase:: |
|
SqlBase:: |
protected | function | Prepares query for the next set of data from the source database. | |
SqlBase:: |
protected | function |
Position the iterator to the following row. Overrides SourcePluginBase:: |
|
SqlBase:: |
public | function | Gets the database connection object. | 2 |
SqlBase:: |
protected | function |
Initializes the iterator with the source data. Overrides SourcePluginBase:: |
18 |
SqlBase:: |
protected | function | Checks if we can join against the map table. | 1 |
SqlBase:: |
protected | function | Adds tags and metadata to the query. | |
SqlBase:: |
protected | function | Wrapper for database select. | |
SqlBase:: |
protected | function | Gets a connection to the referenced database. | |
SqlBase:: |
public | function |
Overrides DependencySerializationTrait:: |
|
SqlBase:: |
public | function |
Prints the query string when the object is used as a string. Overrides MigrateSourceInterface:: |
|
StringTranslationTrait:: |
protected | property | The string translation service. | 4 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. |