Chris@0: .`. Chris@0: * - `bitrix-d7-component` — copy the component to directory `bitrix/components//`. Chris@0: * - `bitrix-d7-template` — copy the template to directory `bitrix/templates/_`. Chris@0: * Chris@0: * You can set custom path to directory with Bitrix kernel in `composer.json`: Chris@0: * Chris@0: * ```json Chris@0: * { Chris@0: * "extra": { Chris@0: * "bitrix-dir": "s1/bitrix" Chris@0: * } Chris@0: * } Chris@0: * ``` Chris@0: * Chris@0: * @author Nik Samokhvalov Chris@0: * @author Denis Kulichkin Chris@0: */ Chris@0: class BitrixInstaller extends BaseInstaller Chris@0: { Chris@0: protected $locations = array( Chris@0: 'module' => '{$bitrix_dir}/modules/{$name}/', // deprecated, remove on the major release (Backward compatibility will be broken) Chris@0: 'component' => '{$bitrix_dir}/components/{$name}/', // deprecated, remove on the major release (Backward compatibility will be broken) Chris@0: 'theme' => '{$bitrix_dir}/templates/{$name}/', // deprecated, remove on the major release (Backward compatibility will be broken) Chris@0: 'd7-module' => '{$bitrix_dir}/modules/{$vendor}.{$name}/', Chris@0: 'd7-component' => '{$bitrix_dir}/components/{$vendor}/{$name}/', Chris@0: 'd7-template' => '{$bitrix_dir}/templates/{$vendor}_{$name}/', Chris@0: ); Chris@0: Chris@0: /** Chris@0: * @var array Storage for informations about duplicates at all the time of installation packages. Chris@0: */ Chris@0: private static $checkedDuplicates = array(); Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function inflectPackageVars($vars) Chris@0: { Chris@0: if ($this->composer->getPackage()) { Chris@0: $extra = $this->composer->getPackage()->getExtra(); Chris@0: Chris@0: if (isset($extra['bitrix-dir'])) { Chris@0: $vars['bitrix_dir'] = $extra['bitrix-dir']; Chris@0: } Chris@0: } Chris@0: Chris@0: if (!isset($vars['bitrix_dir'])) { Chris@0: $vars['bitrix_dir'] = 'bitrix'; Chris@0: } Chris@0: Chris@0: return parent::inflectPackageVars($vars); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function templatePath($path, array $vars = array()) Chris@0: { Chris@0: $templatePath = parent::templatePath($path, $vars); Chris@0: $this->checkDuplicates($templatePath, $vars); Chris@0: Chris@0: return $templatePath; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Duplicates search packages. Chris@0: * Chris@0: * @param string $path Chris@0: * @param array $vars Chris@0: */ Chris@0: protected function checkDuplicates($path, array $vars = array()) Chris@0: { Chris@0: $packageType = substr($vars['type'], strlen('bitrix') + 1); Chris@0: $localDir = explode('/', $vars['bitrix_dir']); Chris@0: array_pop($localDir); Chris@0: $localDir[] = 'local'; Chris@0: $localDir = implode('/', $localDir); Chris@0: Chris@0: $oldPath = str_replace( Chris@0: array('{$bitrix_dir}', '{$name}'), Chris@0: array($localDir, $vars['name']), Chris@0: $this->locations[$packageType] Chris@0: ); Chris@0: Chris@0: if (in_array($oldPath, static::$checkedDuplicates)) { Chris@0: return; Chris@0: } Chris@0: Chris@0: if ($oldPath !== $path && file_exists($oldPath) && $this->io && $this->io->isInteractive()) { Chris@0: Chris@0: $this->io->writeError(' Duplication of packages:'); Chris@0: $this->io->writeError(' Package ' . $oldPath . ' will be called instead package ' . $path . ''); Chris@0: Chris@0: while (true) { Chris@0: switch ($this->io->ask(' Delete ' . $oldPath . ' [y,n,?]? ', '?')) { Chris@0: case 'y': Chris@0: $fs = new Filesystem(); Chris@0: $fs->removeDirectory($oldPath); Chris@0: break 2; Chris@0: Chris@0: case 'n': Chris@0: break 2; Chris@0: Chris@0: case '?': Chris@0: default: Chris@0: $this->io->writeError(array( Chris@0: ' y - delete package ' . $oldPath . ' and to continue with the installation', Chris@0: ' n - don\'t delete and to continue with the installation', Chris@0: )); Chris@0: $this->io->writeError(' ? - print help'); Chris@0: break; Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: static::$checkedDuplicates[] = $oldPath; Chris@0: } Chris@0: }