| @@ 48-390 (lines=343) @@ | ||
| 45 | * @link https://github.com/techdivision/import-cli-simple |
|
| 46 | * @link http://www.techdivision.com |
|
| 47 | */ |
|
| 48 | class ImportCategoriesCommand extends Command |
|
| 49 | { |
|
| 50 | ||
| 51 | /** |
|
| 52 | * Configures the current command. |
|
| 53 | * |
|
| 54 | * @return void |
|
| 55 | * @see \Symfony\Component\Console\Command\Command::configure() |
|
| 56 | */ |
|
| 57 | protected function configure() |
|
| 58 | { |
|
| 59 | ||
| 60 | // initialize the command with the required/optional options |
|
| 61 | $this->setName('import:categories') |
|
| 62 | ->setDescription('Imports categories in the configured Magento 2 instance') |
|
| 63 | ->addArgument( |
|
| 64 | InputArgumentKeys::OPERATION_NAME, |
|
| 65 | InputArgument::OPTIONAL, |
|
| 66 | 'The operation that has to be used for the import, one of "add-update", "replace" or "delete"', |
|
| 67 | InputArgumentKeys::OPERATION_NAME_ARG_REPLACE |
|
| 68 | ) |
|
| 69 | ->addOption( |
|
| 70 | InputOptionKeys::CONFIGURATION, |
|
| 71 | null, |
|
| 72 | InputOption::VALUE_REQUIRED, |
|
| 73 | 'Specify the pathname to the configuration file to use', |
|
| 74 | sprintf('%s/techdivision-import.json', getcwd()) |
|
| 75 | ) |
|
| 76 | ->addOption( |
|
| 77 | InputOptionKeys::INSTALLATION_DIR, |
|
| 78 | null, |
|
| 79 | InputOption::VALUE_REQUIRED, |
|
| 80 | 'The Magento installation directory to which the files has to be imported' |
|
| 81 | ) |
|
| 82 | ->addOption( |
|
| 83 | InputOptionKeys::SOURCE_DIR, |
|
| 84 | null, |
|
| 85 | InputOption::VALUE_REQUIRED, |
|
| 86 | 'The directory that has to be watched for new files' |
|
| 87 | ) |
|
| 88 | ->addOption( |
|
| 89 | InputOptionKeys::TARGET_DIR, |
|
| 90 | null, |
|
| 91 | InputOption::VALUE_REQUIRED, |
|
| 92 | 'The target directory with the files that has been imported' |
|
| 93 | ) |
|
| 94 | ->addOption( |
|
| 95 | InputOptionKeys::UTILITY_CLASS_NAME, |
|
| 96 | null, |
|
| 97 | InputOption::VALUE_REQUIRED, |
|
| 98 | 'The utility class name with the SQL statements' |
|
| 99 | ) |
|
| 100 | ->addOption( |
|
| 101 | InputOptionKeys::PREFIX, |
|
| 102 | null, |
|
| 103 | InputOption::VALUE_REQUIRED, |
|
| 104 | 'The prefix of the CSV source file(s) that has/have to be imported' |
|
| 105 | ) |
|
| 106 | ->addOption( |
|
| 107 | InputOptionKeys::MAGENTO_EDITION, |
|
| 108 | null, |
|
| 109 | InputOption::VALUE_REQUIRED, |
|
| 110 | 'The Magento edition to be used, either one of CE or EE' |
|
| 111 | ) |
|
| 112 | ->addOption( |
|
| 113 | InputOptionKeys::MAGENTO_VERSION, |
|
| 114 | null, |
|
| 115 | InputOption::VALUE_REQUIRED, |
|
| 116 | 'The Magento version to be used, e. g. 2.1.2' |
|
| 117 | ) |
|
| 118 | ->addOption( |
|
| 119 | InputOptionKeys::SOURCE_DATE_FORMAT, |
|
| 120 | null, |
|
| 121 | InputOption::VALUE_REQUIRED, |
|
| 122 | 'The date format used in the CSV file(s)' |
|
| 123 | ) |
|
| 124 | ->addOption( |
|
| 125 | InputOptionKeys::USE_DB_ID, |
|
| 126 | null, |
|
| 127 | InputOption::VALUE_REQUIRED, |
|
| 128 | 'The explicit database ID used for the actual import process' |
|
| 129 | ) |
|
| 130 | ->addOption( |
|
| 131 | InputOptionKeys::DB_PDO_DSN, |
|
| 132 | null, |
|
| 133 | InputOption::VALUE_REQUIRED, |
|
| 134 | 'The DSN used to connect to the Magento database where the data has to be imported, e. g. mysql:host=127.0.0.1;dbname=magento' |
|
| 135 | ) |
|
| 136 | ->addOption( |
|
| 137 | InputOptionKeys::DB_USERNAME, |
|
| 138 | null, |
|
| 139 | InputOption::VALUE_REQUIRED, |
|
| 140 | 'The username used to connect to the Magento database' |
|
| 141 | ) |
|
| 142 | ->addOption( |
|
| 143 | InputOptionKeys::DB_PASSWORD, |
|
| 144 | null, |
|
| 145 | InputOption::VALUE_REQUIRED, |
|
| 146 | 'The password used to connect to the Magento database' |
|
| 147 | ) |
|
| 148 | ->addOption( |
|
| 149 | InputOptionKeys::LOG_LEVEL, |
|
| 150 | null, |
|
| 151 | InputOption::VALUE_REQUIRED, |
|
| 152 | 'The log level to use' |
|
| 153 | ) |
|
| 154 | ->addOption( |
|
| 155 | InputOptionKeys::IGNORE_PID, |
|
| 156 | null, |
|
| 157 | InputOption::VALUE_REQUIRED, |
|
| 158 | 'Whether or not an existing PID should be ignored or not' |
|
| 159 | ) |
|
| 160 | ->addOption( |
|
| 161 | InputOptionKeys::DEBUG_MODE, |
|
| 162 | null, |
|
| 163 | InputOption::VALUE_REQUIRED, |
|
| 164 | 'Whether use the debug mode or not' |
|
| 165 | ) |
|
| 166 | ->addOption( |
|
| 167 | InputOptionKeys::PID_FILENAME, |
|
| 168 | null, |
|
| 169 | InputOption::VALUE_REQUIRED, |
|
| 170 | 'The explicit PID filename to use', |
|
| 171 | sprintf('%s/%s', sys_get_temp_dir(), Configuration::PID_FILENAME) |
|
| 172 | ); |
|
| 173 | } |
|
| 174 | ||
| 175 | /** |
|
| 176 | * Factory implementation to create a new initialized configuration instance. |
|
| 177 | * |
|
| 178 | * If command line options are specified, they will always override the |
|
| 179 | * values found in the configuration file. |
|
| 180 | * |
|
| 181 | * @param \Symfony\Component\Console\Input\InputInterface $input The Symfony console input instance |
|
| 182 | * |
|
| 183 | * @return \TechDivision\Import\Cli\Configuration The configuration instance |
|
| 184 | * @throws \Exception Is thrown, if the specified configuration file doesn't exist |
|
| 185 | */ |
|
| 186 | protected function configurationFactory(InputInterface $input) |
|
| 187 | { |
|
| 188 | ||
| 189 | // load the configuration filename we want to use |
|
| 190 | $filename = $input->getOption(InputOptionKeys::CONFIGURATION); |
|
| 191 | ||
| 192 | // load the JSON data |
|
| 193 | if (!$jsonData = file_get_contents($filename)) { |
|
| 194 | throw new \Exception(sprintf('Can\'t load configuration file %s', $filename)); |
|
| 195 | } |
|
| 196 | ||
| 197 | // initialize the JMS serializer and load the configuration |
|
| 198 | $serializer = SerializerBuilder::create()->build(); |
|
| 199 | /** @var \TechDivision\Import\Cli\Configuration $instance */ |
|
| 200 | $instance = $serializer->deserialize($jsonData, 'TechDivision\Import\Cli\Configuration', 'json'); |
|
| 201 | ||
| 202 | // query whether or not an operation name has been specified as command line |
|
| 203 | // option, if yes override the value from the configuration file |
|
| 204 | if ($input->hasArgument(InputArgumentKeys::OPERATION_NAME)) { |
|
| 205 | $instance->setOperationName($input->getArgument(InputArgumentKeys::OPERATION_NAME)); |
|
| 206 | } |
|
| 207 | ||
| 208 | // query whether or not a Magento installation directory has been specified as command line |
|
| 209 | // option, if yes override the value from the configuration file |
|
| 210 | if ($installationDir = $input->getOption(InputOptionKeys::INSTALLATION_DIR)) { |
|
| 211 | $instance->setInstallationDir($installationDir); |
|
| 212 | } |
|
| 213 | ||
| 214 | // query whether or not a directory for the source files has been specified as command line |
|
| 215 | // option, if yes override the value from the configuration file |
|
| 216 | if ($sourceDir = $input->getOption(InputOptionKeys::SOURCE_DIR)) { |
|
| 217 | $instance->setSourceDir($sourceDir); |
|
| 218 | } |
|
| 219 | ||
| 220 | // query whether or not a directory containing the imported files has been specified as command line |
|
| 221 | // option, if yes override the value from the configuration file |
|
| 222 | if ($targetDir = $input->getOption(InputOptionKeys::TARGET_DIR)) { |
|
| 223 | $instance->setTargetDir($targetDir); |
|
| 224 | } |
|
| 225 | ||
| 226 | // query whether or not a source date format has been specified as command |
|
| 227 | // line option, if yes override the value from the configuration file |
|
| 228 | if ($sourceDateFormat = $input->getOption(InputOptionKeys::SOURCE_DATE_FORMAT)) { |
|
| 229 | $instance->setSourceDateFormat($sourceDateFormat); |
|
| 230 | } |
|
| 231 | ||
| 232 | // query whether or not a Magento edition has been specified as command line |
|
| 233 | // option, if yes override the value from the configuration file |
|
| 234 | if ($magentoEdition = $input->getOption(InputOptionKeys::MAGENTO_EDITION)) { |
|
| 235 | $instance->setMagentoEdition($magentoEdition); |
|
| 236 | } |
|
| 237 | ||
| 238 | // query whether or not a Magento version has been specified as command line |
|
| 239 | // option, if yes override the value from the configuration file |
|
| 240 | if ($magentoVersion = $input->getOption(InputOptionKeys::MAGENTO_VERSION)) { |
|
| 241 | $instance->setMagentoVersion($magentoVersion); |
|
| 242 | } |
|
| 243 | ||
| 244 | // query whether or not a DB ID has been specified as command line |
|
| 245 | // option, if yes override the value from the configuration file |
|
| 246 | if ($useDbId = $input->getOption(InputOptionKeys::USE_DB_ID)) { |
|
| 247 | $instance->setUseDbId($useDbId); |
|
| 248 | } else { |
|
| 249 | // query whether or not a PDO DSN has been specified as command line |
|
| 250 | // option, if yes override the value from the configuration file |
|
| 251 | if ($dsn = $input->getOption(InputOptionKeys::DB_PDO_DSN)) { |
|
| 252 | // first REMOVE all other database configurations |
|
| 253 | $instance->clearDatabases(); |
|
| 254 | ||
| 255 | // initialize a new database configuration |
|
| 256 | $database = new Database(); |
|
| 257 | $database->setId(Uuid::uuid4()->__toString()); |
|
| 258 | $database->setDefault(true); |
|
| 259 | $database->setDsn($dsn); |
|
| 260 | ||
| 261 | // query whether or not a DB username has been specified as command line |
|
| 262 | // option, if yes override the value from the configuration file |
|
| 263 | if ($username = $input->getOption(InputOptionKeys::DB_USERNAME)) { |
|
| 264 | $database->setUsername($username); |
|
| 265 | } |
|
| 266 | ||
| 267 | // query whether or not a DB password has been specified as command line |
|
| 268 | // option, if yes override the value from the configuration file |
|
| 269 | if ($password = $input->getOption(InputOptionKeys::DB_PASSWORD)) { |
|
| 270 | $database->setPassword($password); |
|
| 271 | } |
|
| 272 | ||
| 273 | // add the database configuration |
|
| 274 | $instance->addDatabase($database); |
|
| 275 | } |
|
| 276 | } |
|
| 277 | ||
| 278 | // query whether or not the debug mode has been specified as command line |
|
| 279 | // option, if yes override the value from the configuration file |
|
| 280 | if ($debugMode = $input->getOption(InputOptionKeys::DEBUG_MODE)) { |
|
| 281 | $instance->setDebugMode($instance->mapBoolean($debugMode)); |
|
| 282 | } |
|
| 283 | ||
| 284 | // query whether or not the ignore PID flag has been specified as command line |
|
| 285 | // option, if yes override the value from the configuration file |
|
| 286 | if ($ignorePid = $input->getOption(InputOptionKeys::IGNORE_PID)) { |
|
| 287 | $instance->setIgnorePid($instance->mapBoolean($ignorePid)); |
|
| 288 | } |
|
| 289 | ||
| 290 | // query whether or not the log level has been specified as command line |
|
| 291 | // option, if yes override the value from the configuration file |
|
| 292 | if ($logLevel = $input->getOption(InputOptionKeys::LOG_LEVEL)) { |
|
| 293 | $instance->setLogLevel($logLevel); |
|
| 294 | } |
|
| 295 | ||
| 296 | // query whether or not a PID filename has been specified as command line |
|
| 297 | // option, if yes override the value from the configuration file |
|
| 298 | if ($pidFilename = $input->getOption(InputOptionKeys::PID_FILENAME)) { |
|
| 299 | $instance->setPidFilename($pidFilename); |
|
| 300 | } |
|
| 301 | ||
| 302 | // extend the plugins with the main configuration instance |
|
| 303 | /** @var \TechDivision\Import\Cli\Configuration\Subject $subject */ |
|
| 304 | foreach ($instance->getPlugins() as $plugin) { |
|
| 305 | // set the configuration instance on the plugin |
|
| 306 | $plugin->setConfiguration($instance); |
|
| 307 | ||
| 308 | // query whether or not the plugin has subjects configured |
|
| 309 | if ($subjects = $plugin->getSubjects()) { |
|
| 310 | // extend the plugin's subjects with the main configuration instance |
|
| 311 | /** @var \TechDivision\Import\Cli\Configuration\Subject $subject */ |
|
| 312 | foreach ($subjects as $subject) { |
|
| 313 | // set the configuration instance on the subject |
|
| 314 | $subject->setConfiguration($instance); |
|
| 315 | } |
|
| 316 | } |
|
| 317 | } |
|
| 318 | ||
| 319 | // query whether or not the debug mode is enabled and log level |
|
| 320 | // has NOT been overwritten with a commandline option |
|
| 321 | if ($instance->isDebugMode() && !$input->getOption(InputOptionKeys::LOG_LEVEL)) { |
|
| 322 | // set debug log level, if log level has NOT been overwritten on command line |
|
| 323 | $instance->setLogLevel(LogLevel::DEBUG); |
|
| 324 | } |
|
| 325 | ||
| 326 | // return the initialized configuration instance |
|
| 327 | return $instance; |
|
| 328 | } |
|
| 329 | ||
| 330 | /** |
|
| 331 | * Executes the current command. |
|
| 332 | * |
|
| 333 | * This method is not abstract because you can use this class |
|
| 334 | * as a concrete class. In this case, instead of defining the |
|
| 335 | * execute() method, you set the code to execute by passing |
|
| 336 | * a Closure to the setCode() method. |
|
| 337 | * |
|
| 338 | * @param \Symfony\Component\Console\Input\InputInterface $input An InputInterface instance |
|
| 339 | * @param \Symfony\Component\Console\Output\OutputInterface $output An OutputInterface instance |
|
| 340 | * |
|
| 341 | * @return null|int null or 0 if everything went fine, or an error code |
|
| 342 | * @throws \LogicException When this abstract method is not implemented |
|
| 343 | * @see \Symfony\Component\Console\Command\Command::execute() |
|
| 344 | */ |
|
| 345 | protected function execute(InputInterface $input, OutputInterface $output) |
|
| 346 | { |
|
| 347 | ||
| 348 | // register the JMS Serializer annotations |
|
| 349 | \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace( |
|
| 350 | 'JMS\Serializer\Annotation', |
|
| 351 | dirname(__DIR__).'/../vendor/jms/serializer/src' |
|
| 352 | ); |
|
| 353 | ||
| 354 | // load the specified configuration |
|
| 355 | $configuration = $this->configurationFactory($input); |
|
| 356 | ||
| 357 | // initialize the PDO connection |
|
| 358 | $dsn = $configuration->getDatabase()->getDsn(); |
|
| 359 | $username = $configuration->getDatabase()->getUsername(); |
|
| 360 | $password = $configuration->getDatabase()->getPassword(); |
|
| 361 | $connection = new \PDO($dsn, $username, $password); |
|
| 362 | $connection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); |
|
| 363 | ||
| 364 | // initialize the system logger |
|
| 365 | $systemLogger = new Logger('techdivision/import'); |
|
| 366 | $systemLogger->pushHandler( |
|
| 367 | new ErrorLogHandler( |
|
| 368 | ErrorLogHandler::OPERATING_SYSTEM, |
|
| 369 | $configuration->getLogLevel() |
|
| 370 | ) |
|
| 371 | ); |
|
| 372 | ||
| 373 | // initialize the registry/import processor |
|
| 374 | $registryProcessor = RegistryProcessorFactory::factory($connection, $configuration); |
|
| 375 | $importProcessor = ImportProcessorFactory::factory($connection, $configuration); |
|
| 376 | ||
| 377 | // initialize the importer |
|
| 378 | $importer = new Simple( |
|
| 379 | $systemLogger, |
|
| 380 | $registryProcessor, |
|
| 381 | $importProcessor, |
|
| 382 | $configuration, |
|
| 383 | $input, |
|
| 384 | $output |
|
| 385 | ); |
|
| 386 | ||
| 387 | // start the process |
|
| 388 | $importer->process(); |
|
| 389 | } |
|
| 390 | } |
|
| 391 | ||
| @@ 48-390 (lines=343) @@ | ||
| 45 | * @link https://github.com/techdivision/import-cli-simple |
|
| 46 | * @link http://www.techdivision.com |
|
| 47 | */ |
|
| 48 | class ImportProductsCommand extends Command |
|
| 49 | { |
|
| 50 | ||
| 51 | /** |
|
| 52 | * Configures the current command. |
|
| 53 | * |
|
| 54 | * @return void |
|
| 55 | * @see \Symfony\Component\Console\Command\Command::configure() |
|
| 56 | */ |
|
| 57 | protected function configure() |
|
| 58 | { |
|
| 59 | ||
| 60 | // initialize the command with the required/optional options |
|
| 61 | $this->setName('import:products') |
|
| 62 | ->setDescription('Imports products in the configured Magento 2 instance') |
|
| 63 | ->addArgument( |
|
| 64 | InputArgumentKeys::OPERATION_NAME, |
|
| 65 | InputArgument::OPTIONAL, |
|
| 66 | 'The operation that has to be used for the import, one of "add-update", "replace" or "delete"', |
|
| 67 | InputArgumentKeys::OPERATION_NAME_ARG_REPLACE |
|
| 68 | ) |
|
| 69 | ->addOption( |
|
| 70 | InputOptionKeys::CONFIGURATION, |
|
| 71 | null, |
|
| 72 | InputOption::VALUE_REQUIRED, |
|
| 73 | 'Specify the pathname to the configuration file to use', |
|
| 74 | sprintf('%s/techdivision-import.json', getcwd()) |
|
| 75 | ) |
|
| 76 | ->addOption( |
|
| 77 | InputOptionKeys::INSTALLATION_DIR, |
|
| 78 | null, |
|
| 79 | InputOption::VALUE_REQUIRED, |
|
| 80 | 'The Magento installation directory to which the files has to be imported' |
|
| 81 | ) |
|
| 82 | ->addOption( |
|
| 83 | InputOptionKeys::SOURCE_DIR, |
|
| 84 | null, |
|
| 85 | InputOption::VALUE_REQUIRED, |
|
| 86 | 'The directory that has to be watched for new files' |
|
| 87 | ) |
|
| 88 | ->addOption( |
|
| 89 | InputOptionKeys::TARGET_DIR, |
|
| 90 | null, |
|
| 91 | InputOption::VALUE_REQUIRED, |
|
| 92 | 'The target directory with the files that has been imported' |
|
| 93 | ) |
|
| 94 | ->addOption( |
|
| 95 | InputOptionKeys::UTILITY_CLASS_NAME, |
|
| 96 | null, |
|
| 97 | InputOption::VALUE_REQUIRED, |
|
| 98 | 'The utility class name with the SQL statements' |
|
| 99 | ) |
|
| 100 | ->addOption( |
|
| 101 | InputOptionKeys::PREFIX, |
|
| 102 | null, |
|
| 103 | InputOption::VALUE_REQUIRED, |
|
| 104 | 'The prefix of the CSV source file(s) that has/have to be imported' |
|
| 105 | ) |
|
| 106 | ->addOption( |
|
| 107 | InputOptionKeys::MAGENTO_EDITION, |
|
| 108 | null, |
|
| 109 | InputOption::VALUE_REQUIRED, |
|
| 110 | 'The Magento edition to be used, either one of CE or EE' |
|
| 111 | ) |
|
| 112 | ->addOption( |
|
| 113 | InputOptionKeys::MAGENTO_VERSION, |
|
| 114 | null, |
|
| 115 | InputOption::VALUE_REQUIRED, |
|
| 116 | 'The Magento version to be used, e. g. 2.1.2' |
|
| 117 | ) |
|
| 118 | ->addOption( |
|
| 119 | InputOptionKeys::SOURCE_DATE_FORMAT, |
|
| 120 | null, |
|
| 121 | InputOption::VALUE_REQUIRED, |
|
| 122 | 'The date format used in the CSV file(s)' |
|
| 123 | ) |
|
| 124 | ->addOption( |
|
| 125 | InputOptionKeys::USE_DB_ID, |
|
| 126 | null, |
|
| 127 | InputOption::VALUE_REQUIRED, |
|
| 128 | 'The explicit database ID used for the actual import process' |
|
| 129 | ) |
|
| 130 | ->addOption( |
|
| 131 | InputOptionKeys::DB_PDO_DSN, |
|
| 132 | null, |
|
| 133 | InputOption::VALUE_REQUIRED, |
|
| 134 | 'The DSN used to connect to the Magento database where the data has to be imported, e. g. mysql:host=127.0.0.1;dbname=magento' |
|
| 135 | ) |
|
| 136 | ->addOption( |
|
| 137 | InputOptionKeys::DB_USERNAME, |
|
| 138 | null, |
|
| 139 | InputOption::VALUE_REQUIRED, |
|
| 140 | 'The username used to connect to the Magento database' |
|
| 141 | ) |
|
| 142 | ->addOption( |
|
| 143 | InputOptionKeys::DB_PASSWORD, |
|
| 144 | null, |
|
| 145 | InputOption::VALUE_REQUIRED, |
|
| 146 | 'The password used to connect to the Magento database' |
|
| 147 | ) |
|
| 148 | ->addOption( |
|
| 149 | InputOptionKeys::LOG_LEVEL, |
|
| 150 | null, |
|
| 151 | InputOption::VALUE_REQUIRED, |
|
| 152 | 'The log level to use' |
|
| 153 | ) |
|
| 154 | ->addOption( |
|
| 155 | InputOptionKeys::IGNORE_PID, |
|
| 156 | null, |
|
| 157 | InputOption::VALUE_REQUIRED, |
|
| 158 | 'Whether or not an existing PID should be ignored or not' |
|
| 159 | ) |
|
| 160 | ->addOption( |
|
| 161 | InputOptionKeys::DEBUG_MODE, |
|
| 162 | null, |
|
| 163 | InputOption::VALUE_REQUIRED, |
|
| 164 | 'Whether use the debug mode or not' |
|
| 165 | ) |
|
| 166 | ->addOption( |
|
| 167 | InputOptionKeys::PID_FILENAME, |
|
| 168 | null, |
|
| 169 | InputOption::VALUE_REQUIRED, |
|
| 170 | 'The explicit PID filename to use', |
|
| 171 | sprintf('%s/%s', sys_get_temp_dir(), Configuration::PID_FILENAME) |
|
| 172 | ); |
|
| 173 | } |
|
| 174 | ||
| 175 | /** |
|
| 176 | * Factory implementation to create a new initialized configuration instance. |
|
| 177 | * |
|
| 178 | * If command line options are specified, they will always override the |
|
| 179 | * values found in the configuration file. |
|
| 180 | * |
|
| 181 | * @param \Symfony\Component\Console\Input\InputInterface $input The Symfony console input instance |
|
| 182 | * |
|
| 183 | * @return \TechDivision\Import\Cli\Configuration The configuration instance |
|
| 184 | * @throws \Exception Is thrown, if the specified configuration file doesn't exist |
|
| 185 | */ |
|
| 186 | protected function configurationFactory(InputInterface $input) |
|
| 187 | { |
|
| 188 | ||
| 189 | // load the configuration filename we want to use |
|
| 190 | $filename = $input->getOption(InputOptionKeys::CONFIGURATION); |
|
| 191 | ||
| 192 | // load the JSON data |
|
| 193 | if (!$jsonData = file_get_contents($filename)) { |
|
| 194 | throw new \Exception(sprintf('Can\'t load configuration file %s', $filename)); |
|
| 195 | } |
|
| 196 | ||
| 197 | // initialize the JMS serializer and load the configuration |
|
| 198 | $serializer = SerializerBuilder::create()->build(); |
|
| 199 | /** @var \TechDivision\Import\Cli\Configuration $instance */ |
|
| 200 | $instance = $serializer->deserialize($jsonData, 'TechDivision\Import\Cli\Configuration', 'json'); |
|
| 201 | ||
| 202 | // query whether or not an operation name has been specified as command line |
|
| 203 | // option, if yes override the value from the configuration file |
|
| 204 | if ($input->hasArgument(InputArgumentKeys::OPERATION_NAME)) { |
|
| 205 | $instance->setOperationName($input->getArgument(InputArgumentKeys::OPERATION_NAME)); |
|
| 206 | } |
|
| 207 | ||
| 208 | // query whether or not a Magento installation directory has been specified as command line |
|
| 209 | // option, if yes override the value from the configuration file |
|
| 210 | if ($installationDir = $input->getOption(InputOptionKeys::INSTALLATION_DIR)) { |
|
| 211 | $instance->setInstallationDir($installationDir); |
|
| 212 | } |
|
| 213 | ||
| 214 | // query whether or not a directory for the source files has been specified as command line |
|
| 215 | // option, if yes override the value from the configuration file |
|
| 216 | if ($sourceDir = $input->getOption(InputOptionKeys::SOURCE_DIR)) { |
|
| 217 | $instance->setSourceDir($sourceDir); |
|
| 218 | } |
|
| 219 | ||
| 220 | // query whether or not a directory containing the imported files has been specified as command line |
|
| 221 | // option, if yes override the value from the configuration file |
|
| 222 | if ($targetDir = $input->getOption(InputOptionKeys::TARGET_DIR)) { |
|
| 223 | $instance->setTargetDir($targetDir); |
|
| 224 | } |
|
| 225 | ||
| 226 | // query whether or not a source date format has been specified as command |
|
| 227 | // line option, if yes override the value from the configuration file |
|
| 228 | if ($sourceDateFormat = $input->getOption(InputOptionKeys::SOURCE_DATE_FORMAT)) { |
|
| 229 | $instance->setSourceDateFormat($sourceDateFormat); |
|
| 230 | } |
|
| 231 | ||
| 232 | // query whether or not a Magento edition has been specified as command line |
|
| 233 | // option, if yes override the value from the configuration file |
|
| 234 | if ($magentoEdition = $input->getOption(InputOptionKeys::MAGENTO_EDITION)) { |
|
| 235 | $instance->setMagentoEdition($magentoEdition); |
|
| 236 | } |
|
| 237 | ||
| 238 | // query whether or not a Magento version has been specified as command line |
|
| 239 | // option, if yes override the value from the configuration file |
|
| 240 | if ($magentoVersion = $input->getOption(InputOptionKeys::MAGENTO_VERSION)) { |
|
| 241 | $instance->setMagentoVersion($magentoVersion); |
|
| 242 | } |
|
| 243 | ||
| 244 | // query whether or not a DB ID has been specified as command line |
|
| 245 | // option, if yes override the value from the configuration file |
|
| 246 | if ($useDbId = $input->getOption(InputOptionKeys::USE_DB_ID)) { |
|
| 247 | $instance->setUseDbId($useDbId); |
|
| 248 | } else { |
|
| 249 | // query whether or not a PDO DSN has been specified as command line |
|
| 250 | // option, if yes override the value from the configuration file |
|
| 251 | if ($dsn = $input->getOption(InputOptionKeys::DB_PDO_DSN)) { |
|
| 252 | // first REMOVE all other database configurations |
|
| 253 | $instance->clearDatabases(); |
|
| 254 | ||
| 255 | // initialize a new database configuration |
|
| 256 | $database = new Database(); |
|
| 257 | $database->setId(Uuid::uuid4()->__toString()); |
|
| 258 | $database->setDefault(true); |
|
| 259 | $database->setDsn($dsn); |
|
| 260 | ||
| 261 | // query whether or not a DB username has been specified as command line |
|
| 262 | // option, if yes override the value from the configuration file |
|
| 263 | if ($username = $input->getOption(InputOptionKeys::DB_USERNAME)) { |
|
| 264 | $database->setUsername($username); |
|
| 265 | } |
|
| 266 | ||
| 267 | // query whether or not a DB password has been specified as command line |
|
| 268 | // option, if yes override the value from the configuration file |
|
| 269 | if ($password = $input->getOption(InputOptionKeys::DB_PASSWORD)) { |
|
| 270 | $database->setPassword($password); |
|
| 271 | } |
|
| 272 | ||
| 273 | // add the database configuration |
|
| 274 | $instance->addDatabase($database); |
|
| 275 | } |
|
| 276 | } |
|
| 277 | ||
| 278 | // query whether or not the debug mode has been specified as command line |
|
| 279 | // option, if yes override the value from the configuration file |
|
| 280 | if ($debugMode = $input->getOption(InputOptionKeys::DEBUG_MODE)) { |
|
| 281 | $instance->setDebugMode($instance->mapBoolean($debugMode)); |
|
| 282 | } |
|
| 283 | ||
| 284 | // query whether or not the ignore PID flag has been specified as command line |
|
| 285 | // option, if yes override the value from the configuration file |
|
| 286 | if ($ignorePid = $input->getOption(InputOptionKeys::IGNORE_PID)) { |
|
| 287 | $instance->setIgnorePid($instance->mapBoolean($ignorePid)); |
|
| 288 | } |
|
| 289 | ||
| 290 | // query whether or not the log level has been specified as command line |
|
| 291 | // option, if yes override the value from the configuration file |
|
| 292 | if ($logLevel = $input->getOption(InputOptionKeys::LOG_LEVEL)) { |
|
| 293 | $instance->setLogLevel($logLevel); |
|
| 294 | } |
|
| 295 | ||
| 296 | // query whether or not a PID filename has been specified as command line |
|
| 297 | // option, if yes override the value from the configuration file |
|
| 298 | if ($pidFilename = $input->getOption(InputOptionKeys::PID_FILENAME)) { |
|
| 299 | $instance->setPidFilename($pidFilename); |
|
| 300 | } |
|
| 301 | ||
| 302 | // extend the plugins with the main configuration instance |
|
| 303 | /** @var \TechDivision\Import\Cli\Configuration\Subject $subject */ |
|
| 304 | foreach ($instance->getPlugins() as $plugin) { |
|
| 305 | // set the configuration instance on the plugin |
|
| 306 | $plugin->setConfiguration($instance); |
|
| 307 | ||
| 308 | // query whether or not the plugin has subjects configured |
|
| 309 | if ($subjects = $plugin->getSubjects()) { |
|
| 310 | // extend the plugin's subjects with the main configuration instance |
|
| 311 | /** @var \TechDivision\Import\Cli\Configuration\Subject $subject */ |
|
| 312 | foreach ($subjects as $subject) { |
|
| 313 | // set the configuration instance on the subject |
|
| 314 | $subject->setConfiguration($instance); |
|
| 315 | } |
|
| 316 | } |
|
| 317 | } |
|
| 318 | ||
| 319 | // query whether or not the debug mode is enabled and log level |
|
| 320 | // has NOT been overwritten with a commandline option |
|
| 321 | if ($instance->isDebugMode() && !$input->getOption(InputOptionKeys::LOG_LEVEL)) { |
|
| 322 | // set debug log level, if log level has NOT been overwritten on command line |
|
| 323 | $instance->setLogLevel(LogLevel::DEBUG); |
|
| 324 | } |
|
| 325 | ||
| 326 | // return the initialized configuration instance |
|
| 327 | return $instance; |
|
| 328 | } |
|
| 329 | ||
| 330 | /** |
|
| 331 | * Executes the current command. |
|
| 332 | * |
|
| 333 | * This method is not abstract because you can use this class |
|
| 334 | * as a concrete class. In this case, instead of defining the |
|
| 335 | * execute() method, you set the code to execute by passing |
|
| 336 | * a Closure to the setCode() method. |
|
| 337 | * |
|
| 338 | * @param \Symfony\Component\Console\Input\InputInterface $input An InputInterface instance |
|
| 339 | * @param \Symfony\Component\Console\Output\OutputInterface $output An OutputInterface instance |
|
| 340 | * |
|
| 341 | * @return null|int null or 0 if everything went fine, or an error code |
|
| 342 | * @throws \LogicException When this abstract method is not implemented |
|
| 343 | * @see \Symfony\Component\Console\Command\Command::execute() |
|
| 344 | */ |
|
| 345 | protected function execute(InputInterface $input, OutputInterface $output) |
|
| 346 | { |
|
| 347 | ||
| 348 | // register the JMS Serializer annotations |
|
| 349 | \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace( |
|
| 350 | 'JMS\Serializer\Annotation', |
|
| 351 | dirname(__DIR__).'/../vendor/jms/serializer/src' |
|
| 352 | ); |
|
| 353 | ||
| 354 | // load the specified configuration |
|
| 355 | $configuration = $this->configurationFactory($input); |
|
| 356 | ||
| 357 | // initialize the PDO connection |
|
| 358 | $dsn = $configuration->getDatabase()->getDsn(); |
|
| 359 | $username = $configuration->getDatabase()->getUsername(); |
|
| 360 | $password = $configuration->getDatabase()->getPassword(); |
|
| 361 | $connection = new \PDO($dsn, $username, $password); |
|
| 362 | $connection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); |
|
| 363 | ||
| 364 | // initialize the system logger |
|
| 365 | $systemLogger = new Logger('techdivision/import'); |
|
| 366 | $systemLogger->pushHandler( |
|
| 367 | new ErrorLogHandler( |
|
| 368 | ErrorLogHandler::OPERATING_SYSTEM, |
|
| 369 | $configuration->getLogLevel() |
|
| 370 | ) |
|
| 371 | ); |
|
| 372 | ||
| 373 | // initialize the registry/import processor |
|
| 374 | $registryProcessor = RegistryProcessorFactory::factory($connection, $configuration); |
|
| 375 | $importProcessor = ImportProcessorFactory::factory($connection, $configuration); |
|
| 376 | ||
| 377 | // initialize the importer |
|
| 378 | $importer = new Simple( |
|
| 379 | $systemLogger, |
|
| 380 | $registryProcessor, |
|
| 381 | $importProcessor, |
|
| 382 | $configuration, |
|
| 383 | $input, |
|
| 384 | $output |
|
| 385 | ); |
|
| 386 | ||
| 387 | // start the process |
|
| 388 | $importer->process(); |
|
| 389 | } |
|
| 390 | } |
|
| 391 | ||