Skip to content

Commit

Permalink
Merge pull request #84 from softspring/load-version-dump
Browse files Browse the repository at this point in the history
BUNDLES-36 Load version dump
  • Loading branch information
javihgil committed May 22, 2023
2 parents 31d8083 + 132a1df commit a12ec3d
Show file tree
Hide file tree
Showing 16 changed files with 353 additions and 7 deletions.
18 changes: 18 additions & 0 deletions cms/contents/page/translations/sfs_cms_contents.en.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ admin_page:
publish:
version_has_been_published_flash: "Version has been published"

unpublish:
has_been_unpublished_flash: "The page has been unpublished"

import:
meta.title: "Import page"
title: "Import page"
Expand All @@ -30,10 +33,24 @@ admin_page:
form:
file.label: "Import content file"

import_version:
meta.title: "Import version"
title: "Import version"
breadcrumb: "Import version"
actions:
import.button: "Import version"
cancel.button: "Cancel"
form:
file.label: "Import content file"

read:
meta.title: "General"
title: "%name%"
breadcrumb: "General"
actions:
unpublish:
confirm: "are you sure to unpublish this page?"
link: "Unpublish"

versions:
meta.title: "Versions"
Expand All @@ -57,6 +74,7 @@ admin_page:
preview.link: "Preview"
export.link: "Export"
publish.link: "Publish version"
import_version.link: "Import version"
cleanup_versions.link: "Cleanup versions"
keep.link: "Keep version, click to no keep"
nokeep.link: "Do not keep version, click to keep"
Expand Down
20 changes: 19 additions & 1 deletion cms/contents/page/translations/sfs_cms_contents.es.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ admin_page:

publish:
version_has_been_published_flash: "La versión se ha publicado"


unpublish:
has_been_unpublished_flash: "La página se ha despublicado"

import:
meta.title: "Importar página"
title: "Importar página"
Expand All @@ -30,10 +33,24 @@ admin_page:
form:
file.label: "Fichero a importar"

import_version:
meta.title: "Importar versión"
title: "Importar versión"
breadcrumb: "Importar versión"
actions:
import.button: "Importar versión"
cancel.button: "Cancelar"
form:
file.label: "Fichero a importar"

read:
meta.title: "General"
title: "%name%"
breadcrumb: "General"
actions:
unpublish:
confirm: "¿estás seguro de despublicar esta página?"
link: "Despublicar"

versions:
meta.title: "Versiones"
Expand All @@ -57,6 +74,7 @@ admin_page:
preview.link: "Previsualizar"
export.link: "Exportar"
publish.link: "Publicar versión"
import_version.link: "Importar versión"
cleanup_versions.link: "Limpiar versiones"
keep.link: "Mantener versión, pinchar para desmarcar"
nokeep.link: "No mantener esta versión, pinchar para mantener"
Expand Down
3 changes: 3 additions & 0 deletions config/doctrine-mapping/model/ContentVersion.orm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
</options>
</field>

<field name="originDescription" column="origin_description" type="string" nullable="true"/>
<field name="note" column="note" type="string" nullable="true"/>

<field name="compiledModules" column="compiled_modules" type="json" nullable="true"/>
<field name="compiled" column="compiled" type="json" nullable="true"/>

Expand Down
8 changes: 8 additions & 0 deletions config/routing/admin_content_type.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ import:
controller: Softspring\CmsBundle\Controller\Admin\ContentController::import
path: /import

import_version:
controller: Softspring\CmsBundle\Controller\Admin\ContentController::importVersion
path: /{content}/import-version

details:
controller: Softspring\CmsBundle\Controller\Admin\ContentController::read
path: /{content}
Expand Down Expand Up @@ -54,6 +58,10 @@ publish_version:
controller: Softspring\CmsBundle\Controller\Admin\ContentController::publishVersion
path: /{content}/{version}/publish-version

unpublish:
controller: Softspring\CmsBundle\Controller\Admin\ContentController::unpublish
path: /{content}/unpublish

keep_version:
controller: Softspring\CmsBundle\Controller\Admin\ContentController::markKeepVersion
path: /{content}/{version}/keep-version
Expand Down
5 changes: 5 additions & 0 deletions src/Config/Model/Content.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Softspring\CmsBundle\Form\Admin\Content\ContentListFilterForm;
use Softspring\CmsBundle\Form\Admin\Content\ContentSeoForm;
use Softspring\CmsBundle\Form\Admin\Content\ContentUpdateForm;
use Softspring\CmsBundle\Form\Admin\Content\ContentVersionImportForm;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

