Render segment names in form using actual segment names

[MAILPOET-2801]
This commit is contained in:
Rostislav Wolny
2020-04-08 16:13:06 +02:00
committed by Veljko V
parent 936a75c277
commit 9701f46a77
4 changed files with 73 additions and 6 deletions

View File

@@ -234,6 +234,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Segments\SubscribersListings::class)->setPublic(true);
$container->autowire(\MailPoet\Segments\WooCommerce::class)->setPublic(true);
$container->autowire(\MailPoet\Segments\SubscribersFinder::class);
$container->autowire(\MailPoet\Segments\SegmentsRepository::class);
// Services
$container->autowire(\MailPoet\Services\Bridge::class)->setPublic(true);
$container->autowire(\MailPoet\Services\AuthorizedEmailsController::class);

View File

@@ -3,8 +3,11 @@
namespace MailPoet\Form\Block;
use MailPoet\Form\BlockWrapperRenderer;
use MailPoet\Segments\SegmentsRepository;
use MailPoet\WP\Functions as WPFunctions;
use function MailPoetVendor\array_column;
class Segment {
/** @var BlockRendererHelper */
@@ -16,10 +19,19 @@ class Segment {
/** @var BlockWrapperRenderer */
private $wrapper;
public function __construct(BlockRendererHelper $rendererHelper, BlockWrapperRenderer $wrapper, WPFunctions $wp) {
/** @var SegmentsRepository */
private $segmentsRepository;
public function __construct(
BlockRendererHelper $rendererHelper,
BlockWrapperRenderer $wrapper,
WPFunctions $wp,
SegmentsRepository $segmentsRepository
) {
$this->rendererHelper = $rendererHelper;
$this->wrapper = $wrapper;
$this->wp = $wp;
$this->segmentsRepository = $segmentsRepository;
}
public function render(array $block, array $formSettings): string {
@@ -35,8 +47,14 @@ class Segment {
: []
);
$options = array_map(function ($option) {
$option['id'] = intval($option['id']);
return $option;
}, $options);
$segmentsNamesMap = $this->getSegmentsNames($options);
foreach ($options as $option) {
if (!isset($option['id']) || !isset($option['name'])) continue;
if (!isset($option['id']) || !isset($segmentsNamesMap[$option['id']])) continue;
$isChecked = (isset($option['is_checked']) && $option['is_checked']) ? 'checked="checked"' : '';
@@ -47,7 +65,7 @@ class Segment {
$html .= 'name="' . $fieldName . '[]" ';
$html .= 'value="' . $option['id'] . '" ' . $isChecked . ' ';
$html .= $fieldValidation;
$html .= ' /> ' . $this->wp->escAttr($option['name']);
$html .= ' /> ' . $this->wp->escAttr($segmentsNamesMap[$option['id']]);
$html .= '</label>';
}
@@ -55,4 +73,14 @@ class Segment {
return $this->wrapper->render($block, $html);
}
private function getSegmentsNames($values): array {
$ids = array_column($values, 'id');
$segments = $this->segmentsRepository->findBy(['id' => $ids]);
$namesMap = [];
foreach ($segments as $segment) {
$namesMap[$segment->getId()] = $segment->getName();
}
return $namesMap;
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace MailPoet\Segments;
use MailPoet\Doctrine\Repository;
use MailPoet\Entities\SegmentEntity;
/**
* @method SegmentEntity[] findBy(array $criteria, array $orderBy = null, int $limit = null, int $offset = null)
* @method SegmentEntity|null findOneBy(array $criteria, array $orderBy = null)
* @method SegmentEntity|null findOneById(mixed $id)
* @method void persist(SegmentEntity $entity)
* @method void remove(SegmentEntity $entity)
*/
class SegmentsRepository extends Repository {
protected function getEntityClassName() {
return SegmentEntity::class;
}
}

View File

@@ -2,9 +2,11 @@
namespace MailPoet\Test\Form\Block;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Form\Block\BlockRendererHelper;
use MailPoet\Form\Block\Segment;
use MailPoet\Form\BlockWrapperRenderer;
use MailPoet\Segments\SegmentsRepository;
use MailPoet\Test\Form\HtmlParser;
use MailPoet\WP\Functions as WPFunctions;
use PHPUnit\Framework\MockObject\MockObject;
@@ -24,6 +26,9 @@ class SegmentTest extends \MailPoetUnitTest {
/** @var MockObject & BlockWrapperRenderer */
private $wrapperMock;
/** @var MockObject & SegmentsRepository */
private $segmentsRepositoryMock;
/** @var HtmlParser */
private $htmlParser;
@@ -36,11 +41,10 @@ class SegmentTest extends \MailPoetUnitTest {
'params' => [
'label' => 'Select lists',
'values' => [[
'name' => 'List 1',
'name' => 'Old ignored value',
'id' => '1',
'is_checked' => '1',
], [
'name' => 'List 2',
'id' => '2',
]],
],
@@ -54,7 +58,8 @@ class SegmentTest extends \MailPoetUnitTest {
$this->wrapperMock = $this->createMock(BlockWrapperRenderer::class);
$this->wrapperMock->method('render')->will($this->returnArgument(1));
$this->rendererHelperMock = $this->createMock(BlockRendererHelper::class);
$this->segment = new Segment($this->rendererHelperMock, $this->wrapperMock, $this->wpMock);
$this->segmentsRepositoryMock = $this->createMock(SegmentsRepository::class);
$this->segment = new Segment($this->rendererHelperMock, $this->wrapperMock, $this->wpMock, $this->segmentsRepositoryMock);
$this->htmlParser = new HtmlParser();
}
@@ -62,6 +67,10 @@ class SegmentTest extends \MailPoetUnitTest {
$this->rendererHelperMock->expects($this->once())->method('renderLabel')->willReturn('<label></label>');
$this->rendererHelperMock->expects($this->once())->method('getInputValidation')->willReturn('validation="1"');
$this->rendererHelperMock->expects($this->once())->method('getFieldName')->willReturn('Segments');
$this->segmentsRepositoryMock->expects($this->once())->method('findBy')->willReturn([
$this->createSegmentMock(1, 'List 1'),
$this->createSegmentMock(2, 'List 2'),
]);
$html = $this->segment->render($this->block, []);
@@ -78,4 +87,14 @@ class SegmentTest extends \MailPoetUnitTest {
expect($this->htmlParser->getAttribute($checkbox2Input, 'name')->value)->equals('data[Segments][]');
expect($this->htmlParser->getAttribute($checkbox1Input, 'checked')->value)->equals('checked');
}
/**
* @return MockObject & SegmentEntity
*/
private function createSegmentMock(int $id, string $name) {
$mock = $this->createMock(SegmentEntity::class);
$mock->method('getId')->willReturn($id);
$mock->method('getName')->willReturn($name);
return $mock;
}
}