Subida del módulo y tema de PrestaShop

This commit is contained in:
Kaloyan
2026-04-09 18:31:51 +02:00
parent 12c253296f
commit 16b3ff9424
39262 changed files with 7418797 additions and 0 deletions

10
app/.htaccess Normal file
View File

@@ -0,0 +1,10 @@
# Apache 2.2
<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
# Apache 2.4
<IfModule mod_authz_core.c>
Require all denied
</IfModule>

17
app/AdminAPIKernel.php Normal file
View File

@@ -0,0 +1,17 @@
<?php
/**
* For the full copyright and license information, please view the
* docs/licenses/LICENSE.txt file that was distributed with this source code.
*/
declare(strict_types=1);
class AdminAPIKernel extends AppKernel
{
public const APP_ID = 'admin-api';
public function getAppId(): string
{
return self::APP_ID;
}
}

14
app/AdminKernel.php Normal file
View File

@@ -0,0 +1,14 @@
<?php
/**
* For the full copyright and license information, please view the
* docs/licenses/LICENSE.txt file that was distributed with this source code.
*/
class AdminKernel extends AppKernel
{
public const APP_ID = 'admin';
public function getAppId(): string
{
return self::APP_ID;
}
}

12
app/AppCache.php Normal file
View File

@@ -0,0 +1,12 @@
<?php
/**
* For the full copyright and license information, please view the
* docs/licenses/LICENSE.txt file that was distributed with this source code.
*/
require_once __DIR__ . '/AppKernel.php';
use Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache;
class AppCache extends HttpCache
{
}

312
app/AppKernel.php Normal file
View File

@@ -0,0 +1,312 @@
<?php
/**
* For the full copyright and license information, please view the
* docs/licenses/LICENSE.txt file that was distributed with this source code.
*/
use PrestaShop\PrestaShop\Adapter\Module\Repository\CachedModuleRepository;
use PrestaShop\PrestaShop\Adapter\Module\Repository\ModuleRepository;
use PrestaShop\PrestaShop\Adapter\SymfonyContainer;
use PrestaShop\PrestaShop\Core\Exception\CoreException;
use PrestaShop\PrestaShop\Core\Version;
use PrestaShop\TranslationToolsBundle\TranslationToolsBundle;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Symfony\Component\Cache\Adapter\NullAdapter;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\Config\Resource\FileExistenceResource;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Kernel;
abstract class AppKernel extends Kernel
{
public const VERSION = Version::VERSION;
public const MAJOR_VERSION_STRING = Version::MAJOR_VERSION_STRING;
public const MAJOR_VERSION = 9;
public const MINOR_VERSION = 1;
public const RELEASE_VERSION = 0;
/**
* @var CachedModuleRepository
*/
protected $moduleRepository = null;
abstract public function getAppId(): string;
/**
* {@inheritdoc}
*/
public function registerBundles(): iterable
{
$bundles = [
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
new Symfony\Bundle\SecurityBundle\SecurityBundle(),
new Symfony\Bundle\TwigBundle\TwigBundle(),
new Symfony\Bundle\MonologBundle\MonologBundle(),
new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
new ApiPlatform\Symfony\Bundle\ApiPlatformBundle(),
// PrestaShop Core bundle
new PrestaShopBundle\PrestaShopBundle($this),
// PrestaShop Translation parser
new TranslationToolsBundle(),
new FOS\JsRoutingBundle\FOSJsRoutingBundle(),
new Symfony\UX\TwigComponent\TwigComponentBundle(),
new Twig\Extra\TwigExtraBundle\TwigExtraBundle(),
new Symfony\UX\Icons\UXIconsBundle(),
];
if (in_array($this->getEnvironment(), ['dev', 'test'], true)) {
$bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle();
$bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
}
/* Will not work until PrestaShop is installed */
$installedModules = $this->getModuleRepository()->getInstalledModules();
if (!empty($installedModules)) {
try {
$this->enableComposerAutoloaderOnModules($installedModules);
} catch (Exception $e) {
}
}
return $bundles;
}
/**
* {@inheritdoc}
*/
public function boot()
{
parent::boot();
$this->cleanKernelReferences();
}
/**
* {@inheritdoc}
*/
public function shutdown()
{
parent::shutdown();
$this->cleanKernelReferences();
}
/**
* The kernel and especially its container is cached in several PrestaShop classes, services or components So we
* need to clear this cache everytime the kernel is shutdown, rebooted, reset, ...
*
* This is very important in test environment to avoid invalid mocks to stay accessible and used, but it's also
* important because we may need to reboot the kernel (during module installation, after currency is installed
* to reset CLDR cache, ...)
*/
protected function cleanKernelReferences(): void
{
// We have classes to access the container from legacy code, they need to be cleaned after reboot
Context::getContext()->container = null;
SymfonyContainer::resetStaticCache();
}
/**
* {@inheritdoc}
*/
public function getRootDir()
{
return __DIR__;
}
/**
* {@inheritdoc}
*/
public function getLogDir(): string
{
return dirname(__DIR__) . '/var/logs';
}
public function getCacheDir(): string
{
return $this->getProjectDir() . '/var/cache/' . $this->environment . '/' . $this->getAppId();
}
/**
* {@inheritdoc}
*
* @throws Exception
*/
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load($this->getKernelConfigPath());
$presentModules = $this->getModuleRepository()->getPresentModules();
// We only load translations of present modules (so their wording is usable during installation)
$moduleTranslationsPaths = [];
foreach ($presentModules as $presentModule) {
$modulePath = _PS_MODULE_DIR_ . $presentModule;
$translationsPath = sprintf('%s/translations', $modulePath);
if (is_dir($translationsPath)) {
$moduleTranslationsPaths[] = $translationsPath;
}
}
$activeModules = $this->getModuleRepository()->getActiveModules();
// We only load services of active modules (not simply installed)
foreach ($activeModules as $activeModulePath) {
$modulePath = _PS_MODULE_DIR_ . $activeModulePath;
$configFiles = [
sprintf('%s/config/services.yml', $modulePath),
sprintf('%s/config/admin/services.yml', $modulePath),
// @todo Uncomment to Load this file once we'll have a unique container
// sprintf('%s/config/front/services.yml', $modulePath),
];
foreach ($configFiles as $file) {
if (is_file($file)) {
$loader->load($file);
}
}
}
$installedModules = $this->getModuleRepository()->getInstalledModules();
$loader->load(function (ContainerBuilder $container) use ($moduleTranslationsPaths, $activeModules, $installedModules) {
$container->setParameter('container.autowiring.strict_mode', true);
$container->setParameter('container.dumper.inline_class_loader', false);
$container->setParameter('prestashop.module_dir', _PS_MODULE_DIR_);
/* @deprecated kernel.active_modules is deprecated. Use prestashop.active_modules instead. */
$container->setParameter('kernel.active_modules', $activeModules);
$container->setParameter('prestashop.active_modules', $activeModules);
$container->setParameter('prestashop.installed_modules', $installedModules);
$container->addObjectResource($this);
$container->setParameter('modules_translation_paths', $moduleTranslationsPaths);
// Define parameter for admin folder path
if (defined('PS_ADMIN_DIR') && is_dir(PS_ADMIN_DIR)) {
$adminDir = PS_ADMIN_DIR;
} elseif (defined('_PS_ADMIN_DIR_') && is_dir(_PS_ADMIN_DIR_)) {
$adminDir = _PS_ADMIN_DIR_;
} else {
// Look for potential admin folders, condition to meet:
// - first level folders in the project folder
// - contains a PHP file that define the const PS_ADMIN_DIR or _PS_ADMIN_DIR_
// - the first folder found is used (alphabetical order, but files named index.php have the highest priority)
$finder = new Symfony\Component\Finder\Finder();
$finder->files()
->name('*.php')
->contains('/define\([\'\"](_)?PS_ADMIN_DIR(_)?[\'\"]/')
->depth('== 1')
->sort(function (SplFileInfo $a, SplFileInfo $b): int {
// Prioritize files named index.php
if ($a->getFilename() === 'index.php') {
return -1;
}
return strcmp($a->getRealPath(), $b->getRealPath());
})
->in($this->getProjectDir())
;
foreach ($finder as $adminIndexFile) {
$adminDir = $adminIndexFile->getPath();
// Container freshness depends on this file existence
$container->addResource(new FileExistenceResource($adminIndexFile->getRealPath()));
break;
}
}
if (!isset($adminDir) || !is_dir($adminDir)) {
throw new CoreException('Could not detect admin folder, and const as not defined.');
}
$container->setParameter('prestashop.admin_dir', $adminDir);
$container->setParameter('prestashop.admin_folder_name', basename($adminDir));
// Container freshness depends on this folder existence
$container->addResource(new FileExistenceResource($adminDir));
});
}
/**
* If the app has a dedicated config file load it, else load the common one.
*
* @return string
*/
protected function getKernelConfigPath(): string
{
$dedicatedConfigFile = $this->getRootDir() . '/config/' . $this->getAppId() . '/config_' . $this->getEnvironment() . '.yml';
if (file_exists($dedicatedConfigFile)) {
return $dedicatedConfigFile;
}
return $this->getRootDir() . '/config/config_' . $this->getEnvironment() . '.yml';
}
/**
* Add default kernel parameters like kernel.app_id
*
* @return array
*/
protected function getKernelParameters(): array
{
return array_merge(
parent::getKernelParameters(),
[
'kernel.app_id' => $this->getAppId(),
'prestashop.legacy_cache_dir' => _PS_CACHE_DIR_,
],
);
}
/**
* Enable auto loading of module Composer autoloader if needed.
* Need to be done as earlier as possible in application lifecycle.
*
* Note: this feature is also manage in PrestaShop\PrestaShop\Adapter\ContainerBuilder
* for non Symfony environments.
*
* @param array $modules the list of modules
*/
private function enableComposerAutoloaderOnModules($modules)
{
$moduleDirectoryPath = rtrim(_PS_MODULE_DIR_, '/') . '/';
foreach ($modules as $module) {
$autoloader = $moduleDirectoryPath . $module . '/vendor/autoload.php';
if (file_exists($autoloader)) {
include_once $autoloader;
}
}
}
/**
* Gets the application root dir.
* Override Kernel due to the fact that we remove the composer.json in
* downloaded package. More we are not a framework and the root directory
* should always be the parent of this file.
*
* @return string The project root dir
*/
public function getProjectDir(): string
{
return realpath(__DIR__ . '/..');
}
protected function getModuleRepository(): CachedModuleRepository
{
if ($this->moduleRepository === null) {
if ($this->getEnvironment() === 'test') {
$cache = new NullAdapter();
} else {
$cache = new FilesystemAdapter('modules', 0, $this->getCacheDir());
}
$this->moduleRepository = new CachedModuleRepository(
new ModuleRepository(_PS_ROOT_DIR_, _PS_MODULE_DIR_),
$cache
);
}
return $this->moduleRepository;
}
/**
* Get App type of current Kernel based on kernel class name. (admin or front)
*
* @return string
*/
public function getAppType(): string
{
return $this instanceof FrontKernel ? 'front' : 'admin';
}
}