Expand Down Expand Up @@ -121,6 +122,10 @@ public function getConfigTreeBuilder(): TreeBuilder
->scalarNode('import_view')->defaultValue('@SfsCms/admin/content/import.html.twig')->end()
->scalarNode('import_type')->defaultValue(ContentImportForm::class)->end()
->scalarNode('import_success_redirect_to')->defaultValue('')->end()
->scalarNode('import_version_is_granted')->defaultValue('')->end()
->scalarNode('import_version_view')->defaultValue('@SfsCms/admin/content/import_version.html.twig')->end()
->scalarNode('import_version_type')->defaultValue(ContentVersionImportForm::class)->end()
->scalarNode('import_version_success_redirect_to')->defaultValue('')->end()
->scalarNode('read_view')->defaultValue('@SfsCms/admin/content/read.html.twig')->end()
->scalarNode('preview_view')->defaultValue('@SfsCms/admin/content/preview.html.twig')->end()
->scalarNode('versions_view')->defaultValue('@SfsCms/admin/content/versions.html.twig')->end()
Expand Down
114 changes: 111 additions & 3 deletions src/Controller/Admin/ContentController.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
use Softspring\Component\Events\ViewEvent;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Bundle\WebProfilerBundle\EventListener\WebDebugToolbarListener;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
Expand Down Expand Up @@ -338,6 +339,93 @@ public function import(Request $request, bool $confirm = false): Response
return $this->render($config['import_view'], $viewData->getArrayCopy());
}

public function importVersion(string $content, Request $request): Response
{
$contentConfig = $this->getContentConfig($request);
$config = $contentConfig['admin'] + ['_id' => $contentConfig['_id']] + ['extra_fields' => $contentConfig['extra_fields']];

/** @var ?ContentInterface $entity */
$entity = $this->contentManager->getRepository($config['_id'])->findOneBy(['id' => $content]);

if (!$entity) {
return $this->flashAndRedirectToRoute($request, 'warning', 'entity_not_found_flash', $config['_id'], "sfs_cms_admin_content_{$config['_id']}_list");
}
// if (!empty($config['is_granted'])) {
// $this->denyAccessUnlessGranted($config['is_granted'], null, sprintf('Access denied, user is not %s.', $config['is_granted']));
// }

// $entity = $this->contentManager->createEntity($config['_id']);
// $entity->addRoute($this->routeManager->createEntity());

// if ($response = $this->dispatchGetResponseFromConfig($config, 'initialize_event_name', new GetResponseEntityEvent($entity, $request))) {
// return $response;
// }

$form = $this->createForm($config['import_version_type'], null, ['content' => $config, 'method' => 'POST'])->handleRequest($request);
//
// $this->dispatchFromConfig($config, 'form_init_event_name', new FormEvent($form, $request));
//
if ($form->isSubmitted()) {
if ($form->isValid()) {
// if ($response = $this->dispatchGetResponseFromConfig($config, 'form_valid_event_name', new GetResponseFormEvent($form, $request))) {
// return $response;
// }

/** @var UploadedFile $zipFile */
$zipFile = $form->getData()['file'];
$data = ZipContent::read($zipFile->getPath(), $zipFile->getBasename());

// TODO MOVE THIS CODE TO A DATA PROCESSOR
foreach ($data['contents'] as $id => $content) {
$contentType = key($content);
$contentData = current($content);
$versionData = $contentData['versions'][0];

if ($contentType !== $contentConfig['_id']) {
$form->addError(new FormError(sprintf('Incompatible types, you are trying to import a "%s" version to a "%s" content.', $contentType, $contentConfig['_id'])));
break;
}

// if ($id !== $entity->getId()) {
// $form->addError(new FormError('Bad type'));
// break;
// }

try {
$version = $this->dataImporter->importVersion($contentType, $entity, $versionData, $data, ['version_origin' => ContentVersionInterface::ORIGIN_IMPORT]);
$version->setOriginDescription($zipFile->getClientOriginalName());
$this->contentManager->saveEntity($entity);

// if ($response = $this->dispatchGetResponseFromConfig($config, 'success_event_name', new GetResponseEntityEvent($entity, $request))) {
// return $response;
// }

return $this->redirect(!empty($config['import_version_success_redirect_to']) ? $this->generateUrl($config['import_version_success_redirect_to']) : $this->generateUrl("sfs_cms_admin_content_{$config['_id']}_versions", ['content' => $entity]));
} catch (\Exception $e) {
$form->addError(new FormError(sprintf('Han error has been produced during importing: %s', $e->getMessage())));
}
}

// } else {
// if ($response = $this->dispatchGetResponseFromConfig($config, 'form_invalid_event_name', new GetResponseFormEvent($form, $request))) {
// return $response;
// }
}
}

// show view
$viewData = new \ArrayObject([
'entity' => $entity,
'content' => $config['_id'],
'content_config' => $contentConfig,
'form' => $form->createView(),
]);
//
// $this->dispatchFromConfig($config, 'view_event_name', new ViewEvent($viewData));

return $this->render($config['import_version_view'], $viewData->getArrayCopy());
}

