View source
<?php
namespace Drupal\cms_content_sync\Plugin\cms_content_sync\field_handler;
use Drupal\cms_content_sync\Plugin\FieldHandlerBase;
use Drupal\cms_content_sync\PullIntent;
use Drupal\cms_content_sync\PushIntent;
use Drupal\cms_content_sync\SyncIntent;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Url;
use Drupal\menu_link_content\Entity\MenuLinkContent;
use EdgeBox\SyncCore\V1\Entity\Entity;
class DefaultLinkHandler extends FieldHandlerBase {
public static function supports($entity_type, $bundle, $field_name, FieldDefinitionInterface $field) {
$allowed = [
'link',
];
return false !== in_array($field
->getType(), $allowed);
}
public function getHandlerSettings($current_values, $type = 'both') {
$options = [];
if ('pull' !== $type) {
$options['export_as_absolute_url'] = [
'#type' => 'checkbox',
'#title' => 'Push as absolute URL',
'#default_value' => isset($current_values['export_as_absolute_url']) ? $current_values['export_as_absolute_url'] : false,
];
}
return array_merge(parent::getHandlerSettings($current_values, $type), $options);
}
public function pull(PullIntent $intent) {
$action = $intent
->getAction();
$entity = $intent
->getEntity();
if (SyncIntent::ACTION_DELETE == $action) {
return false;
}
if ($intent
->shouldMergeChanges()) {
return false;
}
$data = $intent
->getProperty($this->fieldName);
if (empty($data)) {
$entity
->set($this->fieldName, null);
}
else {
$result = [];
foreach ($data as &$link_element) {
if (empty($link_element['uri'])) {
try {
$reference = $intent
->loadEmbeddedEntity($link_element);
} catch (\Exception $e) {
$reference = null;
}
if ($reference) {
$result[] = [
'uri' => 'entity:' . $reference
->getEntityTypeId() . '/' . $reference
->id(),
'title' => $link_element['title'],
'options' => $link_element['options'],
];
}
elseif (!empty($reference[Entity::ENTITY_TYPE_KEY]) && !empty($link_element[Entity::BUNDLE_KEY])) {
if ($reference) {
$result[] = [
'uri' => 'entity:' . $reference
->getEntityTypeId() . '/' . $reference
->id(),
'title' => $link_element['title'],
'options' => $link_element['options'],
];
}
elseif ($entity instanceof MenuLinkContent && 'link' == $this->fieldName) {
$result[] = [
'uri' => 'internal:/' . $link_element[Entity::ENTITY_TYPE_KEY] . '/' . $link_element[Entity::UUID_KEY],
'title' => $link_element['title'],
'options' => $link_element['options'],
];
}
}
}
else {
$result[] = [
'uri' => $link_element['uri'],
'title' => $link_element['title'],
'options' => $link_element['options'],
];
}
}
$entity
->set($this->fieldName, $result);
}
return true;
}
public function push(PushIntent $intent) {
$action = $intent
->getAction();
$entity = $intent
->getEntity();
if (SyncIntent::ACTION_DELETE == $action) {
return false;
}
$data = $entity
->get($this->fieldName)
->getValue();
$absolute = !empty($this->settings['handler_settings']['export_as_absolute_url']);
$result = [];
foreach ($data as $key => $value) {
$uri =& $data[$key]['uri'];
preg_match('/^entity:(.*)\\/(\\d*)$/', $uri, $found);
if (empty($found) || $absolute) {
if ($absolute) {
$uri = Url::fromUri($uri, [
'absolute' => true,
])
->toString();
}
$result[] = [
'uri' => $uri,
'title' => isset($value['title']) ? $value['title'] : null,
'options' => $value['options'],
];
}
else {
$link_entity_type = $found[1];
$link_entity_id = $found[2];
$entity_manager = \Drupal::entityTypeManager();
$link_entity = $entity_manager
->getStorage($link_entity_type)
->load($link_entity_id);
if (empty($link_entity)) {
continue;
}
if (!$this->flow
->supportsEntity($link_entity)) {
continue;
}
$result[] = $intent
->addReference($link_entity, [
'title' => $value['title'],
'options' => $value['options'],
]);
}
}
$intent
->setProperty($this->fieldName, $result);
return true;
}
}