Соната Админ странная форма поведения - PullRequest
0 голосов
/ 12 сентября 2018

Я запустил игру, используя Symfony 4.x , и решил использовать traits, чтобы избежать дублирования кода.

namespace App\Traits;

use App\Entity\Brand;

/**
 * Trait ToolTrait
 * @package App\Traits
 */
trait ToolTrait
{
    /**
     * @var null|int
     */
    private $id;

    /**
     * @var null|Brand
     */
    private $brand;

    /**
     * @var null|string
     */
    private $name;

    /**
     * @var null|string
     */
    private $image;

    /**
     * @var float
     */
    private $moneyPrice = 0.00;

    /**
     * @var int
     */
    private $gemsPrice = 0;

    /**
     * @var null|float
     */
    private $maintenance = 0.00;

    /**
     * @var boolean
     */
    private $limited = false;

    /**
     * @var int
     */
    private $leftSales = 0;

    /**
     * @var int
     */
    private $totalSales = 0;

    /**
     * @var bool
     */
    private $enabled = true;

    /**
     * @return int|null
     */
    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @param int|null $id
     *
     * @return ToolTrait
     */
    public function setId(?int $id): self
    {
        $this->id = $id;

        return $this;
    }

    /**
     * @return Brand|null
     */
    public function getBrand(): ?Brand
    {
        return $this->brand;
    }

    /**
     * @param Brand|null $brand
     *
     * @return ToolTrait
     */
    public function setBrand(?Brand $brand): self
    {
        $this->brand = $brand;

        return $this;
    }

    /**
     * @return null|string
     */
    public function getName(): ?string
    {
        return $this->name;
    }

    /**
     * @param null|string $name
     *
     * @return ToolTrait
     */
    public function setName(?string $name): self
    {
        $this->name = $name;

        return $this;
    }

    /**
     * @return null|string
     */
    public function getImage(): ?string
    {
        return $this->image;
    }

    /**
     * @param null|string $image
     *
     * @return ToolTrait
     */
    public function setImage(?string $image): self
    {
        $this->image = $image;

        return $this;
    }

    /**
     * @return float|null
     */
    public function getMoneyPrice(): ?float
    {
        return $this->moneyPrice;
    }

    /**
     * @param float|null $moneyPrice
     *
     * @return ToolTrait
     */
    public function setMoneyPrice(?float $moneyPrice): self
    {
        $this->moneyPrice = $moneyPrice;

        return $this;
    }

    /**
     * @return int|null
     */
    public function getGemsPrice(): ?int
    {
        return $this->gemsPrice;
    }

    /**
     * @param int|null $gemsPrice
     *
     * @return ToolTrait
     */
    public function setGemsPrice(?int $gemsPrice): self
    {
        $this->gemsPrice = $gemsPrice;

        return $this;
    }

    /**
     * @return float|null
     */
    public function getMaintenance(): ?float
    {
        return $this->maintenance;
    }

    /**
     * @param float|null $maintenance
     *
     * @return ToolTrait
     */
    public function setMaintenance(?float $maintenance): self
    {
        $this->maintenance = $maintenance;

        return $this;
    }

    /**
     * @return bool
     */
    public function isLimited(): bool
    {
        return $this->limited;
    }

    /**
     * @param bool $limited
     *
     * @return ToolTrait
     */
    public function setLimited(bool $limited): self
    {
        $this->limited = $limited;

        return $this;
    }

    /**
     * @return int
     */
    public function getLeftSales(): int
    {
        return $this->leftSales;
    }

    /**
     * @param int $leftSales
     *
     * @return ToolTrait
     */
    public function setLeftSales(int $leftSales): self
    {
        $this->leftSales = $leftSales;

        return $this;
    }

    /**
     * @return int
     */
    public function getTotalSales(): int
    {
        return $this->totalSales;
    }

    /**
     * @param int $totalSales
     *
     * @return ToolTrait
     */
    public function setTotalSales(int $totalSales): self
    {
        $this->totalSales = $totalSales;

        return $this;
    }

    /**
     * @return bool
     */
    public function isEnabled(): bool
    {
        return $this->enabled;
    }

    /**
     * @param bool $enabled
     *
     * @return ToolTrait
     */
    public function setEnabled(bool $enabled): self
    {
        $this->enabled = $enabled;

        return $this;
    }

    /**
     * @return null|string
     */
    public function __toString()
    {
        return $this->name ?? '-';
    }
}

Это мой trait. Я не добавил сюда Doctrine mapping. Для этого я создал один файл для каждого из моих классов и установил там сопоставление ( XML ). Сопоставление хорошо, потому что ошибки нет, и я проверил ее вручную, используя HeidiSQL .

Form Validator

Проблема в том, когда я отправляю форму. Некоторые из моих свойств считаются частью сущности, некоторые нет. Это странно, потому что у меня нет детей, и сущность только реализует эту черту. Есть идеи?

Что действительно странно, так это то, что свойство fileTmp загружается из другой черты, но у него нет сопоставления (используется только для загрузки изображений).

Я должен сказать, что для этих полей у меня есть специальный тип поля, реализованный на основе документации Symfony. Если я уберу это, все будет нормально.

<?php

namespace App\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;

/**
 * Class HorsePowerType
 * @package App\Form\Type
 */
class HorsePowerType extends AbstractType
{
    /** {@inheritdoc} */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['icon'] = 'HP';
    }

    /** {@inheritdoc} */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'error_bubbling' => false
        ]);
    }

    /** {@inheritdoc} */
    public function getBlockPrefix()
    {
        return 'horse_power';
    }
}

И шаблон:

{% block horse_power_widget %}
    {% spaceless %}
        <div class="input-group">
            {{ block('form_widget_simple') }}
            <span class="input-group-addon">{{- icon|raw -}}</span>
        </div>
    {% endspaceless %}
{% endblock %}

P.S: Единственные дополнительные поля в этой сущности: horsePower, fuelTank, maxSpeed, maxCapacity.

1 Ответ

0 голосов
/ 12 сентября 2018

Я решил, добавив compound => false к configureOptions в моем типе поля.

...