neprochází signály z komponent – DataGrid
- Kryšpin
- Člen | 27
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í.
- artemevsin
- Člen | 61
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 | 1146
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);
- Pavel Janda
- Člen | 977
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!