14
app/FrontKernel.php Normal file
View File

@@ -0,0 +1,14 @@
<?php
/**
* For the full copyright and license information, please view the
* docs/licenses/LICENSE.txt file that was distributed with this source code.
*/
class FrontKernel extends AppKernel
{
public const APP_ID = 'front';
public function getAppId(): string
{
return self::APP_ID;
}
}

View File

@@ -0,0 +1,706 @@
{
"af": {
"name": "Afrikaans (Afrikaans)",
"iso_code": "af",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "af-za",
"locale": "af-ZA"
},
"ag": {
"name": "Español AR (Spanish)",
"iso_code": "ag",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "es-ar",
"locale": "es-AR"
},
"ar": {
"name": "اللغة العربية (Arabic)",
"iso_code": "ar",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "1",
"language_code": "ar-sa",
"locale": "ar-SA"
},
"az": {
"name": "Azərbaycan dili (Azerbaijani)",
"iso_code": "az",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "az-az",
"locale": "az-AZ"
},
"bg": {
"name": "български език (Bulgarian)",
"iso_code": "bg",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "bg-bg",
"locale": "bg-BG"
},
"bn": {
"name": "বাংলা (Bengali)",
"iso_code": "bn",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "bn-bd",
"locale": "bn-BD"
},
"br": {
"name": "Português BR (Portuguese)",
"iso_code": "br",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "pt-br",
"locale": "pt-BR"
},
"bs": {
"name": "Bosanski (Bosnian)",
"iso_code": "bs",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "bs-ba",
"locale": "bs-BA"
},
"bz": {
"name": "Brezhoneg (Breton)",
"iso_code": "bz",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "bz",
"locale": "br-FR"
},
"ca": {
"name": "Català (Catalan)",
"iso_code": "ca",
"date_format_lite": "d/m/Y",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "ca-es",
"locale": "ca-ES",
"flag": "catalonia"
},
"cb": {
"name": "Español CO ( Spanish)",
"iso_code": "cb",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "es-co",
"locale": "es-CO"
},
"cs": {
"name": "Čeština (Czech)",
"iso_code": "cs",
"date_format_lite": "d.m.Y",
"date_format_full": "d.m.Y H:i:s",
"is_rtl": "0",
"language_code": "cs-cz",
"locale": "cs-CZ"
},
"da": {
"name": "Dansk (Danish)",
"iso_code": "da",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "da-dk",
"locale": "da-DK"
},
"de": {
"name": "Deutsch (German)",
"iso_code": "de",
"date_format_lite": "d.m.Y",
"date_format_full": "d.m.Y H:i:s",
"is_rtl": "0",
"language_code": "de-de",
"locale": "de-DE"
},
"dh": {
"name": "Deutsch CH (German)",
"iso_code": "dh",
"date_format_lite": "d.m.Y",
"date_format_full": "d.m.Y H:i:s",
"is_rtl": "0",
"language_code": "de-CH",
"locale": "de-CH"
},
"el": {
"name": "ελληνικά (Greek)",
"iso_code": "el",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "el-gr",
"locale": "el-GR"
},
"en": {
"name": "English (English)",
"iso_code": "en",
"date_format_lite": "m/d/Y",
"date_format_full": "m/d/Y H:i:s",
"is_rtl": "0",
"language_code": "en-us",
"locale": "en-US"
},
"eo": {
"name": "Esperanto",
"iso_code": "eo",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "eo-eo",
"locale": "eo-EO"
},
"es": {
"name": "Español (Spanish)",
"iso_code": "es",
"date_format_lite": "d/m/Y",
"date_format_full": "d/m/Y H:i:s",
"is_rtl": "0",
"language_code": "es-es",
"locale": "es-ES"
},
"et": {
"name": "Eesti keel (Estonian)",
"iso_code": "et",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "et-ee",
"locale": "et-EE"
},
"eu": {
"name": "Euskera (Basque)",
"iso_code": "eu",
"date_format_lite": "d/m/Y",
"date_format_full": "d/m/Y H:i:s",
"is_rtl": "0",
"language_code": "eu-es",
"locale": "eu-ES"
},
"fa": {
"name": "فارسى (Persian)",
"iso_code": "fa",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "1",
"language_code": "fa-ir",
"locale": "fa-IR"
},
"fi": {
"name": "Suomi (Finnish)",
"iso_code": "fi",
"date_format_lite": "d.m.Y",
"date_format_full": "d.m.Y H:i:s",
"is_rtl": "0",
"language_code": "fi-fi",
"locale": "fi-FI"
},
"tl": {
"name": "Wikang Tagalog (Filipino)",
"iso_code": "tl",
"date_format_lite": "Y-d-m",
"date_format_full": "Y-d-m H:i:s",
"is_rtl": "0",
"language_code": "tl-ph",
"locale": "tl-PH"
},
"fr": {
"name": "Français (French)",
"iso_code": "fr",
"date_format_lite": "d/m/Y",
"date_format_full": "d/m/Y H:i:s",
"is_rtl": "0",
"language_code": "fr-fr",
"locale": "fr-FR"
},
"ga": {
"name": "Gaeilge (Gaelic)",
"iso_code": "ga",
"date_format_lite": "dd/mm/yyyy",
"date_format_full": "dd/mm/yyyy HH:mm:ss",
"is_rtl": "0",
"language_code": "ga-ie",
"locale": "ga-IE"
},
"gb": {
"name": "English GB (English)",
"iso_code": "gb",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "en-gb",
"locale": "en-GB"
},
"gl": {
"name": "Galego (Galician)",
"iso_code": "gl",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "gl-es",
"locale": "gl-ES"
},
"gu": {
"name": "ગુજરાતી (Gujarati)",
"iso_code": "gu",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "gu-in",
"locale": "gu-IN"
},
"he": {
"name": "עברית (Hebrew)",
"iso_code": "he",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "1",
"language_code": "he-il",
"locale": "he-IL"
},
"hi": {
"name": "हिन्दी (Hindi)",
"iso_code": "hi",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "hi-in",
"locale": "hi-IN"
},
"hr": {
"name": "Hrvatski (Croatian)",
"iso_code": "hr",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "hr-hr",
"locale": "hr-HR"
},
"hu": {
"name": "Magyar (Hungarian)",
"iso_code": "hu",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "hu-hu",
"locale": "hu-HU"
},
"hy": {
"name": "Հայերէն (Armenian)",
"iso_code": "hy",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "hy",
"locale": "hy-AM"
},
"id": {
"name": "Bahasa Indonesia (Indonesian)",
"iso_code": "id",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "id-id",
"locale": "id-ID"
},
"it": {
"name": "Italiano (Italian)",
"iso_code": "it",
"date_format_lite": "d/m/Y",
"date_format_full": "d/m/Y H:i:s",
"is_rtl": "0",
"language_code": "it-it",
"locale": "it-IT"
},
"is": {
"name": "Íslenska (Icelandic)",
"iso_code": "is",
"date_format_lite": "d/m/Y",
"date_format_full": "d/m/Y H:i:s",
"is_rtl": "0",
"language_code": "is-is",
"locale": "is-IS"
},
"ja": {
"name": "日本語 (Japanese)",
"iso_code": "ja",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "ja-jp",
"locale": "ja-JP"
},
"ka": {
"name": "ქართული (Georgian)",
"iso_code": "ka",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "ka-ge",
"locale": "ka-GE"
},
"km": {
"name": "ភាសាខ្មែរ (Khmer)",
"iso_code": "km",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "km-kh",
"locale": "km-KH"
},
"ko": {
"name": "한국어 (Korean)",
"iso_code": "ko",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "ko",
"locale": "ko-KR"
},
"lo": {
"name": "ພາສາລາວ (Lao)",
"iso_code": "lo",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "lo-la",
"locale": "lo-LA"
},
"lt": {
"name": "Lietuvių kalba (Lithuanian)",
"iso_code": "lt",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "lt-lt",
"locale": "lt-LT"
},
"lv": {
"name": "Latviešu valoda (Latvian)",
"iso_code": "lv",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "lv-lv",
"locale": "lv-LV"
},
"mg": {
"name": "Malagasy",
"iso_code": "mg",
"date_format_lite": "d-m-Y",
"date_format_full": "d-m-Y H:i:s",
"is_rtl": "0",
"language_code": "mg-mg",
"locale": "mg-MG"
},
"mk": {
"name": "македонски (Macedonian)",
"iso_code": "mk",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "mk",
"locale": "mk-MK"
},
"ml": {
"name": "മലയാളം (Malayalam)",
"iso_code": "ml",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "ml-in",
"locale": "ml-IN"
},
"ms": {
"name": "Bahasa melayu (Malay)",
"iso_code": "ms",
"date_format_lite": "d MMMM yyyy",
"date_format_full": "d MMMM yyyy h:mm:ss",
"is_rtl": "0",
"language_code": "ms-my",
"locale": "ms-MY"
},
"mx": {
"name": "Español MX (Spanish)",
"iso_code": "mx",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "es-mx",
"locale": "es-MX"
},
"nl": {
"name": "Nederlands (Dutch)",
"iso_code": "nl",
"date_format_lite": "d-m-Y",
"date_format_full": "d-m-Y H:i:s",
"is_rtl": "0",
"language_code": "nl-nl",
"locale": "nl-NL"
},
"nn": {
"name": "Nynorsk (Norwegian)",
"iso_code": "nn",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "nn-no",
"locale": "nn-NO"
},
"no": {
"name": "Bokmål (Norwegian)",
"iso_code": "no",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "no-no",
"locale": "no-NO"
},
"pl": {
"name": "Polski (Polish)",
"iso_code": "pl",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "pl-pl",
"locale": "pl-PL"
},
"pe": {
"name": "Español PE (Spanish)",
"iso_code": "pe",
"date_format_lite": "d/m/Y",
"date_format_full": "d/m/Y H:i:s",
"is_rtl": "0",
"language_code": "es-pe",
"locale": "es-PE"
},
"pt": {
"name": "Português PT (Portuguese)",
"iso_code": "pt",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "pt-pt",
"locale": "pt-PT"
},
"qc": {
"name": "Français CA (French)",
"iso_code": "qc",
"date_format_lite": "d/m/Y",
"date_format_full": "d/m/Y H:i:s",
"is_rtl": "0",
"language_code": "fr-ca",
"locale": "fr-CA"
},
"ro": {
"name": "Română (Romanian)",
"iso_code": "ro",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "ro-ro",
"locale": "ro-RO"
},
"ru": {
"name": "Русский (Russian)",
"iso_code": "ru",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "ru-ru",
"locale": "ru-RU"
},
"sh": {
"name": "سنڌي (Sinhala)",
"iso_code": "sh",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "si-lk",
"locale": "si-LK"
},
"si": {
"name": "Slovenščina (Slovene)",
"iso_code": "si",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "sl-si",
"locale": "sl-SI"
},
"sk": {
"name": "Slovenčina (Slovak)",
"iso_code": "sk",
"date_format_lite": "d.m.Y",
"date_format_full": "d.m.Y H:i:s",
"is_rtl": "0",
"language_code": "sk-sk",
"locale": "sk-SK"
},
"sq": {
"name": "Shqip (Albanian)",
"iso_code": "sq",
"date_format_lite": "dd-mm-yyyy",
"date_format_full": "dd-mm-yyyy H:i:s",
"is_rtl": "0",
"language_code": "sq-al",
"locale": "sq-AL"
},
"sr": {
"name": "српски (Serbian)",
"iso_code": "sr",
"date_format_lite": "d. m. Y.",
"date_format_full": "d. m. Y. H:i:s",
"is_rtl": "0",
"language_code": "sr-cs",
"locale": "sr-CS"
},
"sv": {
"name": "Svenska (Swedish)",
"iso_code": "sv",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "sv-se",
"locale": "sv-SE"
},
"sw": {
"name": "Kiswahili (Swahili)",
"iso_code": "sw",
"date_format_lite": "n/d/Y",
"date_format_full": "n/d/Y H:i:s",
"is_rtl": "0",
"language_code": "sw-ke",
"locale": "sw-KE"
},
"ta": {
"name": "தமிழ் (Tamil)",
"iso_code": "ta",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "ta-in",
"locale": "ta-IN"
},
"th": {
"name": "ภาษาไทย (Thai)",
"iso_code": "th",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "th-th",
"locale": "th-TH"
},
"tr": {
"name": "Türkçe (Turkish)",
"iso_code": "tr",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "tr-tr",
"locale": "tr-TR"
},
"tw": {
"name": "繁體中文 (Traditional Chinese)",
"iso_code": "tw",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "zh-tw",
"locale": "zh-TW"
},
"ud": {
"name": "English (upside down)",
"iso_code": "ud",
"date_format_lite": "m/d/Y",
"date_format_full": "m/d/Y H:i:s",
"is_rtl": "0",
"language_code": "en-ud",
"locale": "en-UD",
"flag": "gb"
},
"ug": {
"name": "ئۇيغۇر (Uyghur)",
"iso_code": "ug",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "ug-cn",
"locale": "ug-CN"
},
"uk": {
"name": "Українська (Ukrainian)",
"iso_code": "uk",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "uk-ua",
"locale": "uk-UA"
},
"ur": {
"name": "اردو (Urdu)",
"iso_code": "ur",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "1",
"language_code": "ur",
"locale": "ur-PK"
},
"uz": {
"name": "Oʻzbek tili (Uzbek)",
"iso_code": "uz",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "uz-uz",
"locale": "uz-UZ"
},
"ve": {
"name": "Español VE (Spanish)",
"iso_code": "ve",
"date_format_lite": "d/m/Y",
"date_format_full": "d/m/Y H:i:s",
"is_rtl": "0",
"language_code": "es-ve",
"locale": "es-VE"
},
"vn": {
"name": "Tiếng Việt (Vietnamese)",
"iso_code": "vn",
"date_format_lite": "d/m/Y",
"date_format_full": "H:i:s d/m/Y",
"is_rtl": "0",
"language_code": "vi-vn",
"locale": "vi-VN"
},
"zh": {
"name": "中文 (Simplified Chinese)",
"iso_code": "zh",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "0",
"language_code": "zh-cn",
"locale": "zh-CN"
},
"ku": {
"name": "کوردی (Kurdish)",
"iso_code": "ku",
"date_format_lite": "Y-m-d",
"date_format_full": "Y-m-d H:i:s",
"is_rtl": "1",
"language_code": "ku-iq",
"locale": "ku-IQ"
}
}

