Skip to content

Commit

Permalink
Added selection field helper
Browse files Browse the repository at this point in the history
  • Loading branch information
Hannes Giesenow authored and hgiesenow committed Oct 6, 2023
1 parent fc1dbc0 commit c3c0cba
Show file tree
Hide file tree
Showing 7 changed files with 181 additions and 2 deletions.
4 changes: 4 additions & 0 deletions config/services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ services:
$richtextConverter: '@ezrichtext.converter.output.xhtml5'
tags: ['elbformat_field_helper.field_helper']

elbformat_field_helper.field_helper.selection:
class: Elbformat\FieldHelperBundle\FieldHelper\SelectionFieldHelper
tags: ['elbformat_field_helper.field_helper']

elbformat_field_helper.field_helper.text:
class: Elbformat\FieldHelperBundle\FieldHelper\TextFieldHelper
tags: ['elbformat_field_helper.field_helper']
Expand Down
4 changes: 4 additions & 0 deletions docs/changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## v1.2.1
Added forgotten field helper for
* Selection

## v1.2.0
* Refactored some tests
* Improved the docker setup
Expand Down
58 changes: 58 additions & 0 deletions src/FieldHelper/SelectionFieldHelper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php

declare(strict_types=1);

namespace Elbformat\FieldHelperBundle\FieldHelper;

use Elbformat\FieldHelperBundle\Exception\FieldNotFoundException;
use Elbformat\FieldHelperBundle\Exception\InvalidFieldTypeException;
use eZ\Publish\API\Repository\Values\Content\Content;
use eZ\Publish\Core\FieldType\Selection\Value as SelectionValue;

class SelectionFieldHelper extends AbstractFieldHelper
{
public function getValue(Content $content, string $fieldName): ?int
{
$selections = $this->getMultipleValues($content, $fieldName);

$firstOption = reset($selections);
if (false === $firstOption) {
return null;
}

return $firstOption;
}

/**
* @return int[]
*/
public function getMultipleValues(Content $content, string $fieldName): array
{
$field = $this->getField($content, $fieldName);

if (!($field->value instanceof SelectionValue)) {
throw InvalidFieldTypeException::fromActualAndExpected($field->value, [SelectionValue::class]);
}

$selections = $field->value->selection;

if (empty($selections)) {
return [];
}

return $selections;
}

public function getSelectionName(Content $content, string $fieldName): ?string
{
$index = $this->getValue($content, $fieldName);
if (null === $index) {
return null;
}
$fieldDef = $content->getContentType()->getFieldDefinition($fieldName);
/** @var array{options:string[]} $settings */
$settings = $fieldDef?->getFieldSettings() ?? [];

return $settings['options'][$index] ?? null;
}
}
7 changes: 7 additions & 0 deletions src/Registry/Registry.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use Elbformat\FieldHelperBundle\FieldHelper\NumberFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\RelationFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\RichtextFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\SelectionFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\TextFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\UrlFieldHelper;

Expand Down Expand Up @@ -99,6 +100,12 @@ public function getRichtextFieldHelper(): RichtextFieldHelper

}

public function getSelectionFieldHelper(): SelectionFieldHelper
{
return $this->getFieldHelper(SelectionFieldHelper::class);

}

