<?php
namespace SaintElmos\ImportBundle;
use Pimcore\Db;
use Pimcore\Extension\Bundle\AbstractPimcoreBundle;
use Pimcore\Extension\Bundle\Installer\OutputWriterInterface;
//use Pimcore\Extension\Bundle\Traits\PackageVersionTrait;
use Pimcore\Tool;
use SaintElmos\ImportBundle\Services\DataFixturesService;
class SaintElmosImportBundle extends AbstractPimcoreBundle
{
//use PackageVersionTrait;
/**
* Composer readable name
* @return string
*/
protected function getComposerPackageName()
{
return 'saint-elmos/import-bundle';
}
public function getJsPath(){
return array(__DIR__.'/Resources/js/backend');
}
public static $MESSAGE_FILE_NOT_FOUND = 'Requested file could not be found';
public static $MESSAGE_IMPORTING = 'Importing object';
public static $MESSAGE_OBJECT_EXISTS = 'Object exists';
public static $MESSAGE_OBJECT_CREATED = 'Object created';
public static $MESSAFE_OBJECT_NOT_CREATED = 'Object could not be created';
public static $MESSAGE_SUCCESS = 'OK';
public static $ERROR_FILE_NOT_EXISTS = 'Missing or non existing configuration file given.';
public function getJsPaths()
{
return [
'/bundles/saintelmosimport/js/pimcore/startup.js'
];
}
/**
* Returns Pimcore created files
* @param string $bundleName
* @return array
*/
public static function getGeneratedFiles($bundleName){
global $kernel;
if(empty($kernel)){
$kernel = new \AppKernel(getenv('PIMCORE_ENVIRONMENT'));
}
$varDir = $kernel->getRootDir().'/../var';
$basePath = $kernel->getContainer()->get('kernel')->locateResource('@'.$bundleName);
$service = $kernel->getContainer()->get(DataFixturesService::class);
$definitions = $service->getDefinitions($basePath.'/DataFixtures/definitions');
$result = array();
foreach ($definitions as $definition) {
$result[] = $varDir . '/classes/DataObject/' . ucfirst($definition) . '.php';
$result[] = $varDir . '/classes/DataObject/' . ucfirst($definition) . '/Listing.php';
$result [$definition] = $varDir . '/classes/definition_' . $definition . '.php';
}
return $result;
}
/**
* Installs objects provided by given bundle
* @param OutputWriterInterface $outputWriter
* @param string $bundleName
* @return array
*/
public static function installBundleFixtures(string $bundleName, OutputWriterInterface $outputWriter){
global $kernel;
$result = array();
if(empty($kernel)){
$kernel = new \AppKernel(getenv('PIMCORE_ENVIRONMENT'));
}
$kernel = $kernel->getContainer()->get('kernel');
$console = $kernel->getRootDir().'/../bin/console';
$basePath = $kernel->locateResource('@'.$bundleName);
$outputWriter->write('Importing definition files');
$result['definitions'] = shell_exec($console.' se:import:definitions '.$bundleName);
$outputWriter->write($result);
$treePath = $basePath.'/DataFixtures/data_objects/tree.yaml';
$outputWriter->write('Creating objects');
$result['objects'] = shell_exec($console.' se:import:objects ' . $treePath);
$outputWriter->write($result);
$outputWriter->write('Importing thumbnails');
$result['thumbnails'] = shell_exec($console.' se:import:thumbnails '.$bundleName);
$outputWriter->write('Importing translations');
$languages = Tool::getValidLanguages();
foreach ($languages as $language) {
$command = $console.' translation:update '.$language.' ' . $bundleName.' --force';
$result['language-'.$language] = shell_exec($command);
}
$outputWriter->write($result);
return $result;
}
/**
* Removes objects created by given bundle
* @param string $bundleName
* @param OutputWriterInterface $outputWriter
* @return array
* @throws \Doctrine\DBAL\DBALException
*/
public static function uninstallBundleFixtures(string $bundleName, OutputWriterInterface $outputWriter){
$result = array();
$definitions = self::getGeneratedFiles($bundleName);
$clearTables = array('classes' => 'name'/*, 'objects' => 'o_className'*/);
foreach ($definitions as $definition => $filename){
$result[$definition] = @unlink($filename);
if(strpos($filename, 'definition') !== false){
foreach ($clearTables as $table => $column) {
$sql = "DELETE FROM ".$table." WHERE `".$column."`=?";
$query = Db::get()->prepare($sql);
$query->bindParam(1, $definition, \PDO::PARAM_STR);
$query->execute();
}
}
}
return $result;
}
/**
* Returns true if given bundle can be installed
* @param string $bundleName
* @return bool
* @throws \Doctrine\DBAL\DBALException
*/
public static function canBundleBeInstalled(string $bundleName){
$result = false;
$definitionsAll = SaintElmosImportBundle::getGeneratedFiles($bundleName);
$definitions = self::filterByDefinition($definitionsAll);
foreach ($definitions as $definition => $filename){
$sql = "SELECT * FROM classes WHERE `name`=?";
$query = Db::get()->prepare($sql);
$query->bindParam(1, $definition, \PDO::PARAM_STR);
$query->execute();
$rows = $query->fetchAll();
if(count($rows) == 0){
$result = true;
}
break;
}
return $result;
}
/**
* Returns only definition files from given input array
* @param array $input
* @return array
*/
private static function filterByDefinition($input){
$definitions = array_filter($input, function($filename){
return strpos($filename, 'definition') !== false;
});
return $definitions;
}
}