Exemple #1
0
    /**
     * Accumulate all static view files in the application and record all found areas, themes and languages
     *
     * Returns an array of areas and files with meta information
     *
     * @param array $requestedLocales
     * @return array
     */
    private function collectAppFiles($requestedLocales)
    {
        $areas = [];
        $locales = [];
        $files = $this->filesUtil->getStaticPreProcessingFiles();
        foreach ($files as $info) {
            list($area, $themePath, $locale) = $info;
            if ($themePath) {
                $areas[$area][$themePath] = $themePath;
            }
            if ($locale) {
                $locales[$locale] = $locale;
            }
        }
        foreach ($requestedLocales as $locale) {
            unset($locales[$locale]);
        }
        if (!empty($locales)) {
            $langList = implode(', ', $locales);
            $this->output->writeln(
                "WARNING: there were files for the following languages detected in the file system: {$langList}."
                . ' These languages were not requested, so the files will not be populated.'
            );
        }

        return [$areas, $files];
    }
Exemple #2
0
 /**
  * Populate all static view files for specified root path and list of languages
  *
  * @param ObjectManagerFactory $omFactory
  * @param array $locales
  * @param array $deployableAreaThemeMap
  * @return int
  * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  * @SuppressWarnings(PHPMD.NPathComplexity)
  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  */
 public function deploy(ObjectManagerFactory $omFactory, array $locales, array $deployableAreaThemeMap = [])
 {
     $this->omFactory = $omFactory;
     if ($this->getOption(Options::DRY_RUN)) {
         $this->output->writeln('Dry run. Nothing will be recorded to the target directory.');
     }
     $libFiles = $this->filesUtil->getStaticLibraryFiles();
     $appFiles = $this->filesUtil->getStaticPreProcessingFiles();
     foreach ($deployableAreaThemeMap as $area => $themes) {
         $this->emulateApplicationArea($area);
         foreach ($locales as $locale) {
             $this->emulateApplicationLocale($locale, $area);
             foreach ($themes as $themePath) {
                 $this->output->writeln("=== {$area} -> {$themePath} -> {$locale} ===");
                 $this->count = 0;
                 $this->errorCount = 0;
                 /** @var \Magento\Theme\Model\View\Design $design */
                 $design = $this->objectManager->create(\Magento\Theme\Model\View\Design::class);
                 $design->setDesignTheme($themePath, $area);
                 $assetRepo = $this->objectManager->create(\Magento\Framework\View\Asset\Repository::class, ['design' => $design]);
                 /** @var \Magento\RequireJs\Model\FileManager $fileManager */
                 $fileManager = $this->objectManager->create(\Magento\RequireJs\Model\FileManager::class, ['config' => $this->objectManager->create(\Magento\Framework\RequireJs\Config::class, ['assetRepo' => $assetRepo, 'design' => $design]), 'assetRepo' => $assetRepo]);
                 $fileManager->createRequireJsConfigAsset();
                 foreach ($appFiles as $info) {
                     list($fileArea, $fileTheme, , $module, $filePath, $fullPath) = $info;
                     if ($this->checkSkip($filePath)) {
                         continue;
                     }
                     if (($fileArea == $area || $fileArea == 'base') && ($fileTheme == '' || $fileTheme == $themePath || in_array($fileArea . Theme::THEME_PATH_SEPARATOR . $fileTheme, $this->findAncestors($area . Theme::THEME_PATH_SEPARATOR . $themePath)))) {
                         $compiledFile = $this->deployFile($filePath, $area, $themePath, $locale, $module, $fullPath);
                         if ($compiledFile !== '') {
                             $this->deployFile($compiledFile, $area, $themePath, $locale, $module, $fullPath);
                         }
                     }
                 }
                 foreach ($libFiles as $filePath) {
                     if ($this->checkSkip($filePath)) {
                         continue;
                     }
                     $compiledFile = $this->deployFile($filePath, $area, $themePath, $locale, null);
                     if ($compiledFile !== '') {
                         $this->deployFile($compiledFile, $area, $themePath, $locale, null);
                     }
                 }
                 if (!$this->getOption(Options::NO_JAVASCRIPT)) {
                     if ($this->jsTranslationConfig->dictionaryEnabled()) {
                         $dictionaryFileName = $this->jsTranslationConfig->getDictionaryFileName();
                         $this->deployFile($dictionaryFileName, $area, $themePath, $locale, null);
                     }
                     if ($this->getMinification()->isEnabled('js')) {
                         $fileManager->createMinResolverAsset();
                     }
                 }
                 $this->bundleManager->flush();
                 $this->output->writeln("\nSuccessful: {$this->count} files; errors: {$this->errorCount}\n---\n");
             }
         }
     }
     if (!($this->getOption(Options::NO_HTML_MINIFY) ?: !$this->getAssetConfig()->isMinifyHtml())) {
         $this->output->writeln('=== Minify templates ===');
         $this->count = 0;
         foreach ($this->filesUtil->getPhtmlFiles(false, false) as $template) {
             $this->htmlMinifier->minify($template);
             if ($this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
                 $this->output->writeln($template . " minified\n");
             } else {
                 $this->output->write('.');
             }
             $this->count++;
         }
         $this->output->writeln("\nSuccessful: {$this->count} files modified\n---\n");
     }
     $version = (new \DateTime())->getTimestamp();
     $this->output->writeln("New version of deployed files: {$version}");
     if (!$this->getOption(Options::DRY_RUN)) {
         $this->versionStorage->save($version);
     }
     if ($this->errorCount > 0) {
         // we must have an exit code higher than zero to indicate something was wrong
         return \Magento\Framework\Console\Cli::RETURN_FAILURE;
     }
     return \Magento\Framework\Console\Cli::RETURN_SUCCESS;
 }
 /**
  * @param Files $filesUtil
  * @return array
  * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  * @SuppressWarnings(PHPMD.NPathComplexity)
  */
 private function prepareDeployableEntities($filesUtil)
 {
     $magentoAreas = [];
     $magentoThemes = [];
     $magentoLanguages = [self::DEFAULT_LANGUAGE_VALUE];
     $areaThemeMap = [];
     $files = $filesUtil->getStaticPreProcessingFiles();
     foreach ($files as $info) {
         list($area, $themePath, $locale) = $info;
         if ($themePath) {
             $areaThemeMap[$area][$themePath] = $themePath;
         }
         if ($themePath && $area && !in_array($area, $magentoAreas)) {
             $magentoAreas[] = $area;
         }
         if ($locale && !in_array($locale, $magentoLanguages)) {
             $magentoLanguages[] = $locale;
         }
         if ($themePath && !in_array($themePath, $magentoThemes)) {
             $magentoThemes[] = $themePath;
         }
     }
     $areasInclude = $this->input->getOption(Options::AREA);
     $areasExclude = $this->input->getOption(Options::EXCLUDE_AREA);
     $this->checkAreasInput($magentoAreas, $areasInclude, $areasExclude);
     $deployableAreas = $this->getDeployableEntities($magentoAreas, $areasInclude, $areasExclude);
     $languagesInclude = $this->input->getArgument(self::LANGUAGES_ARGUMENT) ?: $this->input->getOption(Options::LANGUAGE);
     $languagesExclude = $this->input->getOption(Options::EXCLUDE_LANGUAGE);
     $this->checkLanguagesInput($languagesInclude, $languagesExclude);
     $deployableLanguages = $languagesInclude[0] == 'all' ? $this->getDeployableEntities($magentoLanguages, $languagesInclude, $languagesExclude) : $languagesInclude;
     $themesInclude = $this->input->getOption(Options::THEME);
     $themesExclude = $this->input->getOption(Options::EXCLUDE_THEME);
     $this->checkThemesInput($magentoThemes, $themesInclude, $themesExclude);
     $deployableThemes = $this->getDeployableEntities($magentoThemes, $themesInclude, $themesExclude);
     $deployableAreaThemeMap = [];
     $requestedThemes = [];
     foreach ($areaThemeMap as $area => $themes) {
         if (in_array($area, $deployableAreas) && ($themes = array_intersect($themes, $deployableThemes))) {
             $deployableAreaThemeMap[$area] = $themes;
             $requestedThemes += $themes;
         }
     }
     return [$deployableLanguages, $deployableAreaThemeMap, $requestedThemes];
 }