Phalcon \ Forms \ Form связывает поле emtpy как ноль - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть таблица БД, как здесь

CREATE TABLE `tbl` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `myVar` INT NULL DEFAULT NULL,
  PRIMARY KEY (`id`));

Я хотел бы сохранить пустые значения из $ _POST как NULL.

Вот простой код:

class MyForm
{
// ...
    public function addInput()
    {
        $t = new Phalcon\Forms\Element\Text('myVar');
        $t->setFilters(['int']);
        // ...
        $this->add($t);
        return $this;
    }
}
class MyController
{
    public function myFunAction()
    {
        $form = new MyForm();
        $entity = new MyModel();
        if ($this->request->isPost() === true) {
            $post = $this->request->getPost();
            if ($form->isValid($post, $entity) === true && $entity->save()) {
                // OK
            }
        }
    }
}

когда myVar является пустой строкой при вводе текста У меня есть 0 в таблице дБ.

Это лучшее решение для хранения NULL чем переопределить связать метод в классе myForm?

1 Ответ

1 голос
/ 28 апреля 2020

Фильтр int из phalcon удаляет все символы, кроме цифр, знака плюс и минус.

Этот фильтр внутренне основан на функции PHP filter_var . Поэтому, если мы используем filter_var, мы можем написать фильтр, который возвращает значение по умолчанию как null, если фильтр не работает

<?php

function filter($input) {
    $options = array(
        'options' => array(
            'default' => NULL, // value to return if the filter fails
        ),
    );

    return filter_var($input, FILTER_VALIDATE_INT, $options);
}

var_dump(filter(1)); // Prints 1
var_dump(filter("1")); // Prints 1
var_dump(filter(0)); // Prints 0
var_dump(filter("")); // Prints NULL

Однако Phalcon не позволяет отправлять все параметры, которые filter_var на самом деле поддерживает. Так что правильный способ решить эту проблему состоит в том, чтобы реализовать свой собственный фильтр и поместить код выше.

Но если вы чувствуете себя ленивым, ленивый способ решить эту проблему - реализовать правильно, просто используйте этот код вместо сохранения в базе данных.

$input = $input === "" ? null : (int) $input;

Однако я рекомендую вам сделать это правильно, внедрив Phalcon\FilterInterface, потому что он может использовать повторно.

...