Merge branch 'master' of https://github.com/thelia/thelia
This commit is contained in:
@@ -124,6 +124,11 @@
|
|||||||
<tag name="thelia.parser.register_plugin"/>
|
<tag name="thelia.parser.register_plugin"/>
|
||||||
</service>
|
</service>
|
||||||
|
|
||||||
|
<service id="smarty.plugin.format" class="Thelia\Core\Template\Smarty\Plugins\Format" scope="request">
|
||||||
|
<argument type="service" id="request"/>
|
||||||
|
<tag name="thelia.parser.register_plugin"/>
|
||||||
|
</service>
|
||||||
|
|
||||||
<service id="smarty.plugin.thelialoop" class="Thelia\Core\Template\Smarty\Plugins\TheliaLoop" scope="request">
|
<service id="smarty.plugin.thelialoop" class="Thelia\Core\Template\Smarty\Plugins\TheliaLoop" scope="request">
|
||||||
<tag name="thelia.parser.register_plugin"/>
|
<tag name="thelia.parser.register_plugin"/>
|
||||||
|
|
||||||
|
|||||||
@@ -55,12 +55,15 @@ class Session extends BaseSession
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \Thelia\Model\Lang|null
|
||||||
|
*/
|
||||||
public function getLang()
|
public function getLang()
|
||||||
{
|
{
|
||||||
return $this->get("lang", substr($this->getLocale(), 0, 2));
|
return $this->get("lang");
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setLang($lang)
|
public function setLang(Lang $lang)
|
||||||
{
|
{
|
||||||
$this->set("lang", $lang);
|
$this->set("lang", $lang);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
/*************************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* Thelia */
|
||||||
|
/* */
|
||||||
|
/* Copyright (c) OpenStudio */
|
||||||
|
/* email : info@thelia.net */
|
||||||
|
/* web : http://www.thelia.net */
|
||||||
|
/* */
|
||||||
|
/* This program is free software; you can redistribute it and/or modify */
|
||||||
|
/* it under the terms of the GNU General Public License as published by */
|
||||||
|
/* the Free Software Foundation; either version 3 of the License */
|
||||||
|
/* */
|
||||||
|
/* This program is distributed in the hope that it will be useful, */
|
||||||
|
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
||||||
|
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
||||||
|
/* GNU General Public License for more details. */
|
||||||
|
/* */
|
||||||
|
/* You should have received a copy of the GNU General Public License */
|
||||||
|
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
/* */
|
||||||
|
/*************************************************************************************/
|
||||||
|
|
||||||
|
namespace Thelia\Core\Template\Smarty\Exception;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class SmartyPluginException
|
||||||
|
* @package Thelia\Core\Template\Smarty\Exception
|
||||||
|
* @author Manuel Raynaud <mraynaud@openstudio.fr>
|
||||||
|
*/
|
||||||
|
class SmartyPluginException extends \SmartyException
|
||||||
|
{}
|
||||||
154
core/lib/Thelia/Core/Template/Smarty/Plugins/Format.php
Normal file
154
core/lib/Thelia/Core/Template/Smarty/Plugins/Format.php
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
<?php
|
||||||
|
/*************************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* Thelia */
|
||||||
|
/* */
|
||||||
|
/* Copyright (c) OpenStudio */
|
||||||
|
/* email : info@thelia.net */
|
||||||
|
/* web : http://www.thelia.net */
|
||||||
|
/* */
|
||||||
|
/* This program is free software; you can redistribute it and/or modify */
|
||||||
|
/* it under the terms of the GNU General Public License as published by */
|
||||||
|
/* the Free Software Foundation; either version 3 of the License */
|
||||||
|
/* */
|
||||||
|
/* This program is distributed in the hope that it will be useful, */
|
||||||
|
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
||||||
|
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
||||||
|
/* GNU General Public License for more details. */
|
||||||
|
/* */
|
||||||
|
/* You should have received a copy of the GNU General Public License */
|
||||||
|
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
/* */
|
||||||
|
/*************************************************************************************/
|
||||||
|
|
||||||
|
namespace Thelia\Core\Template\Smarty\Plugins;
|
||||||
|
|
||||||
|
use Thelia\Core\HttpFoundation\Request;
|
||||||
|
use Thelia\Core\Template\Smarty\AbstractSmartyPlugin;
|
||||||
|
use Thelia\Core\Template\Smarty\Exception\SmartyPluginException;
|
||||||
|
use Thelia\Core\Template\Smarty\SmartyPluginDescriptor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* format_date and format_date smarty function.
|
||||||
|
*
|
||||||
|
* Class Format
|
||||||
|
* @package Thelia\Core\Template\Smarty\Plugins
|
||||||
|
* @author Manuel Raynaud <mraynaud@openstudio.fr>
|
||||||
|
*/
|
||||||
|
class Format extends AbstractSmartyPlugin
|
||||||
|
{
|
||||||
|
protected $request;
|
||||||
|
|
||||||
|
public function __construct(Request $request)
|
||||||
|
{
|
||||||
|
$this->request = $request;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return date in expected format
|
||||||
|
*
|
||||||
|
* available parameters :
|
||||||
|
* date => DateTime object (mandatory)
|
||||||
|
* format => expected format
|
||||||
|
* output => list of default system format. Values available :
|
||||||
|
* date => date format
|
||||||
|
* time => time format
|
||||||
|
* datetime => datetime format (default)
|
||||||
|
*
|
||||||
|
* ex :
|
||||||
|
* {format_date date=$dateTimeObject format="Y-m-d H:i:s"} will output the format with specific format
|
||||||
|
* {format_date date=$dateTimeObject output="date"} will output the date using the default date system format
|
||||||
|
* {format_date date=$dateTimeObject} will output with the default datetime system format
|
||||||
|
*
|
||||||
|
* @param array $params
|
||||||
|
* @param null $template
|
||||||
|
* @throws \Thelia\Core\Template\Smarty\Exception\SmartyPluginException
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function formatDate($params, $template = null)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (array_key_exists("date", $params) === false) {
|
||||||
|
throw new SmartyPluginException("date is a mandatory parameter in format_date function");
|
||||||
|
}
|
||||||
|
|
||||||
|
$date = $params["date"];
|
||||||
|
|
||||||
|
if(!$date instanceof \DateTime) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
$format = null;
|
||||||
|
$output = array_key_exists("output", $params) ? $params["output"] : null;
|
||||||
|
|
||||||
|
if (array_key_exists("format", $params)) {
|
||||||
|
$format = $params["format"];
|
||||||
|
} else {
|
||||||
|
$session = $this->request->getSession();
|
||||||
|
$lang = $session->getLang();
|
||||||
|
|
||||||
|
if($lang) {
|
||||||
|
switch ($output) {
|
||||||
|
case "date" :
|
||||||
|
$format = $lang->getDateFormat();
|
||||||
|
break;
|
||||||
|
case "time" :
|
||||||
|
$format = $lang->getTimeFormat();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case "datetime" :
|
||||||
|
$format = $lang->getDateTimeFormat();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $date->format($format);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* display numbers in expected format
|
||||||
|
*
|
||||||
|
* available parameters :
|
||||||
|
* number => int or float number
|
||||||
|
* decimals => how many decimals format expected
|
||||||
|
* dec_point => separator for the decimal point
|
||||||
|
* thousands_sep => thousands separator
|
||||||
|
*
|
||||||
|
* ex : {format_number number="1246.12" decimals="1" dec_point="," thousands_sep=" "} will output "1 246,1"
|
||||||
|
*
|
||||||
|
* @param $params
|
||||||
|
* @param null $template
|
||||||
|
* @throws \Thelia\Core\Template\Smarty\Exception\SmartyPluginException
|
||||||
|
* @return string the expected number formatted
|
||||||
|
*/
|
||||||
|
public function formatNumber($params, $template = null)
|
||||||
|
{
|
||||||
|
if (array_key_exists("number", $params) === false) {
|
||||||
|
throw new SmartyPluginException("number is a mandatory parameter in format_number function");
|
||||||
|
}
|
||||||
|
|
||||||
|
$lang = $this->request->getSession()->getLang();
|
||||||
|
|
||||||
|
$number = $params["number"];
|
||||||
|
$decimals = array_key_exists("decimals", $params) ? $params["decimals"] : $lang->getDecimals();
|
||||||
|
$decPoint = array_key_exists("dec_point", $params) ? $params["dec_point"] : $lang->getDecimalSeparator();
|
||||||
|
$thousandsSep = array_key_exists("thousands_sep", $params) ? $params["thousands_sep"] : $lang->getThousandsSeparator();
|
||||||
|
|
||||||
|
return number_format($number, $decimals, $decPoint, $thousandsSep);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return an array of SmartyPluginDescriptor
|
||||||
|
*/
|
||||||
|
public function getPluginDescriptors()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
new SmartyPluginDescriptor("function", "format_date", $this, "formatDate"),
|
||||||
|
new SmartyPluginDescriptor("function", "format_number", $this, "formatNumber")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -126,7 +126,7 @@ class TheliaHttpKernel extends HttpKernel
|
|||||||
|
|
||||||
if ($lang) {
|
if ($lang) {
|
||||||
$request->getSession()
|
$request->getSession()
|
||||||
->setLang($lang->getCode())
|
->setLang($lang)
|
||||||
->setLocale($lang->getLocale())
|
->setLocale($lang->getLocale())
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,15 +24,33 @@ class Lang extends BaseLang {
|
|||||||
return $default_lang;
|
return $default_lang;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDateFormat() {
|
public function getDateFormat()
|
||||||
|
{
|
||||||
return "d/m/Y";
|
return "d/m/Y";
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTimeFormat() {
|
public function getTimeFormat()
|
||||||
|
{
|
||||||
return "H:i:s";
|
return "H:i:s";
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDateTimeFormat() {
|
public function getDateTimeFormat()
|
||||||
|
{
|
||||||
return "d/m/Y H:i:s";
|
return "d/m/Y H:i:s";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getDecimalSeparator()
|
||||||
|
{
|
||||||
|
return ".";
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getThousandsSeparator()
|
||||||
|
{
|
||||||
|
return " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDecimals()
|
||||||
|
{
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,274 @@
|
|||||||
|
<?php
|
||||||
|
/*************************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* Thelia */
|
||||||
|
/* */
|
||||||
|
/* Copyright (c) OpenStudio */
|
||||||
|
/* email : info@thelia.net */
|
||||||
|
/* web : http://www.thelia.net */
|
||||||
|
/* */
|
||||||
|
/* This program is free software; you can redistribute it and/or modify */
|
||||||
|
/* it under the terms of the GNU General Public License as published by */
|
||||||
|
/* the Free Software Foundation; either version 3 of the License */
|
||||||
|
/* */
|
||||||
|
/* This program is distributed in the hope that it will be useful, */
|
||||||
|
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
||||||
|
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
||||||
|
/* GNU General Public License for more details. */
|
||||||
|
/* */
|
||||||
|
/* You should have received a copy of the GNU General Public License */
|
||||||
|
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
/* */
|
||||||
|
/*************************************************************************************/
|
||||||
|
namespace Thelia\Tests\Core\Smarty\Plugins;
|
||||||
|
|
||||||
|
use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
|
||||||
|
use Thelia\Core\HttpFoundation\Request;
|
||||||
|
use Thelia\Core\HttpFoundation\Session\Session;
|
||||||
|
use Thelia\Core\Template\Smarty\Plugins\Format;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @coversDefaultClass \Thelia\Core\Template\Smarty\Plugins\Format
|
||||||
|
*/
|
||||||
|
class FormatTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
protected $request;
|
||||||
|
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
$this->request = new Request();
|
||||||
|
|
||||||
|
$this->request->setSession(new Session(new MockArraySessionStorage()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* test formatDate method with expected format
|
||||||
|
*
|
||||||
|
* @covers ::formatDate
|
||||||
|
*/
|
||||||
|
public function testFormatDateWithSpecificFormat()
|
||||||
|
{
|
||||||
|
$dateTime = new \DateTime();
|
||||||
|
$format = "Y-m-d H:i:s";
|
||||||
|
|
||||||
|
$formatClass = new Format($this->request);
|
||||||
|
|
||||||
|
$render = $formatClass->formatDate(array(
|
||||||
|
"date" => $dateTime,
|
||||||
|
"format" => $format
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->assertEquals($dateTime->format($format), $render);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* test formatDate method with date default format
|
||||||
|
*
|
||||||
|
* @covers ::formatDate
|
||||||
|
*/
|
||||||
|
public function testFormatDateWithDefaultSessionParam()
|
||||||
|
{
|
||||||
|
$dateTime = new \DateTime();
|
||||||
|
|
||||||
|
$langMock = $this->getLangMock();
|
||||||
|
$this->request->getSession()->setLang($langMock);
|
||||||
|
|
||||||
|
$formatClass = new Format($this->request);
|
||||||
|
|
||||||
|
$render = $formatClass->formatDate(array("date" => $dateTime));
|
||||||
|
|
||||||
|
$this->assertEquals($dateTime->format("Y-m-d H:i:s"), $render);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* test formatDate method with time default format
|
||||||
|
*
|
||||||
|
* @covers ::formatDate
|
||||||
|
*/
|
||||||
|
public function testFormatDateWithDateSessionParam()
|
||||||
|
{
|
||||||
|
$dateTime = new \DateTime();
|
||||||
|
|
||||||
|
$langMock = $this->getLangMock();
|
||||||
|
$this->request->getSession()->setLang($langMock);
|
||||||
|
|
||||||
|
$formatClass = new Format($this->request);
|
||||||
|
|
||||||
|
$render = $formatClass->formatDate(array(
|
||||||
|
"date" => $dateTime,
|
||||||
|
"output" => "date"
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->assertEquals($dateTime->format("Y-m-d"), $render);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* test formatDate method with datetime default format
|
||||||
|
*
|
||||||
|
* @covers ::formatDate
|
||||||
|
*/
|
||||||
|
public function testFormatDateWithTimeSessionParam()
|
||||||
|
{
|
||||||
|
$dateTime = new \DateTime();
|
||||||
|
|
||||||
|
$langMock = $this->getLangMock();
|
||||||
|
$this->request->getSession()->setLang($langMock);
|
||||||
|
|
||||||
|
$formatClass = new Format($this->request);
|
||||||
|
|
||||||
|
$render = $formatClass->formatDate(array(
|
||||||
|
"date" => $dateTime,
|
||||||
|
"output" => "time"
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->assertEquals($dateTime->format("H:i:s"), $render);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* test formatDate method without output or expected format. datetime format must be return
|
||||||
|
*
|
||||||
|
* @covers ::formatDate
|
||||||
|
*/
|
||||||
|
public function testFormatDateWithDateTimeSessionParam()
|
||||||
|
{
|
||||||
|
$dateTime = new \DateTime();
|
||||||
|
|
||||||
|
$langMock = $this->getLangMock();
|
||||||
|
$this->request->getSession()->setLang($langMock);
|
||||||
|
|
||||||
|
$formatClass = new Format($this->request);
|
||||||
|
|
||||||
|
$render = $formatClass->formatDate(array(
|
||||||
|
"date" => $dateTime,
|
||||||
|
"output" => "datetime"
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->assertEquals($dateTime->format("Y-m-d H:i:s"), $render);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test formatDate without mandatory parameters
|
||||||
|
*
|
||||||
|
* @covers ::formatDate
|
||||||
|
* @expectedException \Thelia\Core\Template\Smarty\Exception\SmartyPluginException
|
||||||
|
*/
|
||||||
|
public function testFormatDateWithoutDate()
|
||||||
|
{
|
||||||
|
$dateTime = new \DateTime();
|
||||||
|
|
||||||
|
$formatClass = new Format($this->request);
|
||||||
|
|
||||||
|
$render = $formatClass->formatDate(array());
|
||||||
|
|
||||||
|
$this->assertEquals($dateTime->format("Y-m-d H:i:s"), $render);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test formatNumber without mandatory parameters
|
||||||
|
*
|
||||||
|
* @covers ::formatNumber
|
||||||
|
* @expectedException \Thelia\Core\Template\Smarty\Exception\SmartyPluginException
|
||||||
|
*/
|
||||||
|
public function testFormatNumberWithoutParams()
|
||||||
|
{
|
||||||
|
$formatClass = new Format($this->request);
|
||||||
|
|
||||||
|
$render = $formatClass->formatNumber(array());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test formatDate specifying all parameters
|
||||||
|
*
|
||||||
|
* @covers ::formatNumber
|
||||||
|
*/
|
||||||
|
public function testFormatNumberWithAllParams()
|
||||||
|
{
|
||||||
|
$formatClass = new Format($this->request);
|
||||||
|
|
||||||
|
$number = 1256.12;
|
||||||
|
$decimals = 1;
|
||||||
|
$decPoint = ",";
|
||||||
|
$thousandsSep = " ";
|
||||||
|
|
||||||
|
$render = $formatClass->formatNumber(array(
|
||||||
|
"number" => $number,
|
||||||
|
"decimals" => $decimals,
|
||||||
|
"dec_point" => $decPoint,
|
||||||
|
"thousands_sep" => $thousandsSep
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->assertEquals($render, "1 256,1");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers ::formatNumber
|
||||||
|
*/
|
||||||
|
public function testFormatNumberWithDefaultParameters()
|
||||||
|
{
|
||||||
|
$number = 1234.56;
|
||||||
|
$langMock = $this->getLangMock();
|
||||||
|
$this->request->getSession()->setLang($langMock);
|
||||||
|
|
||||||
|
$formatClass = new Format($this->request);
|
||||||
|
|
||||||
|
$render = $formatClass->formatNumber(array(
|
||||||
|
"number" => $number
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->assertEquals( $render, number_format($number, 2, ",", " "));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create a mock for Thelia\Model\Lang class
|
||||||
|
* @return \Thelia\Model\Lang instance
|
||||||
|
*/
|
||||||
|
public function getLangMock()
|
||||||
|
{
|
||||||
|
$mock = $this->getMock(
|
||||||
|
"Thelia\Model\Lang",
|
||||||
|
array(
|
||||||
|
"getDateFormat",
|
||||||
|
"getTimeFormat",
|
||||||
|
"getDateTimeFormat",
|
||||||
|
"getDecimalSeparator",
|
||||||
|
"getThousandsSeparator",
|
||||||
|
"getDecimals"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$mock->expects($this->any())
|
||||||
|
->method("getDateFormat")
|
||||||
|
->will($this->returnValue("Y-m-d"));
|
||||||
|
|
||||||
|
$mock->expects($this->any())
|
||||||
|
->method("getTimeFormat")
|
||||||
|
->will($this->returnValue("H:i:s"));
|
||||||
|
|
||||||
|
$mock->expects($this->any())
|
||||||
|
->method("getDateTimeFormat")
|
||||||
|
->will($this->returnValue("Y-m-d H:i:s"));
|
||||||
|
|
||||||
|
$mock->expects($this->any())
|
||||||
|
->method("getDecimals")
|
||||||
|
->will($this->returnValue(2));
|
||||||
|
|
||||||
|
$mock->expects($this->any())
|
||||||
|
->method("getDecimalSeparator")
|
||||||
|
->will($this->returnValue(","));
|
||||||
|
|
||||||
|
$mock->expects($this->any())
|
||||||
|
->method("getThousandsSeparator")
|
||||||
|
->will($this->returnValue(" "));
|
||||||
|
|
||||||
|
return $mock;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@ if [ ! -f local/config/database.yml ]; then
|
|||||||
echo "[FAILED] Please add your database informations in local/config/database.yml and start this script again."
|
echo "[FAILED] Please add your database informations in local/config/database.yml and start this script again."
|
||||||
else
|
else
|
||||||
echo -e "\n\e[01;34m[INFO] Downloading vendors\e[00m\n"
|
echo -e "\n\e[01;34m[INFO] Downloading vendors\e[00m\n"
|
||||||
php composer install --prefer-dist --no-dev
|
composer install
|
||||||
|
|
||||||
cd local/config/
|
cd local/config/
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user