View File

@@ -0,0 +1,14 @@
<?php
/**
* For the full copyright and license information, please view the
* docs/licenses/LICENSE.txt file that was distributed with this source code.
*/
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;

View File

@@ -0,0 +1,82 @@
{
"an": "an-AR",
"af": "af-ZA",
"ag": "es-AR",
"ar": "ar-SA",
"az": "az-AZ",
"bg": "bg-BG",
"bn": "bn-BD",
"bs": "bs-BA",
"br": "pt-BR",
"bz": "br-FR",
"ca": "ca-ES",
"cb": "es-CO",
"cs": "cs-CZ",
"da": "da-DK",
"de": "de-DE",
"dh": "de-CH",
"el": "el-GR",
"en": "en-US",
"eo": "eo-EO",
"es": "es-ES",
"et": "et-EE",
"eu": "eu-ES",
"fa": "fa-IR",
"fi": "fi-FI",
"tl": "tl-PH",
"fo": "fo-FO",
"fr": "fr-FR",
"ga": "ga-IE",
"gb": "en-GB",
"gl": "gl-ES",
"gu": "gu-IN",
"he": "he-IL",
"hi": "hi-IN",
"hr": "hr-HR",
"hu": "hu-HU",
"hy": "hy-AM",
"id": "id-ID",
"it": "it-IT",
"is": "is-IS",
"ja": "ja-JP",
"ka": "ka-GE",
"km": "km-KH",
"ko": "ko-KR",
"ku": "ku-IQ",
"lo": "lo-LA",
"lt": "lt-LT",
"lv": "lv-LV",
"mg": "mg-MG",
"mk": "mk-MK",
"ml": "ml-IN",
"ms": "ms-MY",
"mx": "es-MX",
"nl": "nl-NL",
"nn": "nn-NO",
"no": "no-NO",
"pl": "pl-PL",
"pe": "es-PE",
"pt": "pt-PT",
"qc": "fr-CA",
"ro": "ro-RO",
"ru": "ru-RU",
"sh": "si-LK",
"si": "sl-SI",
"sk": "sk-SK",
"sq": "sq-AL",
"sr": "sr-CS",
"sv": "sv-SE",
"sw": "sw-KE",
"ta": "ta-IN",
"te": "te-IN",
"th": "th-TH",
"tr": "tr-TR",
"tw": "zh-TW",
"ug": "ug-CN",
"uk": "uk-UA",
"ur": "ur-PK",
"uz": "uz-UZ",
"ve": "es-VE",
"vn": "vi-VN",
"zh": "zh-CN"
}

View File

@@ -0,0 +1,10 @@
# Apache 2.2
<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
# Apache 2.4
<IfModule mod_authz_core.c>
Require all denied
</IfModule>

View File

