Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Blocks inside embed - more clear description #1069

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions latte/cs/template-inheritance.texy
Original file line number Diff line number Diff line change
Expand Up @@ -528,6 +528,8 @@ Výstup může vypadat takto:

Bloky uvnitř vložených značek tvoří samostatnou vrstvu nezávislou na ostatních blocích. Proto mohou mít stejný název jako blok mimo vložení a nejsou jím nijak ovlivněny. Pomocí značky [include |#Vykreslení bloků] uvnitř značek `{embed}` můžete vložit bloky zde vytvořené, bloky z vložené šablony (které *nejsou* [lokální |#lokální bloky]) a také bloky z hlavní šablony, které naopak *jsou* lokální. Můžete také [importovat bloky |#horizontální znovupoužití] z jiných souborů:

Bloky uvnitř `{embed}` jsou izolované od bloků vně `{embed}`, s výjimkou *lokálních* bloků. Proto mohou mít stejný název jako bloky vně `{embed}` a nedojde ke kolizi. Pomocí značky [include |#Vykreslení bloků] uvnitř značek `{embed}` můžete vložit bloky zde vytvořené, bloky z vložené šablony (které *nejsou* [lokální |#lokální bloky])) a také bloky z hlavní šablony, které naopak *jsou* lokální. Můžete také [importovat bloky |#horizontální znovupoužití] z jiných souborů:

```latte
{block outer}…{/block}
{block local hello}…{/block}
Expand Down
90 changes: 86 additions & 4 deletions php-generator/cs/@home.texy
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Generátor PHP kódu
<div class="perex">
Hledáte nástroj pro generování PHP kódu tříd, funkcí či kompletních souborů?

- Umí všechny nejnovější vychytávky v PHP (jako enumy atd.)
- Umí všechny nejnovější vychytávky v PHP (jako property hooks, enumy, atributy atd.)
- Umožní vám snadno modifikovat existující třídy
- Výstupní kód je v souladu s PSR-12 / PER coding style
- Zralá, stabilní a široce používaná knihovna
Expand Down Expand Up @@ -634,6 +634,88 @@ class Demo
```


Property Hooks
--------------

Pomocí property hooks (reprezentované třídou [PropertyHook|api:Nette\PhpGenerator\PropertyHook]) můžete definovat operace get a set pro vlastnosti, což je funkce zavedená v PHP 8.4:

```php
$class = new Nette\PhpGenerator\ClassType('Demo');
$prop = $class->addProperty('firstName')
->setType('string');

$prop->addHook('set', 'strtolower($value)')
->addParameter('value')
->setType('string');

$prop->addHook('get')
->setBody('return ucfirst($this->firstName);');

echo $class;
```

Vygeneruje:

```php
class Demo
{
public string $firstName {
set(string $value) => strtolower($value);
get {
return ucfirst($this->firstName);
}
}
}
```

Property a property hooks mohou být abstraktní nebo finální:

```php
$class->addProperty('id')
->setType('int')
->addHook('get')
->setAbstract();

$class->addProperty('role')
->setType('string')
->addHook('set', 'strtolower($value)')
->setFinal();
```


Asymetrická viditelnost
-----------------------

PHP 8.4 zavádí asymetrickou viditelnost pro vlastnosti. Můžete nastavit různé úrovně přístupu pro čtení a zápis.

Viditelnost lze nastavit buď pomocí metody `setVisibility()` se dvěma parametry, nebo pomocí `setPublic()`, `setProtected()` nebo `setPrivate()` s parametrem `mode`, který určuje, zda se viditelnost vztahuje ke čtení nebo zápisu vlastnosti. Výchozí režim je `'get'`.

```php
$class = new Nette\PhpGenerator\ClassType('Demo');

$class->addProperty('name')
->setType('string')
->setVisibility('public', 'private'); // public pro čtení, private pro zápis

$class->addProperty('id')
->setType('int')
->setProtected('set'); // protected pro zápis

echo $class;
```

Vygeneruje:

```php
class Demo
{
public private(set) string $name;

protected(set) int $id;
}
```


Jmenný prostor
--------------

Expand Down Expand Up @@ -867,10 +949,10 @@ $property = $manipulator->inheritProperty('foo');
$property->setValue('new value');
```

Metoda `implementInterface()` automaticky implementuje všechny metody z daného rozhraní ve vaší třídě:
Metoda `implement()` automaticky implementuje všechny metody z daného rozhraní ve vaší třídě:

```php
$manipulator->implementInterface(SomeInterface::class);
$manipulator->implement(SomeInterface::class);
// Nyní vaše třída implementuje SomeInterface a obsahuje všechny jeho metody
```

Expand All @@ -892,6 +974,6 @@ echo $dumper->dump($var); // vypíše ['a', 'b', 123]
Tabulka kompatibility
---------------------

PhpGenerator 4.0 a 4.1 jsou kompatibilní s PHP 8.0 až 8.3.
PhpGenerator 4.1 je kompatibilní s PHP 8.0 až 8.4.

{{leftbar: nette:@menu-topics}}
90 changes: 86 additions & 4 deletions php-generator/en/@home.texy
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ PHP Code Generator
<div class=perex>
Are you looking for a tool to generate PHP code for classes, functions, or complete files?

- Supports all the latest PHP features (like enums, etc.)
- Supports all the latest PHP features (like property hooks, enums, attributes, etc.)
- Allows you to easily modify existing classes
- Output compliant with PSR-12 / PER coding style
- Mature, stable, and widely used library
Expand Down Expand Up @@ -634,6 +634,88 @@ class Demo
```


Property Hooks
--------------

You can also define property hooks (represented by the class [PropertyHook|api:Nette\PhpGenerator\PropertyHook]) for get and set operations, a feature introduced in PHP 8.4:

```php
$class = new Nette\PhpGenerator\ClassType('Demo');
$prop = $class->addProperty('firstName')
->setType('string');

$prop->addHook('set', 'strtolower($value)')
->addParameter('value')
->setType('string');

$prop->addHook('get')
->setBody('return ucfirst($this->firstName);');

echo $class;
```

This generates:

```php
class Demo
{
public string $firstName {
set(string $value) => strtolower($value);
get {
return ucfirst($this->firstName);
}
}
}
```

Properties and property hooks can be abstract or final:

```php
$class->addProperty('id')
->setType('int')
->addHook('get')
->setAbstract();

$class->addProperty('role')
->setType('string')
->addHook('set', 'strtolower($value)')
->setFinal();
```


Asymmetric Visibility
---------------------

PHP 8.4 introduces asymmetric visibility for properties. You can set different access levels for reading and writing.

The visibility can be set using either the `setVisibility()` method with two parameters, or by using `setPublic()`, `setProtected()`, or `setPrivate()` with the `mode` parameter that specifies whether the visibility applies to getting or setting the property. The default mode is `'get'`.

```php
$class = new Nette\PhpGenerator\ClassType('Demo');

$class->addProperty('name')
->setType('string')
->setVisibility('public', 'private'); // public for read, private for write

$class->addProperty('id')
->setType('int')
->setProtected('set'); // protected for write

echo $class;
```

This generates:

```php
class Demo
{
public private(set) string $name;

protected(set) int $id;
}
```


Namespace
---------

Expand Down Expand Up @@ -867,10 +949,10 @@ $property = $manipulator->inheritProperty('foo');
$property->setValue('new value');
```

The `implementInterface()` method automatically implements all methods from the given interface in your class:
The `implement()` method automatically implements all methods from the given interface in your class:

```php
$manipulator->implementInterface(SomeInterface::class);
$manipulator->implement(SomeInterface::class);
// Now your class implements SomeInterface and includes all its methods
```

Expand All @@ -892,6 +974,6 @@ echo $dumper->dump($var); // outputs ['a', 'b', 123]
Compatibility Table
-------------------

PhpGenerator 4.0 and 4.1 are compatible with PHP 8.0 to 8.3.
PhpGenerator 4.1 is compatible with PHP 8.0 to 8.4.

{{leftbar: nette:@menu-topics}}