SDK Form demonstrator

This commit is contained in:
Eric Espie
2025-04-09 11:29:30 +02:00
parent f3deb8be11
commit 0edb8e872f
6 changed files with 48 additions and 9 deletions

View File

@@ -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",

View File

@@ -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;
}
}

View File

@@ -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 ###

View File

@@ -1,5 +1,5 @@
controllers:
resource:
path: ../../../sources/Controller/
namespace: Combodo\iTop\Controller
path: ../../../sources/Application/Symfony/
namespace: Combodo\iTop\Application\Symfony
type: attribute

View File

@@ -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

View File

@@ -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) {