Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
*.graphml
*.xml
.idea
vendor
vendor
.DS_Store
203 changes: 52 additions & 151 deletions ERDiagramXMLExportBundle/Command/CreateERDiagramXMLExportCommand.php
Original file line number Diff line number Diff line change
@@ -1,183 +1,84 @@
<?php

namespace Basilicom\ERDiagramXMLExportBundle\Command ;
namespace Basilicom\ERDiagramXMLExportBundle\Command;

use Pimcore\Model\DataObject;
use Pimcore\Model\DataObject\ClassDefinition\Data\Fieldcollections as FieldCollections;
use Pimcore\Model\DataObject\ClassDefinition\Data\Objectbricks as ObjectBricks;
use Pimcore\Model\DataObject\ClassDefinition\Listing as ClassDefinitionListing;
use Pimcore\Model\DataObject\Fieldcollection\Definition\Listing as FieldCollectionListing;
use Pimcore\Model\DataObject\Objectbrick\Definition\Listing as ObjectBrickListing;
use Basilicom\ERDiagramXMLExportBundle\DependencyInjection\DiagramsPimcoreDefinitionsRepository;
use Basilicom\ERDiagramXMLExportBundle\DependencyInjection\DiagramsXmlGenerator;
use Basilicom\ERDiagramXMLExportBundle\DependencyInjection\YedPimcoreDefinitionsRepository;
use Basilicom\ERDiagramXMLExportBundle\DependencyInjection\YedXmlGenerator;
use Exception;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Pimcore\Console\AbstractCommand;
use Basilicom\ERDiagramXMLExportBundle\DependencyInjection\GraphMLWriter;

