ublaboo/datagrid komponenta v itemDetail

Martin Vágovszký
Člen | 13
+
0
-

Zdravím všechny,

Mám vytvořenou komponentu datagridu a komponentu formuláře (továrničku).
Nedaří se mi vložit komponentu formuláře do šablony itemDetailu.
Píše mi že komponentu nezná. Zkoušel jsem různé laborování s bloky a dědičnostmi šablony, ale marně. Nedaří se mi to poskládat, aby to fungovalo. Statický obsah (bez formuláře) v itemDetail.latte se vykresluje jeak má. Nedokážu s tím hnout, velké díky předem za jakoukoli radu.

Kód komponenty datagridu:

class ProjectTeamMemberGridControl extends BaseControl
{
	private int $projectId;
	private DataGridFactory $datagridFactory;
    private LevelingFormControlFactory $levelingFormControlFactory;
	...

	public function __construct(
        int $projectId,
        DataGridFactory $dataGridFactory,
        LevelingFormControlFactory $levelingFormControlFactory,
        ...
    )
	{
		$this->projectId = $projectId;
		$this->datagridFactory = $dataGridFactory;
        $this->levelingFormControlFactory = $levelingFormControlFactory;
		...
	}

	/**
	 * @throws ReflectionException
	 */
	public function render(): void
	{
		$this->getTemplate()
			->setFile(__DIR__ . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'projectTeamMemberGridControl.latte')
			->render();
	}

	/**
	 * Tady je ta snaha o vytvoření formuláře -> komponentu v komponentě - je to dobře?
	 */
    public function createComponentLevelingForm(): LevelingFormControl
    {
        return $this->levelingFormControlFactory->create();
    }

	/**
	 * @return BaseDataGrid
	 */
	public function createComponentProjectTeamMemberGridControl(): BaseDataGrid
	{
		$datagrid = $this->datagridFactory->forBackend();

		...

		$datagrid->setItemsDetail()->setIcon('pencil-alt')->setTitle('leveling');
		$datagrid->setTemplateFile(__DIR__ . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR . 'itemDetail.latte');

        ...

		return $datagrid;
	}

projectTeamMemberGridControl.latte

{layout '../../templates/@layout.latte'}
{block #component}
    {snippet datagrid}
        <div class="table-responsive">
            {control projectTeamMemberGridControl}
			{* Když vložím komponentu formuláře sem, tak se vykreslí, ale já ji chci v itemDetail *}
			{* control levelingForm *}
        </div>
    {/snippet}
{/block}

itemDetail.latte

{extends $originalTemplate}

{block detail}
    <h4>Nadpis</h4>
    <p> >>> Tady bych rád vložil komponentu formuláře, což se nedaří <<< </p>
    {*control levelingForm*}
{/block}
Martin Vágovszký
Člen | 13
+
0
-

Tak se mi to nakonec podařilo vyřešit tak, že jsem rozšířil BaseDataGrid a přidal komponentu tam.

class ProjectTeamMemberDataGrid extends BaseDataGrid
{
    private LevelingFormControlFactory $levelingFormControlFactory;

    public function createComponentLevelingForm(): LevelingFormControl
    {
        return $this->levelingFormControlFactory->create((int) $this->getParameter('id'));
    }

    public function setLevelingFormControlFactory(LevelingFormControlFactory $levelingFormControlFactory): ProjectTeamMemberDataGrid
    {
        $this->levelingFormControlFactory = $levelingFormControlFactory;
        return $this;
    }
}