@@ -0,0 +1,590 @@
---
prestashop:
addons:
categories:
'440':
id_category: 440
order: 10
name: Administration
link: "/en/440-administration"
parent_link: "/en/2-prestashop-modules"
id_parent: 2
categories:
- id_category: '435'
name: Legal
id_parent: '440'
link_rewrite: legal
link: "/en/435-legal"
tab: administration
- id_category: '527'
name: Registration & Ordering Process
id_parent: '440'
link_rewrite: registration-ordering-process
link: "/en/527-registration-ordering-process"
tab: checkout
- id_category: '437'
name: Notifications & Automatic Emails
id_parent: '440'
link_rewrite: emails-notifications
link: "/en/437-emails-notifications"
tab: emailing
- id_category: '448'
name: Price Management
id_parent: '440'
link_rewrite: price-management
link: "/en/448-price-management"
tab: administration
- id_category: '441'
name: Order Management
id_parent: '440'
link_rewrite: order-management
link: "/en/441-order-management"
tab: administration
- id_category: '446'
name: Accounting & Invoicing
id_parent: '440'
link_rewrite: accounting-invoicing
link: "/en/446-accounting-invoicing"
tab: billing_invoicing
- id_category: '433'
name: Fast & Mass Update
id_parent: '440'
link_rewrite: fast-mass-updates
link: "/en/433-fast-mass-updates"
tab: quick_bulk_update
- id_category: '451'
name: Data Import & Export
id_parent: '440'
link_rewrite: data-import-export
link: "/en/451-data-import-export"
tab: export
- id_category: '452'
name: Third-party Data Integration (CRM, ERP...)
id_parent: '440'
link_rewrite: third-party-data-integrations-crm-erp
link: "/en/452-third-party-data-integrations-crm-erp"
tab: export
- id_category: '453'
name: Analytics & Statistics
id_parent: '440'
link_rewrite: analytics-statistics
link: "/en/453-analytics-statistics"
tab: analytics_stats
- id_category: '209'
name: Dashboards
id_parent: '440'
link_rewrite: dashboards
link: "/en/209-dashboards"
tab: administration
- id_category: '432'
name: Website Performance
id_parent: '440'
link_rewrite: website-performance
link: "/en/432-website-performance"
tab: administration
- id_category: '436'
name: International & Localization
id_parent: '440'
link_rewrite: international-localization
link: "/en/436-international-localization"
tab: i18n_localization
- id_category: '431'
name: Data migration & Backup
id_parent: '440'
link_rewrite: data-migration-backup
link: "/en/431-data-migration-backup"
tab: migration_tools
- id_category: '543'
name: Administrative Tools
id_parent: '440'
link_rewrite: administrative-tools
link: "/en/543-administrative-tools"
tab: administration
- id_category: '429'
name: Security & Access
id_parent: '440'
link_rewrite: website-security-access
link: "/en/429-website-security-access"
tab: administration
tab: administration
'455':
id_category: 455
order: 90
name: Facebook & Social Networks
link: "/en/455-facebook-social-networks"
parent_link: "/en/2-prestashop-modules"
id_parent: 2
categories:
- id_category: '456'
name: Share Buttons & Comments
id_parent: '455'
link_rewrite: share-buttons-comments
link: "/en/456-share-buttons-comments"
tab: social_networks
- id_category: '457'
name: Social Login & Connect
id_parent: '455'
link_rewrite: social-login-connect
link: "/en/457-social-login-connect"
tab: social_networks
- id_category: '458'
name: Social Rewards & Coupons
id_parent: '455'
link_rewrite: social-rewards-coupons
link: "/en/458-social-rewards-coupons"
tab: social_networks
- id_category: '459'
name: Products on Facebook & Social Networks
id_parent: '455'
link_rewrite: products-on-facebook-social-networks
link: "/en/459-products-on-facebook-social-networks"
tab: social_networks
- id_category: '539'
name: Social Widgets
id_parent: '455'
link_rewrite: social-widgets
link: "/en/539-social-widgets"
tab: social_networks
tab: advertising_marketing
'460':
id_category: 460
order: 40
name: Product Page
link: "/en/460-product-page"
parent_link: "/en/2-prestashop-modules"
id_parent: 2
categories:
- id_category: '462'
name: Visual Products
id_parent: '460'
link_rewrite: visual-products
link: "/en/462-visual-products"
tab: front_office_features
- id_category: '463'
name: Videos & Music
id_parent: '460'
link_rewrite: videos-music
link: "/en/463-videos-music"
tab: front_office_features
- id_category: '467'
name: Combinations & Product Customization
id_parent: '460'
link_rewrite: combinaisons-customization
link: "/en/467-combinaisons-customization"
tab: front_office_features
- id_category: '465'
name: Badges & Logos
id_parent: '460'
link_rewrite: labels-logos
link: "/en/465-labels-logos"
tab: front_office_features
- id_category: '466'
name: Sizes & Units
id_parent: '460'
link_rewrite: sizes-units
link: "/en/466-sizes-units"
tab: front_office_features
- id_category: '545'
name: Additional Information & Product Tab
id_parent: '460'
link_rewrite: additional-information-product-tab
link: "/en/545-additional-information-product-tab"
tab: front_office_features
tab: administration
'469':
id_category: 469
order: 100
name: Specialized Platforms
link: "/en/469-specialized-platforms"
parent_link: "/en/2-prestashop-modules"
id_parent: 2
categories:
- id_category: '434'
name: B2B
id_parent: '469'
link_rewrite: b2b
link: "/en/434-b2b"
tab: administration
- id_category: '443'
name: Dropshipping
id_parent: '469'
link_rewrite: dropshipping
link: "/en/443-dropshipping"
tab: shipping_logistics
- id_category: '474'
name: Virtual Products
id_parent: '469'
link_rewrite: virtual-products
link: "/en/474-virtual-products"
tab: administration
- id_category: '529'
name: Subscription Products (box)
id_parent: '469'
link_rewrite: subscription-products
link: "/en/529-subscription-products"
tab: pricing_promotion
- id_category: '472'
name: Marketplace Creation
id_parent: '469'
link_rewrite: marketplace-creation
link: "/en/472-marketplace-creation"
tab: administration
- id_category: '473'
name: Reservation & Rental System
id_parent: '469'
link_rewrite: reservation-rental-system
link: "/en/473-reservation-rental-system"
tab: administration
- id_category: '470'
name: Auction Site
id_parent: '469'
link_rewrite: build-auction-site
link: "/en/470-build-auction-site"
tab: pricing_promotion
- id_category: '623'
name: Food & Restaurants
id_parent: '469'
link_rewrite: food-restaurants
link: "/en/623-food-restaurants"
tab: others
'475':
id_category: 475
order: 80
name: Customers
link: "/en/475-customers"
parent_link: "/en/2-prestashop-modules"
id_parent: 2
categories:
- id_category: '480'
name: Customer Reviews
id_parent: '475'
link_rewrite: customer-reviews
link: "/en/480-customer-reviews"
tab: front_office_features
- id_category: '537'
name: Customer Administration
id_parent: '475'
link_rewrite: customer-administration
link: "/en/537-customer-administration"
tab: administration
- id_category: '438'
name: Quotes
id_parent: '475'
link_rewrite: quotes
link: "/en/438-quotes"
tab: front_office_features
- id_category: '442'
name: Customer Service
id_parent: '475'
link_rewrite: customer-service
link: "/en/442-customer-service"
tab: administration
- id_category: '476'
name: Contact Forms & Surveys
id_parent: '475'
link_rewrite: contact-forms-surveys
link: "/en/476-contact-forms-surveys"
tab: front_office_features
- id_category: '479'
name: FAQ (Frequently Asked Questions)
id_parent: '475'
link_rewrite: faq-frequently-asked-questions
link: "/en/479-faq-frequently-asked-questions"
tab: front_office_features
- id_category: '477'
name: Support & Online Chat
id_parent: '475'
link_rewrite: support-online-chat
link: "/en/477-support-online-chat"
tab: front_office_features
tab: administration
'481':
id_category: 481
order: 50
name: Payment
link: "/en/481-payment"
parent_link: "/en/2-prestashop-modules"
id_parent: 2
categories:
- id_category: '482'
name: Payment by Card or Wallet
id_parent: '481'
link_rewrite: payment-card-wallet
link: "/en/482-payment-card-wallet"
tab: payments_gateways
- id_category: '534'
name: Bank Transfer Payment
id_parent: '481'
link_rewrite: bank-transfer-payment
link: "/en/534-bank-transfer-payment"
tab: payments_gateways
- id_category: '483'
name: Payment by Invoice
id_parent: '481'
link_rewrite: payment-invoice
link: "/en/483-payment-invoice"
tab: payments_gateways
- id_category: '486'
name: Prepayment
id_parent: '481'
link_rewrite: prepayment
link: "/en/486-prepayment"
tab: payments_gateways
- id_category: '485'
name: Cash On Delivery (COD)
id_parent: '481'
link_rewrite: cash-on-delivery-cod
link: "/en/485-cash-on-delivery-cod"
tab: payments_gateways
- id_category: '484'
name: Payment in Physical Stores
id_parent: '481'
link_rewrite: payment-physical-stores
link: "/en/484-payment-physical-stores"
tab: payments_gateways
- id_category: '487'
name: Point of Sale (POS)
id_parent: '481'
link_rewrite: point-of-sale-pos
link: "/en/487-point-of-sale-pos"
tab: payments_gateways
- id_category: '530'
name: Other Payment Methods
id_parent: '481'
link_rewrite: other-payment-methods
link: "/en/530-other-payment-methods"
tab: payments_gateways
- id_category: '627'
name: Recurring payment (subscription)
id_parent: '481'
link_rewrite: recurring-payment-subscription
link: "/en/627-recurring-payment-subscription"
tab: payments_gateways
'488':
id_category: 488
order: 70
name: Traffic & Marketplaces
link: "/en/488-traffic-marketplaces"
parent_link: "/en/2-prestashop-modules"
id_parent: 2
categories:
- id_category: '489'
name: Marketplaces
id_parent: '488'
link_rewrite: marketplaces
link: "/en/489-marketplaces"
tab: market_place
- id_category: '490'
name: Price Comparison
id_parent: '488'
link_rewrite: price-comparison
link: "/en/490-price-comparison"
tab: smart_shopping
- id_category: '491'
name: SEO
id_parent: '488'
link_rewrite: seo-natural-search-engine-optimization
link: "/en/491-seo-natural-search-engine-optimization"
tab: seo
- id_category: '531'
name: URL & Redirects
id_parent: '488'
link_rewrite: url-redirects
link: "/en/531-url-redirects"
tab: seo
- id_category: '495'
name: Blog, Forum & News
id_parent: '488'
link_rewrite: blog-forum-new
link: "/en/495-blog-forum-new"
tab: content_management
- id_category: '493'
name: SEA SEM (paid advertising) & Affiliation Platforms
id_parent: '488'
link_rewrite: sea-paid-advertising-affiliation-platforms
link: "/en/493-sea-paid-advertising-affiliation-platforms"
tab: advertising_marketing
tab: checkout
'496':
id_category: 496
order: 30
name: Promotions & Marketing
link: "/en/496-promotions-marketing"
parent_link: "/en/2-prestashop-modules"
id_parent: 2
categories:
- id_category: '500'
name: Newsletter & SMS
id_parent: '496'
link_rewrite: newsletter-sms
link: "/en/500-newsletter-sms"
tab: emailing
- id_category: '497'
name: Promotions & Gifts
id_parent: '496'
link_rewrite: promotions-gifts
link: "/en/497-promotions-gifts"
tab: pricing_promotion
- id_category: '503'
name: Referral & Loyalty Programs
id_parent: '496'
link_rewrite: referral-loyalty-programs
link: "/en/503-referral-loyalty-programs"
tab: advertising_marketing
- id_category: '499'
name: Flash & Private Sales
id_parent: '496'
link_rewrite: private-sales-flash-sales
link: "/en/499-private-sales-flash-sales"
tab: pricing_promotion
- id_category: '501'
name: Remarketing & Shopping Cart Abandonment
id_parent: '496'
link_rewrite: remarketing-shopping-cart-abandonment
link: "/en/501-remarketing-shopping-cart-abandonment"
tab: advertising_marketing
- id_category: '505'
name: Cross-selling & Product Bundles
id_parent: '496'
link_rewrite: cross-selling-product-bundles
link: "/en/505-cross-selling-product-bundles"
tab: merchandizing
- id_category: '502'
name: Pop-up
id_parent: '496'
link_rewrite: pop-up
link: "/en/502-pop-up"
tab: front_office_features
- id_category: '533'
name: Contests
id_parent: '496'
link_rewrite: contests
link: "/en/533-contests"
tab: advertising_marketing
- id_category: '504'
name: 'Wishlist & Gift Card '
id_parent: '496'
link_rewrite: wishlist-gift-card
link: "/en/504-wishlist-gift-card"
tab: front_office_features
tab: pricing_promotion
'507':
id_category: 507
order: 20
name: Design & Navigation
link: "/en/507-design-navigation"
parent_link: "/en/2-prestashop-modules"
id_parent: 2
categories:
- id_category: '513'
name: Menu
id_parent: '507'
link_rewrite: menu
link: "/en/513-menu"
tab: front_office_features
- id_category: '517'
name: Blocks, Tabs & Banners
id_parent: '507'
link_rewrite: blocks-tabs-banners
link: "/en/517-blocks-tabs-banners"
tab: front_office_features
- id_category: '461'
name: Sliders & Galleries
id_parent: '507'
link_rewrite: sliders-galleries
link: "/en/461-sliders-galleries"
tab: slideshows
- id_category: '510'
name: Search & Filters
id_parent: '507'
link_rewrite: search-filters
link: "/en/510-search-filters"
tab: search_filter
- id_category: '516'
name: Page Customization
id_parent: '507'
link_rewrite: page-customization
link: "/en/516-page-customization"
tab: front_office_features
- id_category: '511'
name: Navigation Tools
id_parent: '507'
link_rewrite: navigation-tools
link: "/en/511-navigation-tools"
tab: front_office_features
- id_category: '538'
name: Products on Homepage
id_parent: '507'
link_rewrite: products-homepage
link: "/en/538-products-homepage"
tab: front_office_features
- id_category: '512'
name: Brands & Manufacturers
id_parent: '507'
link_rewrite: brands-manufacturers
link: "/en/512-brands-manufacturers"
tab: front_office_features
- id_category: '509'
name: Express Checkout Process
id_parent: '507'
link_rewrite: express-checkout-process
link: "/en/509-express-checkout-process"
tab: checkout
- id_category: '508'
name: Mobile
id_parent: '507'
link_rewrite: mobile
link: "/en/508-mobile"
tab: mobile
tab: front_office_features
'518':
id_category: 518
order: 60
name: Shipping & Logistics
link: "/en/518-shipping-logistics"
parent_link: "/en/2-prestashop-modules"
id_parent: 2
categories:
- id_category: '444'
name: Stock & Supplier Management
id_parent: '518'
link_rewrite: stock-supplier-management
link: "/en/444-stock-supplier-management"
tab: administration
- id_category: '519'
name: Preparation & Shipping
id_parent: '518'
link_rewrite: preparation-shipping
link: "/en/519-preparation-shipping"
tab: shipping_logistics
- id_category: '520'
name: Shipping Carriers
id_parent: '518'
link_rewrite: shipping-carriers
link: "/en/520-shipping-carriers"
tab: shipping_logistics
- id_category: '523'
name: Shipping Costs
id_parent: '518'
link_rewrite: shipping-costs
link: "/en/523-shipping-costs"
tab: shipping_logistics
- id_category: '521'
name: Collection Points & In-Store Pick Up
id_parent: '518'
link_rewrite: collection-points-in-store-pick-up
link: "/en/521-collection-points-in-store-pick-up"
tab: shipping_logistics
- id_category: '522'
name: Delivery Date
id_parent: '518'
link_rewrite: delivery-date
link: "/en/522-delivery-date"
tab: shipping_logistics
- id_category: '524'
name: Delivery Tracking
id_parent: '518'
link_rewrite: delivery-tracking
link: "/en/524-delivery-tracking"
tab: shipping_logistics
tab: shipping_logistics