class CreateERDiagramXMLExportCommand extends AbstractCommand
{
protected static $defaultName = 'basilicom:create-er-diagram-xml-export';

protected function configure()
{
$this->setDescription('Provides an yEd-XML Output to visualize ER of Pimcore Classes');
$this->setDescription('Provides an ER-Diagram of Pimcore Classes in XML format for diagrams.net or yEd');
$this->addArgument('format', InputArgument::REQUIRED, 'diagrams | yed');
$this->addArgument('filename', InputArgument::OPTIONAL, 'Provide a filename');
}

public function execute(InputInterface $input, OutputInterface $output)
/**
* @throws Exception
*/
public function execute(InputInterface $input, OutputInterface $output): int
{
$result = new GraphMLWriter(
$this->getClassDefinitionData(),
$this->getFieldCollectionsData(),
$this->getObjectBricksData(),
$input->getArgument('filename') ?: ''

);
$result->output();

return 0;
}

private function getClassDefinitionData(): array
{
$listing = new ClassDefinitionListing();
$classDefinitions = $listing->load();

$classDefinitionData = [];

foreach ($classDefinitions as $classDefinition) {
$fieldDefinitions = $classDefinition->getFieldDefinitions();


$data = [
'id' => $classDefinition->getId(),
'name' => $classDefinition->getName(),
'fields' => $this->processFieldDefinitions($fieldDefinitions),
'relatedClasses' => $this->getRelatedClasses($fieldDefinitions),
'relatedFieldCollections' => $this->getRelatedFieldCollections($fieldDefinitions),
'relatedObjectBricks' => $this->getRelatedObjectBricks($fieldDefinitions),
];

array_push($classDefinitionData, $data);
}

return $classDefinitionData;
}

private function processFieldDefinitions($fieldDefinitions): array
{
$data = [];

/** @var DataObject\ClassDefinition\Data $fieldDefinition */
foreach ($fieldDefinitions as $fieldDefinition) {
$fieldType = $fieldDefinition->getFieldtype();

if (strpos($fieldType, 'Relation') == false) {
$fields = [
$fieldDefinition->getName() => $fieldType,
];
if ($fieldDefinition instanceof FieldCollections) {
$allowedTypes = [];

foreach ($fieldDefinition->getAllowedTypes() as $allowedType) {
array_push($allowedTypes, $allowedType);
}
$fields = [
$fieldDefinition->getName() => $allowedTypes,
];
}
array_push($data, $fields);
}
}

return $data;
}

private function getRelatedClasses($fieldDefinitions): array
{
$relatedClasses = [];

/** @var DataObject\ClassDefinition\Data $fieldDefinition */
foreach ($fieldDefinitions as $fieldDefinition) {
$fieldType = $fieldDefinition->getFieldtype();

if (strpos($fieldType, 'Relation') !== false) {
foreach ($fieldDefinition->getClasses() as $class) {
array_push($relatedClasses, [$fieldType => $class['classes']]);
}
}
$outputType = strtolower($input->getArgument('format'));
switch ($outputType) {
case 'diagrams':
$pimcoreDefinitionsRepository = new DiagramsPimcoreDefinitionsRepository();
$xmlGenerator = new DiagramsXmlGenerator(
$pimcoreDefinitionsRepository->getClassDefinitionData(),
$pimcoreDefinitionsRepository->getFieldCollectionsData(),
$pimcoreDefinitionsRepository->getObjectBricksData(),
);
break;

case 'yed':
$pimcoreDefinitionsRepository = new YedPimcoreDefinitionsRepository();
$xmlGenerator = new YedXmlGenerator(
$pimcoreDefinitionsRepository->getClassDefinitionData(),
$pimcoreDefinitionsRepository->getFieldCollectionsData(),
$pimcoreDefinitionsRepository->getObjectBricksData(),
);
break;

default:
throw new Exception('Invalid format: "' . $outputType . '". Valid: diagrams | yed');
}

return $relatedClasses;
}

private function getRelatedFieldCollections($fieldDefinitions): array
{
$data = [];

foreach ($fieldDefinitions as $fieldDefinition) {
if ($fieldDefinition instanceof FieldCollections) {
foreach ($fieldDefinition->getAllowedTypes() as $allowedType => $name) {
array_push($data, $name);
}
}
}
$xml = $xmlGenerator->generate();
$this->writeToFile($input->getArgument('filename') ?: '', $xml);

return $data;
return 0;
}

private function getRelatedObjectBricks($fieldDefinitions): array
/**
* @throws Exception
*/
public function writeToFile(string $fileName, string $fileContent): void
{
$data = [];
$dirname = dirname(__DIR__, 5) . '/var/tmp/';

foreach ($fieldDefinitions as $fieldDefinition) {
if ($fieldDefinition instanceof ObjectBricks) {
foreach ($fieldDefinition->getAllowedTypes() as $allowedType => $name) {
array_push($data, $name);
}
}
if (!is_dir($dirname)) {
$dirname = './var/tmp/';
}

return $data;
}

private function getFieldCollectionsData(): array
{
$fieldCollectionData = [];

$fieldCollectionListing = new FieldCollectionListing();
$fieldCollections = $fieldCollectionListing->load();

foreach ($fieldCollections as $fieldCollection) {
$data['fieldCollection'] = [

'name' => $fieldCollection->getKey(),
'fields' => $this->processFieldDefinitions($fieldCollection->getFieldDefinitions()),

];
array_push($fieldCollectionData, $data);
if (!is_dir($dirname)) {
throw new Exception('"' . $dirname . '" generate path does not exist!');
}

return $fieldCollectionData;
}

private function getObjectBricksData(): array
{
$objectBricksData = [];

$objectBricksListing = new ObjectBrickListing();
$objectBricks = $objectBricksListing->load();

foreach ($objectBricks as $objectBrick) {
$data['objectBrick'] = [

'name' => $objectBrick->getKey(),
'fields' => $this->processFieldDefinitions($objectBrick->getFieldDefinitions()),

];
array_push($objectBricksData, $data);
if (empty($fileName)) {
$file = $dirname . 'PimcoreClassDiagram.xml';
} else {
$file = $dirname . $fileName . '.xml';
}

return $objectBricksData;
file_put_contents($file, $fileContent);
}
}
}
Loading