diff --git a/composer.json b/composer.json index ffb7bd452..1e83a16e2 100644 --- a/composer.json +++ b/composer.json @@ -24,6 +24,7 @@ "soundasleep/html2text": "~2.1", "symfony/console": "~6.4.0", "symfony/dotenv": "~6.4.0", + "symfony/form": "^6.4", "symfony/framework-bundle": "~6.4.0", "symfony/http-foundation": "~6.4.0", "symfony/http-kernel": "~6.4.0", diff --git a/lib/twig/twig/src/Template.php b/lib/twig/twig/src/Template.php index faf7aee1e..0a4103131 100644 --- a/lib/twig/twig/src/Template.php +++ b/lib/twig/twig/src/Template.php @@ -136,7 +136,7 @@ abstract class Template public function displayBlock($name, array $context, array $blocks = [], $useBlocks = true, ?self $templateContext = null): void { foreach ($this->yieldBlock($name, $context, $blocks, $useBlocks, $templateContext) as $data) { - echo $data; + echo $data; } } diff --git a/resources/symfony/.env b/resources/symfony/.env index 6eee6fbbc..74f5e24f5 100644 --- a/resources/symfony/.env +++ b/resources/symfony/.env @@ -15,6 +15,6 @@ # https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration ###> symfony/framework-bundle ### -APP_ENV=prod +APP_ENV=dev #APP_SECRET=extracted from iTop general configuration in ./symfony/packages/itop_configuration_bridge.php ###< symfony/framework-bundle ### diff --git a/resources/symfony/config/routes.yaml b/resources/symfony/config/routes.yaml index be6820117..f44686517 100644 --- a/resources/symfony/config/routes.yaml +++ b/resources/symfony/config/routes.yaml @@ -1,5 +1,5 @@ controllers: resource: - path: ../../../sources/Controller/ - namespace: Combodo\iTop\Controller + path: ../../../sources/Application/Symfony/ + namespace: Combodo\iTop\Application\Symfony type: attribute diff --git a/sources/Application/TwigBase/Controller/Controller.php b/sources/Application/TwigBase/Controller/Controller.php index 955a061fb..70662891f 100644 --- a/sources/Application/TwigBase/Controller/Controller.php +++ b/sources/Application/TwigBase/Controller/Controller.php @@ -19,25 +19,33 @@ namespace Combodo\iTop\Application\TwigBase\Controller; -use Combodo\iTop\Application\WebPage\AjaxPage; use ApplicationMenu; use Combodo\iTop\Application\TwigBase\Twig\TwigHelper; +use Combodo\iTop\Application\WebPage\AjaxPage; +use Combodo\iTop\Application\WebPage\ErrorPage; +use Combodo\iTop\Application\WebPage\iTopWebPage; +use Combodo\iTop\Application\WebPage\WebPage; use Combodo\iTop\Controller\AbstractController; use Dict; -use Combodo\iTop\Application\WebPage\ErrorPage; use Exception; use ExecutionKPI; use IssueLog; -use Combodo\iTop\Application\WebPage\iTopWebPage; use LoginWebPage; use MetaModel; use ReflectionClass; use SetupPage; use SetupUtils; +use Symfony\Bridge\Twig\Extension\FormExtension; +use Symfony\Bridge\Twig\Form\TwigRendererEngine; +use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension; +use Symfony\Component\Form\FormFactoryInterface; +use Symfony\Component\Form\FormRenderer; +use Symfony\Component\Form\Forms; +use Symfony\Component\HttpFoundation\Request; use Twig\Error\Error; use Twig\Error\SyntaxError; +use Twig\RuntimeLoader\FactoryRuntimeLoader; use utils; -use Combodo\iTop\Application\WebPage\WebPage; use ZipArchive; abstract class Controller extends AbstractController @@ -80,6 +88,9 @@ abstract class Controller extends AbstractController private $m_bIsBreadCrumbEnabled = true; /** @var array contains same parameters as {@see iTopWebPage::SetBreadCrumbEntry()} */ private $m_aBreadCrumbEntry = []; + /** @var \Symfony\Component\HttpFoundation\Request */ + private Request $oRequest; + private FormFactoryInterface $oFormFactory; /** * Controller constructor. @@ -89,6 +100,10 @@ abstract class Controller extends AbstractController */ public function __construct($sViewPath = '', $sModuleName = 'core', $aAdditionalPaths = []) { + $this->oRequest = Request::createFromGlobals(); + $this->oFormFactory = Forms::createFormFactoryBuilder() + ->addExtension(new HttpFoundationExtension()) + ->getFormFactory(); $this->m_aLinkedScripts = []; $this->m_aLinkedStylesheets = []; $this->m_aSaas = []; @@ -96,6 +111,7 @@ abstract class Controller extends AbstractController $this->m_aDefaultParams = []; $this->m_aBlockParams = []; $this->SetModuleName($sModuleName); + $aAdditionalPaths[] = APPROOT.'lib/symfony/twig-bridge/Resources/views/Form'; if (strlen($sViewPath) > 0) { $this->SetViewPath($sViewPath, $aAdditionalPaths); if ($sModuleName != 'core') { @@ -135,6 +151,14 @@ abstract class Controller extends AbstractController public function SetViewPath($sViewPath, $aAdditionalPaths = []) { $oTwig = TwigHelper::GetTwigEnvironment($sViewPath, $aAdditionalPaths); + $formEngine = new TwigRendererEngine(['bootstrap_5_layout.html.twig'], $oTwig); + $oTwig->addRuntimeLoader(new FactoryRuntimeLoader([ + FormRenderer::class => function () use ($formEngine): FormRenderer { + return new FormRenderer($formEngine, null); + }, + ])); + $oExt = new FormExtension(); + $oTwig->addExtension($oExt); $this->m_oTwig = $oTwig; } @@ -659,6 +683,16 @@ abstract class Controller extends AbstractController $this->m_aBreadCrumbEntry = [$sId, $sLabel, $sDescription, $sUrl, $sIcon]; } + public function GetRequest(): Request + { + return $this->oRequest; + } + + public function GetFormFactory(): FormFactoryInterface + { + return $this->oFormFactory; + } + /** * @param $aParams * @param $sName diff --git a/sources/Application/TwigBase/Twig/Extension.php b/sources/Application/TwigBase/Twig/Extension.php index 09ddb718b..4c9f085a9 100644 --- a/sources/Application/TwigBase/Twig/Extension.php +++ b/sources/Application/TwigBase/Twig/Extension.php @@ -16,7 +16,6 @@ use Combodo\iTop\Renderer\BlockRenderer; use Dict; use Exception; use Twig\Environment; -use Twig\Extension\CoreExtension; use Twig\Loader\FilesystemLoader; use Twig\Source; use Twig\TwigFilter; @@ -59,6 +58,11 @@ class Extension return Dict::S($sStringCode, $sDefault, $bUserLanguageOnly); }); + $aFilters[] = new TwigFilter('trans', function ($sStringCode, $sDefault = null, $bUserLanguageOnly = false) { + return $sStringCode; + }); + + // Filter to format a string via the Dict::Format function // Usage in twig: {{ 'String:ToTranslate'|dict_format() }} $aFilters[] = new TwigFilter('dict_format', function ($sStringCode, $sParam01 = null, $sParam02 = null, $sParam03 = null, $sParam04 = null) {