View File

@@ -0,0 +1,30 @@
# Dedicated config for Oauth Endpoint, these are the common rules for all environments (dev, prod, test)
# They specify the dedicated security rules and routing mostly
imports:
- { resource: security.yml }
- { resource: services.yml }
framework:
router:
resource: "%kernel.project_dir%/app/config/admin-api/routing.yml"
strict_requirements: ~
api_platform:
formats:
json: [ 'application/json', 'application/merge-patch+json' ]
# Allow this format for other API endpoint than native endpoint (by default we will use json)
jsonld: [ 'application/ld+json' ]
# Multipart format for file upload
multipart: [ 'multipart/form-data' ]
patch_formats:
json: [ 'application/merge-patch+json' ]
error_formats:
json: [ 'application/json' ]
mapping:
paths:
- '%kernel.project_dir%/src/PrestaShopBundle/ApiPlatform/Resources'
oauth:
enabled: true
type: 'oauth2'
flow: 'clientCredentials'
tokenUrl: '/admin-api/access_token'

View File

@@ -0,0 +1,9 @@
imports:
- { resource: ../config_dev.yml }
- { resource: config.yml }
framework:
router:
resource: "%kernel.project_dir%/app/config/admin-api/routing_dev.yml"
strict_requirements: ~
profiler: { only_exceptions: false }

View File

@@ -0,0 +1,3 @@
imports:
- { resource: ../config_prod.yml }
- { resource: config.yml }

View File

@@ -0,0 +1,9 @@
imports:
- { resource: ../config_test.yml }
- { resource: config.yml }
framework:
router:
resource: "%kernel.project_dir%/app/config/admin-api/routing_test.yml"
strict_requirements: ~
profiler: { only_exceptions: false }

View File

@@ -0,0 +1,6 @@
_api_oauth2_routing:
resource: "@PrestaShopBundle/Resources/config/routing/admin-api.yml"
_api_platform_routing:
resource: .
type: api_platform

View File

@@ -0,0 +1,14 @@
_api_common:
resource: routing.yml
_wdt:
resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml"
prefix: /_wdt
_profiler:
resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml"
prefix: /_profiler
_errors:
resource: "@FrameworkBundle/Resources/config/routing/errors.xml"
prefix: /_error

View File

@@ -0,0 +1,5 @@
_api_common:
resource: routing.yml
test:
resource: "../../../tests/Resources/config/routes.yml"

View File

@@ -0,0 +1,28 @@
# Security rules for OAuth Application
security:
enable_authenticator_manager: true
password_hashers:
# auto hasher with default options for the User class (and children)
PrestaShopBundle\Entity\ApiClient: 'auto'
# auto hasher with custom options for all PasswordAuthenticatedUserInterface instances
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface:
algorithm: 'auto'
cost: 15
Symfony\Component\Security\Core\User\User: plaintext
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
api_token:
pattern: ^/access_token
security: false
main:
stateless: true
custom_authenticators:
- PrestaShop\PrestaShop\Core\Security\OAuth2\TokenAuthenticator

View File

@@ -0,0 +1,73 @@
# Dedicated services for OAuth app
services:
_defaults:
public: false
autowire: true
autoconfigure: true
PrestaShopBundle\EventListener\API\AdminAPIFeatureListener:
autowire: true
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 8 }
# CRITICAL this listener must have a priority greater than ApiPlatform ReadListener (which has a priority of 4)
# but it must be run AFTER the Firewall listener or the Security token won't be initialized yet (which has a
# priority of 8)
PrestaShopBundle\EventListener\API\ScopeCheckerListener:
autowire: true
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 7 }
# We set a high priority so this listener has a bigger one than ReadListener ApiPlatform (which has a priority of 4)
PrestaShopBundle\EventListener\API\Context\ApiClientContextListener:
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 7 }
# We set a high priority so this listener has a bigger one than ReadListener ApiPlatform (which has a priority of 4)
# but lower than the ApiClientListener because the listener depends on it
PrestaShopBundle\EventListener\API\Context\ShopContextListener:
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 6 }
# We set a high priority so this listener has a bigger one than ReadListener ApiPlatform (which has a priority of 4)
# but lower than the ShopContextListener because the listener depends on it
PrestaShopBundle\EventListener\API\Context\LanguageContextListener:
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 5 }
# We set a high priority so this listener has a bigger one than ReadListener ApiPlatform (which has a priority of 4)
# but lower than the ShopContextListener because the listener depends on it
PrestaShopBundle\EventListener\API\Context\CurrencyContextListener:
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 5 }
# We need to leave this under the LanguageContextListener for priorities.
PrestaShopBundle\EventListener\API\Context\ApiLegacyContextListener:
arguments:
$legacyBuilders:
- '@PrestaShop\PrestaShop\Core\Context\LanguageContextBuilder'
- '@PrestaShop\PrestaShop\Core\Context\CurrencyContextBuilder'
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 5 }
# SSL middleware
PrestaShopBundle\EventListener\API\SSLMiddlewareListener:
autowire: true
arguments:
$isDebug: '%kernel.debug%'
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
# Serializer modifications, the following services are automatically injected in the serializer Symfony service,
# to limit their impact on the Admin they are only defined for the API context.
# This normalizer disables the denormalization process of File fields
PrestaShopBundle\ApiPlatform\Normalizer\UploadedFileNormalizer:
autowire: true
autoconfigure: true
# Tag to be injected in the DomainSerializer
tags: [ 'prestashop.api.normalizers' ]
# This is the encoder to handle multipart requests for API
PrestaShopBundle\ApiPlatform\Encoder\MultipartDecoder:
autowire: true
autoconfigure: true

