Skip to content

Commit 27f3285

Browse files
authored
Fix Multiline expression calc when there is no row (#2306)
1 parent fa8015b commit 27f3285

File tree

2 files changed

+19
-18
lines changed

2 files changed

+19
-18
lines changed

demos/form-control/multiline-containsmany-single.php

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
use Atk4\Ui\App;
88
use Atk4\Ui\Form;
99
use Atk4\Ui\Js\JsToast;
10-
use Doctrine\DBAL\Platforms\MySQLPlatform;
1110

1211
/** @var App $app */
1312
require_once __DIR__ . '/../init-app.php';
@@ -20,19 +19,5 @@
2019
$form->entity->save();
2120
$form->entity->setNull($form->entity->idField);
2221

23-
// fix Behat for MySQL with unordered/normalized JSON
24-
$data = $form->entity->get();
25-
if ($form->getApp()->db->getDatabasePlatform() instanceof MySQLPlatform) {
26-
assert($form->entity instanceof MultilineDelivery);
27-
$itemKey = $form->entity->fieldName()->item;
28-
if ($data[$itemKey] !== null) {
29-
uksort($data[$itemKey], static function ($a, $b) use ($form) {
30-
$fieldNamesOrder = array_flip(array_values(array_map(static fn ($v) => $v->getPersistenceName(), $form->entity->item->getFields())));
31-
32-
return $fieldNamesOrder[$a] <=> $fieldNamesOrder[$b];
33-
});
34-
}
35-
}
36-
37-
return new JsToast($form->getApp()->encodeJson($data));
22+
return new JsToast($form->getApp()->encodeJson($form->entity->get()));
3823
});

src/Form/Control/Multiline.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -830,7 +830,24 @@ private function getExpressionValues(Model $entity): array
830830
return [];
831831
}
832832

833-
$dummyModel = new Model($entity->getModel()->getPersistence(), ['table' => $entity->getModel()->table, 'idField' => false]);
833+
$dummyModel = new Model($entity->getModel()->getPersistence(), [
834+
'table' => new class($entity->getModel()->getPersistence()) extends Model {
835+
public $table = '';
836+
837+
#[\Override]
838+
public function action(string $mode, array $args = [])
839+
{
840+
assert($mode === 'select');
841+
assert($args === []);
842+
843+
$query = Persistence\Sql::assertInstanceOf($this->getPersistence())->dsql();
844+
$query->field($query->expr('[]', [1]));
845+
846+
return $query;
847+
}
848+
},
849+
'idField' => false,
850+
]);
834851

835852
$createExprFromValueFx = static function ($v) use ($dummyModel): Persistence\Sql\Expression {
836853
if (is_int($v)) {
@@ -853,7 +870,6 @@ private function getExpressionValues(Model $entity): array
853870
'actual' => $field->actual,
854871
]);
855872
}
856-
$dummyModel->setLimit(1); // TODO must work with empty table, no table should be used
857873
$values = $dummyModel->loadOne()->get();
858874
unset($values[$entity->idField]);
859875

0 commit comments

Comments
 (0)