neprochází signály z komponent – DataGrid

Kryšpin
Člen | 27
+
0
-

Zdravím,

už delší dobu bojuji s problémem v Nette 3, kdy mám v komponentě DataGrid a ten bohužel nepředá např. při kliknutí na řazení v záhlaví signál a s končí to s hláškou typu:

Nette\Application\UI\BadSignalException #403
The signal receiver component ‚uploadedFile-44‘ is not found.

Komponentu vytvářím továrničkou:

IUploadedFileFactory

namespace XXX\Components;

interface IUploadedFileFactory
{
	public function create(): \XXX\Components\UploadedFileControl;
}

Zaregistruji v common.neon:

services:
	uploadedFileFactory:
		implement: XXX\Components\IUploadedFileFactory

V presenteru si ji injectnu a vytvořím funkci createComponentUploadedFile:

/** @var \XXX\Components\IUploadedFileFactory @inject */
public $uploadedFileFactory;

public function createComponentUploadedFile()
{
	return $this->uploadedFileFactory->create();
}

V šabloně presenteru vložím control:

{control uploadedFile $id_user}

Samotná komponenta UploadedFileControl:

use Nette\Application\UI\Control,
	Nette\Application\UI\Multiplier,
	Nette\Tracy;
use Dibi\Connection;
use Ublaboo\DataGrid\DataGrid;
use Ublaboo\DataGrid\Localization\SimpleTranslator;

namespace XXX\Components;

/**
 * UploadedFile - List of uploaded Files
 *
 * @author Ing. Pavel Kryštůfek
 */
class UploadedFileControl extends \Nette\Application\UI\Control {

	/** @var $IDu int */
	private $IDu;

	/** @var \Dibi\Connection */
    public $db;

	public function __construct(\Dibi\Connection $connection)
	{
		$this->db = $connection;
	}

	/**
	 * Vykresleni
	 *
	 * @param int $ID_user ID uživatele
	 *
	 * @see Nette\Application\Control#render()
	 */
	public function render($ID_user): void
	{
		$this->IDu = $ID_user;
		$grid = new \Ublaboo\DataGrid\DataGrid($this, $this->IDu);
		$grid->setPrimaryKey('id');
		$grid->setDataSource($this->db
				->select(****)
				->from(***)
				->where(***)
				->orderBy(**));
		$grid->addColumnDateTime('date', 'Date')
				->setFormat('d-m-Y H:i:s')
				->setAlign('left')
				->setSortable();
		$grid->addColumnText('name_real', 'Uploaded file')
				->setAlign('left')
				->setSortable();
		$grid->setPagination(false);
	    $grid->render();
	}
}

Nevíte kde je problém? Děkuji za jakékoliv nakopnutí.

Kryšpin
Člen | 27
+
0
-

Nevíte někdo rady? 17 dní a žádná reakce :o(

artemevsin
Člen | 61
+
0
-

Co mě tak v rychlosti napadá, tak řekl bych, že ten datagrid by měl mít vlastní komponentu, kterou vložíš do komponenty UploadedFileControl. Je to kvůli tomu, že datagrid má vlastní obsluhu signálu a tím že ho vlastně jen vyrendruješ do své komponenty přicházíš o všechny handle metody, které jsou na datagridu.

zkus to nějak takhle + do šablony komponenty musíš přidat {control grid}

<?php


use Nette\Application\UI\Control,
    Nette\Application\UI\Multiplier,
    Nette\Tracy;
use Dibi\Connection;
use Ublaboo\DataGrid\DataGrid;
use Ublaboo\DataGrid\Localization\SimpleTranslator;

namespace XXX\Components;

/**
 * UploadedFile - List of uploaded Files
 *
 * @author Ing. Pavel Kryštůfek
 */
class UploadedFileControl extends \Nette\Application\UI\Control {

    /** @var $IDu int */
    private $IDu;

    /** @var \Dibi\Connection */
    public $db;

    public function __construct(\Dibi\Connection $connection)
    {
        $this->db = $connection;
    }

    /**
     * Vykresleni
     *
     * @param int $ID_user ID uživatele
     *
     * @see Nette\Application\Control#render()
     */
    public function render($ID_user): void
    {
        $this->IDu = $ID_user;
		$this->template->render(__DIR__.'/template.latte');
    }

    protected function createComponentGrid()
    {
        $grid = new \Ublaboo\DataGrid\DataGrid($this, $this->IDu);
        $grid->setPrimaryKey('id');
        $grid->setDataSource($this->db
                ->select(****)
            ->from(***)
                ->where(***)
                ->orderBy(**));
        $grid->addColumnDateTime('date', 'Date')
            ->setFormat('d-m-Y H:i:s')
            ->setAlign('left')
            ->setSortable();
        $grid->addColumnText('name_real', 'Uploaded file')
            ->setAlign('left')
            ->setSortable();
        $grid->setPagination(false);

        return $grid;
    }
}
?>
Marek Bartoš
Nette Blogger | 1143
+
0
-

Přesně tak, datagrid musí být stejně jako kterákoli jiná komponenta připojená do stromu komponent. Buď přes $this['grid'] = new DataGrid nebo createComponentGrid()

Konkrétně u ublaboo datagridu používáme v projektu menší úpravu v zápisu, je možné že ji budeš potřebovat

	protected function createComponentGrid(string $name): DataGrid
	{
		$grid = new DataGrid();
		$this->addComponent($grid, $name);
Kryšpin
Člen | 27
+
0
-

Děkuji velice oběma. Už to funguje.

Pavel Janda
Člen | 977
+
+1
-

Ahojec. Mohl bych vás kluci poprosit, jestli byste z tohoto vlákna neudělali nějaký krátký odstavec, který bych potom prdnul do dokumentace? Zdá se mi to jako docela důležitá informace. :)
Bylo by to super, díky za response!