View File

@@ -0,0 +1,34 @@
# Dedicated config for Admin Endpoint, these are the common rules for all environments (dev, prod, test)
# They specify the dedicated security rules and routing mostly
imports:
- { resource: security.yml }
- { resource: services.yml }
framework:
router:
resource: "%kernel.project_dir%/app/config/admin/routing.yml"
strict_requirements: ~
session:
cookie_secure: 'auto'
ux_icons:
icon_dir: '%prestashop.admin_dir%/themes/new-theme/icons'
api_platform:
# Swagger API doc is accessible from the BackOffice, you need to be logged in to access it
title: Backoffice API
version: 0.1.0
enable_docs: true
enable_entrypoint: false
enable_swagger: true
enable_swagger_ui: true
enable_re_doc: true
docs_formats:
# This is used to allow using the Swagger UI in HTML presentation
html: [ 'text/html' ]
json: [ 'application/json' ]
oauth:
enabled: true
type: 'oauth2'
flow: 'clientCredentials'
tokenUrl: '/admin-api/access_token'

View File

@@ -0,0 +1,9 @@
imports:
- { resource: ../config_dev.yml }
- { resource: config.yml }
framework:
router:
resource: "%kernel.project_dir%/app/config/admin/routing_dev.yml"
strict_requirements: true
profiler: { only_exceptions: false }

View File

@@ -0,0 +1,8 @@
imports:
- { resource: ../config_prod.yml }
- { resource: config.yml }
# We use a custom error controller instead of templates override so that this is customized only for back office,
# or it messes with Admin API default error pages
framework:
error_controller: PrestaShopBundle\Controller\Admin\ErrorController::showAction

View File

@@ -0,0 +1,8 @@
imports:
- { resource: ../config_test.yml }
- { resource: config.yml }
framework:
router:
resource: "%kernel.project_dir%/app/config/admin/routing_test.yml"
strict_requirements: ~

View File

@@ -0,0 +1,9 @@
app:
# The main bundle is PrestaShopCoreBundle which will load other dependencies.
resource: "@PrestaShopBundle/Resources/config/routing.yml"
app_modules:
# Declare routing.yml file in modules/module-name/config folder.
# v1: only YAML format is supported for now.
resource: .
type: module

View File

@@ -0,0 +1,14 @@
_wdt:
resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml"
prefix: /_wdt
_profiler:
resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml"
prefix: /_profiler
_errors:
resource: "@FrameworkBundle/Resources/config/routing/errors.xml"
prefix: /_error
_main:
resource: routing.yml

View File

@@ -0,0 +1,5 @@
_main:
resource: routing.yml
test:
resource: "../../../tests/Resources/config/routes.yml"

View File

@@ -0,0 +1,51 @@
# Security rules for Admin Application
# To get started with security, check out the documentation:
# https://symfony.com/doc/current/security.html
security:
enable_authenticator_manager: true
password_hashers:
# auto hasher with custom options for all PasswordAuthenticatedUserInterface instances
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface:
algorithm: 'auto'
cost: 15
Symfony\Component\Security\Core\User\User: plaintext
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
in_memory:
memory: ~
admin:
id: prestashop.security.admin.provider
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
lazy: true
provider: admin
form_login:
login_path: admin_login
check_path: admin_login
username_parameter: email
password_parameter: passwd
success_handler: PrestaShopBundle\Security\Admin\AdminAuthenticationSuccessHandler
remember_me:
secret: "%kernel.secret%"
lifetime: "%prestashop.admin_cookie_lifetime%"
remember_me_parameter: stay_logged_in
signature_properties: [ 'password' ]
logout:
path: /logout
target: admin_login
access_control:
- { route: 'admin_login', roles: PUBLIC_ACCESS }
- { route: 'admin_homepage', roles: PUBLIC_ACCESS }
- { route: 'admin_request_password_reset', roles: PUBLIC_ACCESS }
- { route: 'admin_reset_password', roles: PUBLIC_ACCESS }
# Check it the legacy anonymous attribute has been set on the request (set by LegacyRouterChecker)
- { path: ^/, roles: IS_AUTHENTICATED, allow_if: 'request.attributes.has("_anonymous_controller") and request.attributes.get("_anonymous_controller") == true' }

View File

