FieldItemListProcessor.php in Content Synchronizer 8
File
src/Plugin/content_synchronizer/type_processor/FieldItemListProcessor.php
View source
<?php
namespace Drupal\content_synchronizer\Plugin\content_synchronizer\type_processor;
use Drupal\content_synchronizer\Processors\ImportProcessor;
use Drupal\Core\Entity\Entity;
use Drupal\Core\TypedData\TypedData;
use Drupal\content_synchronizer\Processors\Type\TypeProcessorBase;
use Drupal\file\Entity\File;
class FieldItemListProcessor extends TypeProcessorBase {
public function getExportedData(TypedData $propertyData) {
$data = [];
foreach ($propertyData as $order => $value) {
$data[] = $value
->getValue();
}
$this
->exportIncludedImages($data);
return $data;
}
protected function exportIncludedImages(&$data) {
foreach ($data as &$item) {
foreach ($item as $key => $value) {
preg_match_all('@src="([^"]+)"@', $value, $match);
$src = array_pop($match);
if (!empty($src)) {
foreach ($src as $image) {
$this
->exportImage($image, $item, $key, $value);
}
}
}
}
}
protected function exportImage($image, &$data, $key, $value) {
$fileNameData = explode('/files/', urldecode($image));
$fileName = end($fileNameData);
$file = \Drupal::entityQuery('file')
->condition('uri', '%://' . $fileName, 'LIKE')
->execute();
if ($file = File::load(reset($file))) {
$plugin = $this->pluginManager
->getInstanceByEntityType($file
->getEntityTypeId());
if ($fileGid = $plugin
->export($file)) {
$data[$key] = str_replace($file
->uuid(), $fileGid, $data[$key]);
$data['included_images'] = $fileGid;
}
}
}
public function initImportedEntity(Entity $entityToImport, $propertyId, array $data) {
if (array_key_exists($propertyId, $data)) {
foreach ($data[$propertyId] as $item) {
if (array_key_exists('included_images', $item)) {
$this
->importIncludedImage($item['included_images'], $item);
}
}
$entityToImport
->set($propertyId, $data[$propertyId]);
}
}
protected function importIncludedImage($fileGID, &$item) {
if ($entityData = ImportProcessor::getCurrentImportProcessor()
->getImport()
->getEntityDataFromGid($fileGID)) {
$plugin = $this->pluginManager
->getInstanceByEntityType($this->referenceManager
->getEntityTypeFromGid($fileGID));
$file = $plugin
->import($entityData);
unset($item['included_images']);
foreach ($item as $key => $value) {
$item[$key] = str_replace($fileGID, $file
->uuid(), $value);
}
}
}
}