Nettrine vs Datagrid Type Error
- grovik
- Člen | 54
Narazil jsem na problém, který se projevuj jen v případě použití
Datagridu (Contributte).
Tak jsem narazil na lepší definici.
Chyba se projevuje pokud zavolám getUserName() ať je to kdekoliv. Někde se
tam objeví snaha přiřadit k updatedBy string. Zajímavé je, že pokud se
uživatel přihlásí a objekt entity Users je přiražený jako součást
údajů v Authenticatoru tak jméno dostanu bez problémů.
Testováním jsem zjistil, že datagridu stačí aby tam byl odkaz na Entitu
Users a chyba je na světe.
`TypeError
Cannot assign string to property App\Model\Orm\Entity\Users::$updatedBy of type
?App\Model\Orm\Entity\Users search►
`
Pokud mám v datagridu zobrazit položku, která je vazbou na položku jinou
v jiné tabulce. Například
Autor → Uživatel.
Pro názornost (takhle to funguje a vše je v pořádku):
public function create(): DataGrid
{
$grid = new DataGrid;
$grid->setRememberState(false);
$grid->setDataSource($this->pageRepository->findAll());
$grid->addColumnText('title', 'Název')
->setFilterText();
$grid->addColumnText('link', 'Odkaz')
->setFilterText();
$grid->addAction('edit', '', 'Admin:page', ['id' => 'id'])
->setIcon('pencil-alt');
$grid->addAction('delete', '', 'Admin:deletePage', ['id' => 'id'])
->setIcon('trash-alt')
->setClass('btn btn-danger');
return $grid;
}
Pokud ovšem přidám do datagridu autora:
public function create(): DataGrid
{
$grid = new DataGrid;
$grid->setRememberState(false);
$grid->setDataSource($this->pageRepository->findAll());
$grid->addColumnText('title', 'Název')
->setFilterText();
$grid->addColumnText('link', 'Odkaz')
->setFilterText();
$grid->addColumnText('author', 'Vytvořil')
->setRenderer(function ($item) {
return $item->getAuthor()->getUserName();
});
$grid->addAction('edit', '', 'Admin:page', ['id' => 'id'])
->setIcon('pencil-alt');
$grid->addAction('delete', '', 'Admin:deletePage', ['id' => 'id'])
->setIcon('trash-alt')
->setClass('btn btn-danger');
return $grid;
}
entita PAGE má položku Author nadefinovanou takto:
#[ORM\ManyToOne(targetEntity: "Users", cascade: ["none"], inversedBy: "pages")]
#[ORM\JoinColumn(name: "author_id", referencedColumnName: "id", onDelete: "CASCADE")]
private $author;
Na protější straně je to potom takto (entita USERS):
#[ORM\OneToMany(mappedBy: "author", targetEntity: "Pages")]
#[ORM\Column(type: 'integer', nullable: true)]
public Pages $pages;
Položka updateBy je pak definována takto:
#[ORM\ManyToOne(targetEntity: "Users", cascade: ['none'])]
#[ORM\JoinColumn(name: "updated_by", referencedColumnName: "id")]
#[ORM\Column(nullable: true)]
public ?Users $updatedBy;
V jiných situacích problém není.
Pokud k tabulce Users přistupuji přes vazbu normálně dostanu všechny
hodnoty jak je potřeba. Kdykoliv se v Gridu objeví položka s odkazem na
tabulku Users tak se objeví tahle chyba.
Někde patrně něco přehlížím nebo nevím. :-) opakovaně se k tomu
vracím už asi 5 den. Zkusím něco předělat, ale zatím nic.
Díky za tipy a nápad co by tomu mohlo být.
Editoval grovik (1. 4. 13:10)
- grovik
- Člen | 54
Tak nevím. Předělal jsem půl DB a dospěl jsem k tomu, že doctrine dvě položky, které obsahují stejná data a jsou stejně nadefinované, přiděluje jiné typy z hlediska databáze.
#[ORM\ManyToOne(targetEntity: "Users")]
#[ORM\JoinColumn(name: "created_by", referencedColumnName: "id")]
public Users $createdBy;
#[ORM\ManyToOne(targetEntity: "Users")]
#[ORM\JoinColumn(name: "updated_by", referencedColumnName: "id")]
#[ORM\Column(nullable: true)]
public ?Users $updatedBy;
Jediný rozdíl je v tom, že updatedBy může být null.
Jak sáhnu po nějakém gettru třídy Users tak se mi vrátí chyba:
Cannot assign string to property App\Model\Orm\Entity\Users::$updatedBy of type ?App\Model\Orm\Entity\Users
Editoval grovik (1. 4. 21:14)