@@ -0,0 +1,76 @@
# Dedicated services for Admin app
services:
_defaults:
public: false
autowire: true
autoconfigure: true
# SECURITY
PrestaShopBundle\EventListener\Admin\TokenizedUrlsListener:
autowire: true
arguments:
$map: '@security.access_map'
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
PrestaShopBundle\EventListener\Admin\EmployeeSessionSubscriber:
autowire: true
autoconfigure: true
arguments:
$entityManager: '@doctrine.orm.default_entity_manager'
# Priority 40 to be called before the RouterListener (which has priority 32)
PrestaShopBundle\EventListener\Admin\LegacyUrlListener:
arguments:
- "@prestashop.bundle.routing.converter.legacy_url_converter"
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 40 }
# Priority 30 to be called after the RouterListener
PrestaShopBundle\EventListener\Admin\LegacyParametersListener:
arguments:
- "@prestashop.bundle.routing.converter.legacy_parameters_converter"
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 30 }
PrestaShopBundle\EventListener\Admin\AccessDeniedListener:
autowire: true
tags:
- { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
PrestaShopBundle\EventListener\Admin\AdminSecurityListener:
autowire: true
tags:
- { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
PrestaShopBundle\EventListener\Admin\BackUrlRedirectResponseListener:
arguments:
- '@PrestaShop\PrestaShop\Core\Util\Url\BackUrlProvider'
- "@prestashop.adapter.legacy.context"
tags:
- { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }
# Locale listener to define translator locale correctly
PrestaShopBundle\EventListener\Admin\UserLocaleSubscriber: ~
PrestaShopBundle\EventListener\Admin\DemoModeEnabledListener: ~
# Context listeners, these are event subscribers, so they define their priority themselves
PrestaShopBundle\EventListener\Admin\Context\EmployeeContextSubscriber: ~
PrestaShopBundle\EventListener\Admin\Context\LanguageContextSubscriber: ~
PrestaShopBundle\EventListener\Admin\Context\ShopContextSubscriber: ~
PrestaShopBundle\EventListener\Admin\Context\CurrencyContextSubscriber: ~
PrestaShopBundle\EventListener\Admin\Context\CountryContextSubscriber: ~
PrestaShopBundle\EventListener\Admin\Context\LegacyControllerContextSubscriber: ~
PrestaShopBundle\EventListener\Admin\Context\LegacyContextSubscriber:
autowire: true
autoconfigure: true
arguments:
$legacyBuilders: !tagged_iterator core.legacy_context_builder
# SSL middleware
PrestaShopBundle\EventListener\Admin\SSLMiddlewareListener:
autowire: true
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

118
app/config/config.yml Normal file
View File

@@ -0,0 +1,118 @@
imports:
- { resource: set_parameters.php }
- { resource: services.yml }
- { resource: addons/*.yml }
- { resource: doctrine.yml }
- { resource: messenger.yml }
# Put parameters here that don't need to change on each machine where the app is deployed
# http://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
translator.class: PrestaShopBundle\Translation\Translator
translator.data_collector: PrestaShopBundle\Translation\DataCollectorTranslator
prestashop_views: "%kernel.project_dir%/src/PrestaShopBundle/Resources/views"
admin_page: "%prestashop_views%/Admin"
env(PS_LOG_OUTPUT): "%kernel.logs_dir%/%kernel.environment%.log"
env(PS_LOG_MAX_FILES): '30'
env(PS_TRUSTED_PROXIES): ''
mail_themes_uri: "/mails/themes"
mail_themes_dir: "%kernel.project_dir%%mail_themes_uri%"
modules_translation_paths: [ ]
prestashop.controllers_all_shop_context:
- AdminAccess
- AdminFeatureFlag
- AdminLanguages
- AdminProfiles
- AdminSpecificPriceRule
- AdminStatuses
- AdminSecurity
- AdminSecuritySessionEmployee
- AdminSecuritySessionCustomer
- AdminTranslations
# Autowires Core controllers
services:
logger:
alias: monolog.logger
public: true
framework:
# proxies configuration, see https://symfony.com/doc/current/deployment/proxies.html
trusted_proxies: '%env(PS_TRUSTED_PROXIES)%'
assets:
version: !php/const PrestaShop\PrestaShop\Core\Version::VERSION
packages:
front_js:
base_path: '../js'
# esi: ~
secret: "%secret%"
translator:
fallbacks: [ "default" ]
paths: "%modules_translation_paths%"
form: ~
csrf_protection: ~
validation: { enable_attributes: true }
serializer: { enable_attributes: true }
default_locale: "%locale%"
trusted_hosts: ~
session:
handler_id: ~
fragments: ~
http_method_override: true
http_client: ~
cache:
pools:
'%cache.driver%':
adapter: '%cache.adapter%'
# Monolog configuration
monolog:
handlers:
main:
type: rotating_file
max_files: '%env(int:PS_LOG_MAX_FILES)%'
path: '%env(PS_LOG_OUTPUT)%'
level: notice
legacy:
type: service
id: prestashop.handler.log
level: warning
channels: [ app ]
# Twig Configuration
twig:
autoescape: "name"
debug: "%kernel.debug%"
strict_variables: "%kernel.debug%"
exception_controller: null
form_themes:
- '@PrestaShop/Admin/TwigTemplateForm/bootstrap_4_horizontal_layout.html.twig'
paths:
'%admin_page%/TwigTemplateForm': Twig
'%admin_page%/Common': Common
'%admin_page%/Configure/AdvancedParameters': AdvancedParameters
'%admin_page%/Configure/ShopParameters': ShopParameters
'%kernel.project_dir%/modules': Modules
'%mail_themes_dir%': MailThemes
'%prestashop_views%': PrestaShopCore
'%prestashop.admin_dir%/themes/new-theme': AdminNewTheme
globals:
ps: '@PrestaShopBundle\Twig\Layout\PrestaShopLayoutGlobalVariables'
webpack_server: false
multistore_field_prefix: !php/const PrestaShopBundle\Service\Form\MultistoreCheckboxEnabler::MULTISTORE_FIELD_PREFIX
modify_all_shops_prefix: !php/const PrestaShopBundle\Form\Extension\ModifyAllShopsExtension::MODIFY_ALL_SHOPS_PREFIX
disabling_switch_prefix: !php/const PrestaShopBundle\Form\Extension\DisablingSwitchExtension::FIELD_PREFIX
api_platform:
# API docs is disabled in the Admin environment, it is accessible via the oauth dedicated endpoint
enable_docs: false
enable_entrypoint: false
enable_swagger: false
enable_swagger_ui: false
# We define mapping in this common config because even though the API routes are only accessible via the admin-api endpoint we still need
# to parse the Api Platform resources to extract the scopes in the back-office
mapping:
paths:
- '%kernel.project_dir%/src/PrestaShopBundle/ApiPlatform/Resources'

43
app/config/config_dev.yml Normal file
View File

@@ -0,0 +1,43 @@
imports:
- { resource: config.yml }
web_profiler:
toolbar: '%use_debug_toolbar%'
intercept_redirects: false
monolog:
handlers:
main:
type: rotating_file
max_files: '%env(int:PS_LOG_MAX_FILES)%'
path: '%env(PS_LOG_OUTPUT)%'
level: debug
channels: [ "!event" ]
console:
type: console
bubble: false
verbosity_levels:
VERBOSITY_VERBOSE: INFO
VERBOSITY_VERY_VERBOSE: DEBUG
channels: [ "!doctrine" ]
console_very_verbose:
type: console
bubble: false
verbosity_levels:
VERBOSITY_VERBOSE: NOTICE
VERBOSITY_VERY_VERBOSE: NOTICE
VERBOSITY_DEBUG: DEBUG
channels: [ "doctrine" ]
# uncomment to get logging in your browser
# you may have to allow bigger header sizes in your Web server configuration
# firephp:
# type: firephp
# level: info
# chromephp:
# type: chromephp
# level: info
prestashop:
addons:
api_client:
ttl: 300 # 5min

View File

@@ -0,0 +1,14 @@
# This config file is destined for legacy containers built by PrestaShop core
# For now it is mainly used for Doctrine configuration, but in the future it could contain other extensions config
imports:
- { resource: doctrine.yml }
doctrine:
orm:
mappings:
# In front container we must define the mapping manually because PrestaShopBundle cannot do it
PrestaShopBundle\Entity:
type: annotation
dir: "%kernel.project_dir%/src/PrestaShopBundle/Entity"
is_bundle: false
prefix: PrestaShop

View File

@@ -0,0 +1,2 @@
imports:
- { resource: config_legacy.yml }

View File

@@ -0,0 +1,14 @@
imports:
- { resource: config_legacy.yml }
doctrine:
orm:
metadata_cache_driver:
type: pool
pool: "%cache.driver%"
query_cache_driver:
type: pool
pool: "%cache.driver%"
result_cache_driver:
type: pool
pool: "%cache.driver%"

View File

@@ -0,0 +1,2 @@
imports:
- { resource: config_legacy_dev.yml }

View File

@@ -0,0 +1,40 @@
imports:
- { resource: config.yml }
# framework:
# validation:
# cache: validator.mapping.cache.apc
# serializer:
# cache: serializer.mapping.cache.apc
# doctrine:
# orm:
# metadata_cache_driver: apc
# result_cache_driver: apc
# query_cache_driver: apc
monolog:
handlers:
main:
type: fingers_crossed
action_level: error
handler: nested
nested:
type: rotating_file
max_files: '%env(int:PS_LOG_MAX_FILES)%'
path: '%env(PS_LOG_OUTPUT)%'
level: debug
console:
type: console
doctrine:
orm:
metadata_cache_driver:
type: pool
pool: "%cache.driver%"
query_cache_driver:
type: pool
pool: "%cache.driver%"
result_cache_driver:
type: pool
pool: "%cache.driver%"

View File

@@ -0,0 +1,59 @@
parameters:
resources_dir: "%kernel.project_dir%/tests/Resources"
test_translations_dir: "%resources_dir%/translations"
translations_theme_dir: "%resources_dir%/themes"
translations_modules_dir: "%resources_dir%/modules"
prestashop.security.voter.product.class: Tests\Integration\Utility\PageVoter
imports:
- { resource: config.yml }
- { resource: "../../tests/Resources/config/services.yml" }
framework:
test: ~
session:
storage_factory_id: session.storage.factory.mock_file
profiler:
collect: false
trusted_proxies: 'REMOTE_ADDR'
web_profiler:
toolbar: '%use_debug_toolbar%'
intercept_redirects: true
# Doctrine Configuration
doctrine:
dbal:
connections:
default:
dbname: "test_%database_name%"
monolog:
handlers:
main:
type: rotating_file
max_files: '%env(int:PS_LOG_MAX_FILES)%'
path: '%env(PS_LOG_OUTPUT)%'
level: debug
channels: [ "!event" ]
console:
type: console
bubble: false
verbosity_levels:
VERBOSITY_VERBOSE: INFO
VERBOSITY_VERY_VERBOSE: DEBUG
channels: [ "!doctrine" ]
console_very_verbose:
type: console
bubble: false
verbosity_levels:
VERBOSITY_VERBOSE: NOTICE
VERBOSITY_VERY_VERBOSE: NOTICE
VERBOSITY_DEBUG: DEBUG
channels: [ "doctrine" ]
api_platform:
mapping:
paths:
- '%kernel.project_dir%/src/PrestaShopBundle/ApiPlatform/Resources'
- '%kernel.project_dir%/tests/Resources/ApiPlatform/Resources'

33
app/config/doctrine.yml Normal file
View File

@@ -0,0 +1,33 @@
# Doctrine Configuration
doctrine:
dbal:
default_connection: default
connections:
default:
driver: pdo_mysql
wrapper_class: PrestaShopBundle\Doctrine\DatabaseConnection
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: utf8mb4
mapping_types:
enum: string
options:
# PDO::MYSQL_ATTR_INIT_COMMAND (<=PHP 8.4)
# Pdo\Mysql::ATTR_INIT_COMMAND (> PHP 8.5)
1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
# PDO::MYSQL_ATTR_MULTI_STATEMENTS (<=PHP 8.4)
# Pdo\Mysql::ATTR_MULTI_STATEMENTS (> PHP 8.5)
1013: '%env(const:runtime:_PS_ALLOW_MULTI_STATEMENTS_QUERIES_)%'
orm:
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: prestashop.database.naming_strategy
auto_mapping: true
dql:
string_functions:
regexp: DoctrineExtensions\Query\Mysql\Regexp
binary: DoctrineExtensions\Query\Mysql\Binary

View File

@@ -0,0 +1,10 @@
# Dedicated config for Front Endpoint, these are the common rules for all environments (dev, prod, test)
# They specify the dedicated security rules and routing mostly
imports:
- { resource: security.yml }
- { resource: services.yml }
framework:
router:
resource: "%kernel.project_dir%/app/config/front/routing.yml"
strict_requirements: true

View File

@@ -0,0 +1,6 @@
imports:
- { resource: ../config_dev.yml }
- { resource: config.yml }
framework:
profiler: { only_exceptions: false }

View File

@@ -0,0 +1,3 @@
imports:
- { resource: ../config_prod.yml }
- { resource: config.yml }

View File

@@ -0,0 +1,6 @@
imports:
- { resource: ../config_test.yml }
- { resource: config.yml }
framework:
profiler: { only_exceptions: false }

View File

View File

@@ -0,0 +1,7 @@
# Security rules for Front Application
security:
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false

View File

@@ -0,0 +1,6 @@
# Dedicated services for Front app
services:
_defaults:
public: false
autowire: true
autoconfigure: true

6
app/config/messenger.yml Normal file
View File

@@ -0,0 +1,6 @@
framework:
messenger:
buses:
messenger.bus.default:
middleware:
- 'PrestaShopBundle\CommandBus\Middleware\CommandRegisterMiddleware'

64
app/config/parameters.php Normal file
View File

@@ -0,0 +1,64 @@
<?php return array (
'parameters' =>
array (
'database_host' => '127.0.0.1',
'database_port' => '',
'database_name' => 'o2w_prestashop',
'database_user' => 'root',
'database_password' => '',
'database_prefix' => '61rfd_',
'database_engine' => 'InnoDB',
'mailer_transport' => 'smtp',
'mailer_host' => '127.0.0.1',
'mailer_user' => NULL,
'mailer_password' => NULL,
'secret' => 'IKK8r22CRg85UKR2QYq1unhuphrq2Zm7vtuM8Yns3dKGu4e0KHXuOHJ3rSIPIj1T',
'ps_caching' => 'CacheMemcache',
'ps_cache_enable' => false,
'ps_creation_date' => '2026-04-08',
'locale' => 'es-ES',
'cookie_key' => '0zJcKmQLxda2TaqW5GsEkvPPcILhkSTOYevPYOG59b8LLOuaTOZ3PKSYYXnjee59',
'cookie_iv' => 'LBmegop7ysyIkQtjEEOSEUhvMQFzOr6V',
'use_debug_toolbar' => true,
'new_cookie_key' => 'def00000ccae8b0d05e1fad68d3d7054c776d1b42c29e870b2801b0136beafc1a3dbe154068cdb17d5db3a90a776c48a9f3c4f7f6bc540e43cd22b995a08fdf2ca694d9b',
'api_public_key' => '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA55E4/YT6RYq5pKrbJxI5
g0t81Kgjw69JBhlwoi53xGdIekBKhcG7Jp9pZOviqSTSuQLJDkCGMcgf+ORpakEs
iNGlzQUckfH/ZoGAY8Zt6KTcjtjLFTdTYflnhIrCN7YF096xwb1soenQ8namfEus
E0oLjUmchyM3bW11pMdPiEI0yi+4RPW1ziO1nP9I3xrhCUrqG0x9LlqVnkLlD62n
5BemWwnVE49MjxzcV0OOaw0fsMqBQD+S33+gWeWRv6Ly0ZbVrUrG0aTluW8YuXFs
tOLHrTC2DqnKALjOfU7Eyx1WxHZjnc5/LNzihxmnMGTkOfWVZYhEdtRTy78/0Shd
MwIDAQAB
-----END PUBLIC KEY-----
',
'api_private_key' => '-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDnkTj9hPpFirmk
qtsnEjmDS3zUqCPDr0kGGXCiLnfEZ0h6QEqFwbsmn2lk6+KpJNK5AskOQIYxyB/4
5GlqQSyI0aXNBRyR8f9mgYBjxm3opNyO2MsVN1Nh+WeEisI3tgXT3rHBvWyh6dDy
dqZ8S6wTSguNSZyHIzdtbXWkx0+IQjTKL7hE9bXOI7Wc/0jfGuEJSuobTH0uWpWe
QuUPrafkF6ZbCdUTj0yPHNxXQ45rDR+wyoFAP5Lff6BZ5ZG/ovLRltWtSsbRpOW5
bxi5cWy04setMLYOqcoAuM59TsTLHVbEdmOdzn8s3OKHGacwZOQ59ZVliER21FPL
vz/RKF0zAgMBAAECggEAWL2rZGRAcMP/7p3XTDrMtYcJOImS4xvaVS8MnepG1Ypr
GQZoSKf8a4mtnxJSk1VcN7Bckkyh4JP7xKrrxt9hDLGi41WxJDDkGklIhXP2jLAZ
Idjswp2oI6SrSfzO/wCPbSkrX76S0d3DyBc2J+3r7Jx0ntl11cfmJtZKvjHvRZy2
9CktGoDcwALV63BSDA/P/9dPWlz3VzwvNKApLd1pqNWJ0QsR7zTMbkJRv535Dwc/
D+zQiJXwejDJhF0ejki0XogEGDruwloPA2HXk9KSn/AMOIgaKBx9nSSAAwicx5qY
C/ploowUsl1EzPwC/O4EA/i8zb5c0B//3MMtC01FYQKBgQD2TJDfVduUXLm+U9Ow
DqsJRIW+rT1RAPCRZ/vVHVvRC3gnyrBbMVIO5C4+o8hYFL524Qa1MgPsxzCMP/dZ
ibv4TdmXhs6XXIy4dxhg2/CSyP51qHrf9kMd4eq/rtnjhqqiHX85zOUUKJFbbyYE
i907o9F3M9KY7n5uxyqnJidEAwKBgQDwsB2oPqjfVPBIAzEwIIaNbw2cMH/zwahK
uD8IOEyvtloNYkHmULRm7cf0Fp9RzrxbVP10cRS7GgTGEkyzScvrXYA9pfrycEPH
efbKkBXJ13p5NxdwQ5KOdk0qE+qPsywKVwGVq4GHAKVwgMeSHsk7PCNv8r6/FpJ2
Urhv86rzEQKBgAgl0EUTGgh2aM6bB02zroTH94SvRm//j/W/ct1B81+e+YKXee4K
W6SSd9Uqpd4EEajtGMO1u9uBW2HIW+5iWA2GxcP1ebAYJ6+SgQPzQqoYbBKIWEhA
ZUf/yTw+FIcqVUq3nxXSaWGZVfWoX6GW3uKyMKO42yaj/Rq9C/QrlvDxAoGAW8UK
ycd6ZAziwNJWwt7j7rFVIyRq5OoF3Nd7UQsGUkjY9Rltvv8uicBH6Q1nGa4Vq00w
hmFHYj99ang3vnR4x/kSmG7cy+t6LGiYbIubgyYhkG4tBaT+EEuTCGQnnzrVo+ug
swx9ipf4fHjdnx0V5Pv9FwYbLIjSt0K7CBSELcECgYEAxjB6W6UKPJc8IfxhEO8K
YDB/8+gG+bvZqrj6cZz3WVaIvcpzvQi/qQW96YWLhidWl8Ew6ZUHR+YD8Uzk3Q0G
nyWNk8HYCHRNUHVdxbw9QfnxvcTige+XV+BvQyLIY1kO+lw8iDx4VKCt4Qg54/jh
vuWVRqAt21DBGjqJr1fNaXM=
-----END PRIVATE KEY-----
',
),
);

View File

@@ -0,0 +1 @@
parameters:

View File

@@ -0,0 +1,29 @@
# This file is a "template" of what your parameters.yml file should look like
# Set parameters here that may be different on each deployment target of the app, e.g. development, staging, production.
# http://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration
parameters:
database_host: 127.0.0.1
database_port: ~
database_name: prestashop
database_user: root
database_password: ~
database_prefix: ps_
database_engine: InnoDB
# You should uncomment this if you want use pdo_sqlite
# database_path: "%kernel.project_dir%/data.db3"
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: ~
mailer_password: ~
# A secret key that's used to generate certain security-related tokens
secret: ThisTokenIsNotSoSecretChangeIt
ps_caching: CacheMemcache
ps_cache_enable: false
ps_creation_date: ~
locale: en-US
cookie_key: ThisTokenIsNotSoSecretChangeIt
cookie_iv: ThisTokenIsNotSoSecretChangeIt
use_debug_toolbar: true

10
app/config/services.yml Normal file
View File

@@ -0,0 +1,10 @@
# Learn more about services, parameters and containers at
# http://symfony.com/doc/current/book/service_container.html
parameters:
# parameter_name: value
services:
_defaults:
autowire: false
autoconfigure: false
public: true

View File

@@ -0,0 +1,82 @@
<?php
/**
* For the full copyright and license information, please view the
* docs/licenses/LICENSE.txt file that was distributed with this source code.
*/
$parametersFilepath = __DIR__ . '/parameters.php';
if (file_exists($parametersFilepath)) {
$parameters = require $parametersFilepath;
} else {
// When no parameters file is present (before install) we define null values for mandatory parameters to avoid breaking the CI
$parameters = [
'parameters' => [
'secret' => 'secret',
'locale' => 'en',
'database_host' => '',
'database_port' => null,
'database_name' => '',
'database_user' => '',
'database_password' => '',
'database_prefix' => 'ps_',
'api_private_key' => null,
'api_public_key' => null,
'cookie_key' => '',
'new_cookie_key' => null,
'ps_cache_enable' => null,
'ps_caching' => null,
],
];
}
if (!array_key_exists('parameters', $parameters)) {
throw new Exception('Missing "parameters" key in "parameters.php" configuration file');
}
if (!defined('_PS_IN_TEST_') && isset($_SERVER['argv'])) {
$input = new Symfony\Component\Console\Input\ArgvInput();
$env = $input->getParameterOption(['--env', '-e'], getenv('SYMFONY_ENV') ?: 'dev');
if ($env === 'test') {
define('_PS_IN_TEST_', 1);
}
}
if (isset($container) && $container instanceof Symfony\Component\DependencyInjection\Container) {
foreach ($parameters['parameters'] as $key => $value) {
$container->setParameter($key, $value);
}
$driver = 'array';
$cacheType = [
'CacheMemcached' => ['memcached'],
'CacheApc' => ['apcu'],
];
$adapters = [
'array' => 'cache.adapter.array',
'memcached' => 'cache.adapter.memcached',
'apcu' => 'cache.adapter.apcu',
];
if (isset(
$parameters['parameters']['ps_cache_enable'],
$parameters['parameters']['ps_caching'],
$cacheType[$parameters['parameters']['ps_caching']]
)
&& true === $parameters['parameters']['ps_cache_enable']
) {
foreach ($cacheType[$parameters['parameters']['ps_caching']] as $type) {
if (extension_loaded($type)) {
$driver = $type;
break;
}
}
}
$container->setParameter('cache.driver', $driver);
$container->setParameter('cache.adapter', $adapters[$driver]);
// Parameter used only in dev and test env
$envParameter = getenv('DISABLE_DEBUG_TOOLBAR');
if (!isset($parameters['parameters']['use_debug_toolbar']) || false !== $envParameter) {
$container->setParameter('use_debug_toolbar', !$envParameter);
}
}

1
app/metadata.json Normal file
View File

@@ -0,0 +1 @@
{"version":"9.1.0","buildDate":"2026-03-23 10:57:56","modules":[{"ps_eventbus":"4.0.13"},{"ps_accounts":"8.0.13"},{"ps_mbo":"5.2.2"},{"psxmarketingwithgoogle":"1.75.6"},{"ps_checkout":"9.5.1.1"},{"ps_facebook":"1.38.17"},{"ps_classic_edition":"1.0.2"},{"psshipping":"2.1.1"}],"overridenFiles":[],"distribution":"classic","distributionVersion":"4.0"}