From e8cdca92da8451248852d03884b4826877507e28 Mon Sep 17 00:00:00 2001 From: Michal Lulco Date: Sat, 29 Jul 2023 22:24:39 +0200 Subject: [PATCH] Form containers semi dynamic names --- .../NodeVisitor/AddVarTypesNodeVisitor.php | 2 +- .../Fixtures/FormsPresenter.php | 21 ++++++++++++------- .../Fixtures/templates/Forms/default.latte | 13 ++++++++++-- .../LatteTemplatesRuleForPresenterTest.php | 10 +++++++++ .../PresenterWithoutModule/Source/Slide.php | 14 +++++++++++++ 5 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 tests/Rule/LatteTemplatesRule/PresenterWithoutModule/Source/Slide.php diff --git a/src/Compiler/NodeVisitor/AddVarTypesNodeVisitor.php b/src/Compiler/NodeVisitor/AddVarTypesNodeVisitor.php index 3e7247d0..7e81a17e 100644 --- a/src/Compiler/NodeVisitor/AddVarTypesNodeVisitor.php +++ b/src/Compiler/NodeVisitor/AddVarTypesNodeVisitor.php @@ -32,6 +32,7 @@ use PHPStan\Type\ThisType; use PHPStan\Type\TypeCombinator; use PHPStan\Type\UnionType; +use PHPStan\Type\VerbosityLevel; final class AddVarTypesNodeVisitor extends NodeVisitorAbstract implements VariablesNodeVisitorInterface { @@ -94,7 +95,6 @@ public function enterNode(Node $node): ?Node } $variableType = $variable->getType(); - if ($variableType instanceof ThisType) { // $this(SomeClass) is transformed to $this, but we want to use SomeClass instead $variableType = $variableType->getStaticObjectType(); diff --git a/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/Fixtures/FormsPresenter.php b/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/Fixtures/FormsPresenter.php index 30e45f3e..b80e464a 100644 --- a/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/Fixtures/FormsPresenter.php +++ b/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/Fixtures/FormsPresenter.php @@ -5,19 +5,20 @@ namespace Efabrica\PHPStanLatte\Tests\Rule\LatteTemplatesRule\PresenterWithoutModule\Fixtures; use Efabrica\PHPStanLatte\Tests\Rule\LatteTemplatesRule\PresenterWithoutModule\Source\CustomForm; +use Efabrica\PHPStanLatte\Tests\Rule\LatteTemplatesRule\PresenterWithoutModule\Source\Slide; use Nette\Application\UI\Form; use Nette\Forms\Container; use Nette\Forms\Controls\SubmitButton; -use stdClass; final class FormsPresenter extends ParentPresenter { + public Slide $slide; + public function actionDefault(): void { parent::actionDefault(); $this->template->dynamicVariable = $this->name; - $this->template->dynamicPropertyFetch = new stdClass(); - $this->template->slide = new stdClass(); + $this->template->slide = $this->slide; } protected function createComponentFirstForm(): Form @@ -61,14 +62,18 @@ protected function createComponentSecondForm(): Form $dynamicVariable = $this->name; $form->addText($dynamicVariable, 'Dynamic name (variable)'); - $dynamicPropertyFetch = new stdClass(); - $form->addPassword($dynamicPropertyFetch->name, 'Dynamic name (property fetch)'); + $slide = $this->slide; + $form->addPassword($slide->name, 'Dynamic name (property fetch)'); - $slide = new stdClass(); $container = $form->addContainer($slide->id); $container->addText('title', 'Title'); $container->addImageButton('image', 'Image'); + $multiContainer = $form->addContainer('multi'); + $slideTitleContainer = $multiContainer->addContainer($slide->title); + $slideTitleContainer->addText('en'); + $slideTitleContainer->addText('sk'); + $defaults = []; $form->setDefaults($defaults); @@ -170,8 +175,8 @@ protected function createComponentContainerForm(): Form $part3 = $form->addContainer('part3'); for ($i = 0; $i < 2; $i++) { $subContainer = $part3->addContainer($i); - $subContainer->addText('title','Title'); - $subContainer->addImageButton('image','Image'); + $subContainer->addText('title', 'Title'); + $subContainer->addImageButton('image', 'Image'); } $form->onSuccess[] = function (Form $form, array $values): void { diff --git a/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/Fixtures/templates/Forms/default.latte b/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/Fixtures/templates/Forms/default.latte index 46fd90e8..b4c47f22 100644 --- a/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/Fixtures/templates/Forms/default.latte +++ b/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/Fixtures/templates/Forms/default.latte @@ -141,12 +141,21 @@ {input radio_list:4}{label radio_list:4 /} {php \PHPStan\dumpType($form[$dynamicVariable])} {input $dynamicVariable} - {php \PHPStan\dumpType($form[$dynamicPropertyFetch->name])} - {input $dynamicPropertyFetch->name} + {php \PHPStan\dumpType($form[$slide->name])} + {input $slide->name} {formContainer $slide->id} {input title} {input image} {/formContainer} + + {formContainer "multi-$slide->title"} + {input en} + {input sk} + {/formContainer} + + {input multi-{$slide->title}-en} + {input multi-{$slide->title}-sk} + {input submit, 'class' => 'btn'} {/form} diff --git a/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/LatteTemplatesRuleForPresenterTest.php b/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/LatteTemplatesRuleForPresenterTest.php index 2153d93e..2e6eb11b 100644 --- a/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/LatteTemplatesRuleForPresenterTest.php +++ b/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/LatteTemplatesRuleForPresenterTest.php @@ -529,6 +529,16 @@ public function testForms(): void 144, 'default.latte', ], + [ + 'Form control with name "2" probably does not exist.', + 173, + 'default.latte', + ], + [ + 'Form control with name "10" probably does not exist.', + 178, + 'default.latte', + ], ]); } diff --git a/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/Source/Slide.php b/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/Source/Slide.php new file mode 100644 index 00000000..9010d80a --- /dev/null +++ b/tests/Rule/LatteTemplatesRule/PresenterWithoutModule/Source/Slide.php @@ -0,0 +1,14 @@ +