public function list(Request $request): Response
{
$contentConfig = $this->getContentConfig($request);
Expand Down Expand Up @@ -402,6 +490,7 @@ public function content(string $content, Request $request, string $prevVersion =
}

$version = $this->contentManager->createVersion($entity, $prevVersion, ContentVersionInterface::ORIGIN_EDIT);
$prevVersion && $version->setOriginDescription('v'.$prevVersion->getVersionNumber());

/** @var ?array $contentContentForm */
$contentContentForm = $request->request->get('content_content_form');
Expand Down Expand Up @@ -585,6 +674,26 @@ public function publishVersion(string $content, Request $request, string $versio
return $this->redirectBack($config['_id'], $entity, $request, $version);
}

public function unpublish(string $content, Request $request): Response
{
$contentConfig = $this->getContentConfig($request);
$config = $contentConfig['admin'] + ['_id' => $contentConfig['_id']] + ['extra_fields' => $contentConfig['extra_fields']];

/** @var ?ContentInterface $entity */
$entity = $this->contentManager->getRepository($config['_id'])->findOneBy(['id' => $content]);

if (!$entity) {
return $this->flashAndRedirectToRoute($request, 'warning', 'entity_not_found_flash', $config['_id'], "sfs_cms_admin_content_{$config['_id']}_list");
}

$entity->setPublishedVersion(null);
$this->contentManager->saveEntity($entity);

$request->getSession()->getFlashBag()->add('success', $this->translator->trans('admin_'.$config['_id'].'.unpublish.has_been_unpublished_flash', [], 'sfs_cms_contents'));

return $this->redirectBack($config['_id'], $entity, $request);
}

public function previewContent(string $content, Request $request, string $version = null): Response
{
$contentConfig = $this->getContentConfig($request);
Expand Down Expand Up @@ -731,12 +840,11 @@ protected function redirectBack(string $configId, ContentInterface $entity, Requ

case 'preview':
if ($version) {
return $this->redirectToRoute("sfs_cms_admin_content_{$configId}_preview", ['content' => $entity]);
} else {
return $this->redirectToRoute("sfs_cms_admin_content_{$configId}_preview_version", ['content' => $entity, 'version' => $version]);
}

// no break
return $this->redirectToRoute("sfs_cms_admin_content_{$configId}_preview", ['content' => $entity]);

default:
return $this->redirectToRoute("sfs_cms_admin_content_{$configId}_details", ['content' => $entity]);
}
Expand Down
32 changes: 31 additions & 1 deletion src/Data/DataImporter.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,28 @@
namespace Softspring\CmsBundle\Data;

use Doctrine\ORM\EntityManagerInterface;
use Softspring\CmsBundle\Data\EntityTransformer\ContentEntityTransformerInterface;
use Softspring\CmsBundle\Data\EntityTransformer\EntityTransformerInterface;
use Softspring\CmsBundle\Data\Exception\DataTransformerNotFoundException;
use Softspring\CmsBundle\Model\ContentInterface;
use Softspring\CmsBundle\Model\ContentVersionInterface;
use Softspring\CmsBundle\Model\RouteInterface;
use Softspring\MediaBundle\EntityManager\MediaManagerInterface;

class DataImporter extends AbstractDataImportExport
{
protected EntityManagerInterface $em;

protected ReferencesRepository $referenceRepository;
protected MediaManagerInterface $mediaManager;

/**
* @param EntityTransformerInterface[] $entityTransformers
*/
public function __construct(EntityManagerInterface $em, iterable $entityTransformers)
public function __construct(EntityManagerInterface $em, iterable $entityTransformers, MediaManagerInterface $mediaManager)
{
$this->em = $em;
$this->mediaManager = $mediaManager;
parent::__construct($entityTransformers);
$this->referenceRepository = new ReferencesRepository();
}
Expand Down Expand Up @@ -63,4 +69,28 @@ public function import(array $contents, array $options = []): void
}
$this->em->flush();
}

public function importVersion(string $type, ContentInterface $content, array $versionData, array $zipData, array $options = []): ?ContentVersionInterface
{
/** @var ContentEntityTransformerInterface $transformer */
$transformer = $this->getDataTransformer($type);

if (!$transformer instanceof ContentEntityTransformerInterface) {
throw new \Exception('Invalid entity transformer, check configuration');
}

foreach ($zipData['media'] as $id => $mediaData) {
$media = $this->mediaManager->getRepository()->findOneById($id);

if ($media) {
$this->referenceRepository->addReference("media___{$id}", $media);
} else {
$this->getDataTransformer('media', $mediaData)->preload($mediaData, $this->referenceRepository);
$entity = $this->getDataTransformer('media', $mediaData)->import($mediaData, $this->referenceRepository, $options);
$this->em->persist($entity);
}
}

return $transformer->importVersion($content, $versionData['layout'], $versionData['data'] ?? [], $this->referenceRepository, $options);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Softspring\CmsBundle\Data\Exception\InvalidElementException;
use Softspring\CmsBundle\Data\ReferencesRepository;
use Softspring\CmsBundle\Model\ContentInterface;
use Softspring\CmsBundle\Model\ContentVersionInterface;

interface ContentEntityTransformerInterface extends EntityTransformerInterface
{
Expand All @@ -14,4 +15,6 @@ interface ContentEntityTransformerInterface extends EntityTransformerInterface
public function export(object $element, &$files = [], object $contentVersion = null, string $contentType = null): array;

public function import(array $data, ReferencesRepository $referencesRepository, array $options = []): ContentInterface;

public function importVersion(ContentInterface $content, string $layout, array $data, ReferencesRepository $referencesRepository, array $options = []): ContentVersionInterface;
}
Loading

0 comments on commit a12ec3d

Please sign in to comment.