public function getTextFieldHelper(): TextFieldHelper
{
return $this->getFieldHelper(TextFieldHelper::class);
Expand Down
2 changes: 2 additions & 0 deletions src/Registry/RegistryInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Elbformat\FieldHelperBundle\FieldHelper\NumberFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\RelationFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\RichtextFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\SelectionFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\TextFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\UrlFieldHelper;

Expand All @@ -33,6 +34,7 @@ public function getNetgenTagsFieldHelper(): NetgenTagsFieldHelper;
public function getNumberFieldHelper(): NumberFieldHelper;
public function getRelationFieldHelper(): RelationFieldHelper;
public function getRichtextFieldHelper(): RichtextFieldHelper;
public function getSelectionFieldHelper(): SelectionFieldHelper;
public function getTextFieldHelper(): TextFieldHelper;
public function getUrlFieldHelper(): UrlFieldHelper;

Expand Down
103 changes: 103 additions & 0 deletions tests/FieldHelper/SelectionFieldHelperTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
<?php

declare(strict_types=1);

namespace Elbformat\FieldHelperBundle\Tests\FieldHelper;

use Elbformat\FieldHelperBundle\Exception\InvalidFieldTypeException;
use Elbformat\FieldHelperBundle\FieldHelper\FileFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\SelectionFieldHelper;
use eZ\Publish\API\Repository\Values\Content\Field;
use eZ\Publish\API\Repository\Values\ContentType\ContentType;
use eZ\Publish\API\Repository\Values\ContentType\FieldDefinition;
use eZ\Publish\Core\FieldType\Float\Value as FloatValue;
use eZ\Publish\Core\FieldType\Selection\Value;
use eZ\Publish\Core\Repository\Values\Content\Content;
use PHPUnit\Framework\TestCase;

class SelectionFieldHelperTest extends TestCase
{
public function testGetValue(): void
{
$content = $this->createContentFromValue(['lorem', 'ipsum'], [1]);

$fh = new SelectionFieldHelper();
$this->assertSame(1, $fh->getValue($content, 'select_field'));
}

public function testGetValueFirst(): void
{
$content = $this->createContentFromValue(['lorem', 'ipsum'], [0,1]);

$fh = new SelectionFieldHelper();
$this->assertSame(0, $fh->getValue($content, 'select_field'));
}

public function testGetValueNull(): void
{
$content = $this->createContentFromValue(['lorem', 'ipsum'], []);

$fh = new SelectionFieldHelper();
$this->assertNull($fh->getValue($content, 'select_field'));
}

public function testGetMultipleValues(): void
{
$content = $this->createContentFromValue(['lorem', 'ipsum'], [0,1]);

$fh = new SelectionFieldHelper();
$this->assertSame([0,1], $fh->getMultipleValues($content, 'select_field'));
}

public function testGetMultipleValuesEmpty(): void
{
$content = $this->createContentFromValue(['lorem', 'ipsum'], []);

$fh = new SelectionFieldHelper();
$this->assertSame([], $fh->getMultipleValues($content, 'select_field'));
}

public function testSelectionName(): void
{
$content = $this->createContentFromValue(['lorem', 'ipsum'], [1]);

$fh = new SelectionFieldHelper();
$this->assertSame('ipsum', $fh->getSelectionName($content, 'select_field'));
}

public function testSelectionNameEmpty(): void
{
$content = $this->createContentFromValue(['lorem', 'ipsum'], []);

$fh = new SelectionFieldHelper();
$this->assertNull($fh->getSelectionName($content, 'select_field'));
}

public function testInvalidFieldType(): void
{
$this->expectException(InvalidFieldTypeException::class);
$this->expectExceptionMessageMatches('/Expected field type .*Selection\\\\Value/');
$this->expectExceptionMessageMatches('/but got .*Float\\\\Value/');
$fh = new SelectionFieldHelper();
$field = new Field(['value' => new FloatValue(1.0)]);
$content = $this->createMock(Content::class);
$content->method('getField')->with('select_field')->willReturn($field);
$fh->getSelectionName($content, 'select_field');
}

protected function createContentFromValue(array $options, ?array $selected): Content
{
$field = new Field(['value' => new Value($selected)]);

$content = $this->createMock(Content::class);
$content->method('getField')->with('select_field')->willReturn($field);
$contentType = $this->createMock(ContentType::class);
$fieldDef = $this->createMock(FieldDefinition::class);
$fieldSettings = ['options' => $options];
$fieldDef->method('getFieldSettings')->willReturn($fieldSettings);
$contentType->method('getFieldDefinition')->willReturn($fieldDef);
$content->method('getContentType')->willReturn($contentType);

return $content;
}
}
5 changes: 3 additions & 2 deletions tests/Registry/RegistryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

namespace Elbformat\FieldHelperBundle\Tests\Registry;

use Elbformat\FieldHelperBundle\Exception\InvalidFieldHelperException;
use Elbformat\FieldHelperBundle\Exception\UnknownFieldHelperException;
use Elbformat\FieldHelperBundle\FieldHelper\AuthorFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\BoolFieldHelper;
Expand All @@ -15,6 +14,7 @@
use Elbformat\FieldHelperBundle\FieldHelper\NumberFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\RelationFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\RichtextFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\SelectionFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\TextFieldHelper;
use Elbformat\FieldHelperBundle\FieldHelper\UrlFieldHelper;
use Elbformat\FieldHelperBundle\Registry\Registry;
Expand Down Expand Up @@ -56,13 +56,14 @@ public function getNamedFieldHelperProvider(): array
['getNumberFieldHelper',NumberFieldHelper::class],
['getRelationFieldHelper',RelationFieldHelper::class],
['getRichtextFieldHelper',RichtextFieldHelper::class],
['getSelectionFieldHelper',SelectionFieldHelper::class],
['getTextFieldHelper',TextFieldHelper::class],
['getUrlFieldHelper',UrlFieldHelper::class],

];
}

public function testGetFieldHelperUnknown()
public function testGetFieldHelperUnknown(): void
{
$this->expectException(UnknownFieldHelperException::class);
$this->expectExceptionMessageMatches('/Unknown FieldHelper: .*TextFieldHelper/');
Expand Down

0 comments on commit c3c0cba

Please sign in to comment.