Datagrip jak vytvořit funkci?
- jAkErCZ
- Člen | 322
Zdravím vás,
začal jsem používat komponent datagrip ale mám problém v tom jak vytvořit
funkci na updatování db a na mazání daného řádku..
$grid->addColumnText('Name', 'id.name')
->setSortable()
->setEditableCallback(function($id, $value) use ($manager) {
$manager->saveCompany($value);
$this->flashMessage("Id: $id, new value: $value");
$this->redrawControl('flashes');
})->addAttributes(['class' => 'text-center']);
public function saveCompany($value)
{
$this->database2->table(self::TABLE_NAME)->where(self::COLUMN_ID, $value[self::COLUMN_ID])->update($value);
}
Ale to nefunguje proč? Co dělám spatně?
a moje mazání…
$grid->addAction('delete', '', 'delete!')
->setTitle('Vymazat')
->setClass('icon-trash btn btn-xs btn-danger ajax')
->setConfirm('Opravdu chcete vymazat %s?', 'Name');
Kde tu přidám možnost že po kliknutí se zvolá nějaký public?
public function removeComapny($id)
{
$this->database2->table(self::TABLE_NAME)->where(self::COLUMN_ID, $id)->delete();
}
Ale kde v tom Action vezmu to ID?
Díky všem za rady.
D.
- David Matějka
- Moderator | 6445
Ale to nefunguje proč? Co dělám spatně?
co znamená nefunguje? hlasi to nejakou chybu? zavola se ta metoda…?
Kde tu přidám možnost že po kliknutí se zvolá nějaký public?
zavola se signal, viz doc datagridu
- jAkErCZ
- Člen | 322
@DavidMatějka Ano vyhodí chybu…
`Illegal string offset ‚ID‘ search► skip error►
Source file
File: …\app\Modules\CoreModule\model\CompanyManager.php:44
34: * Vrátí seznam firem v databázi.
35: * @return Selection seznam článků
36: */
37: public function getCompanysAll()
38: {
39: return $this->database2->table(self::TABLE_NAME);
40: }
41:
42: public function saveCompany($value)
43: {
44: $this->database2->table(self::TABLE_NAME)->where(self::COLUMN_ID,
$value[self::COLUMN_ID])->update($value);
45: }
46:
47: }`
Ale přitom ten parametr self::COLUMN_ID mám definovaný hned v prersenter…
`/** Konstanty pro manipulaci s modelem. */
const
TABLE_NAME = ‚Company‘,
COLUMN_ID = ‚ID‘;
`
- David Matějka
- Moderator | 6445
rozklikej si parametry v ladence a uvidis, ze $value
neobsahuje
pole, ale rovnou tu hodnotu
- David Matějka
- Moderator | 6445
->setEditableCallback(function($id, $value)
$id
je ID toho radku, $value
je pak retezec
s nazvem spolecnosti. nejde ti tam zadne pole, tak s tim nemuzes tak
pracovat… tak to jsou napovedy, zbytek zkus vymyslet ;)
- jAkErCZ
- Člen | 322
Ale hází mi to i u update řádku…
public function handleDelete($id)
{
$this->database2->delete('Company')
->where('id = ?', $id)
->execute();
$this->flashMessage("Položka byla smazána [$id]", 'info');
if ($this->isAjax()) {
$this->redrawControl('flashes');
$this['actionsGrid']->reload();
} else {
$this->redirect('this');
}
public function saveCompany($id, $value)
{
$this->database2->table(self::TABLE_NAME)->where(self::COLUMN_ID, $id[self::COLUMN_ID])->update($value);
}
Editoval jAkErCZ (16. 5. 2017 12:49)
- CZechBoY
- Člen | 3608
btw jestli nemáš dibi tak ti nette\database hodí chybu na execute (a vyprázdní tabulku)
$this->database2->delete('Company')
->where('id = ?', $id)
->execute();
pro ndb by to mělo být
$this->database2->table('Company')
->where('id = ?', $id)
->delete();
Editoval CZechBoY (16. 5. 2017 13:21)
- jAkErCZ
- Člen | 322
Zkusil sem to změnit a stále stejná chyba co jsem postoval víš :/
ale v error logu mám ještě…
`Nette\MemberAccessException: Cannot read an undeclared property
App\CoreModule\Presenters\CompanyPresenter::$database2. in
D:\xampp\htdocs\Entita\vendor\nette\utils\src\Utils\ObjectMixin.php:38 @ http://localhost/…eznam-firem/?… @@
exception–2017–05–16–12–32–750e08c4d2.html
`
Nemůže to být i tím že ten public function handleDelete mám
v presenteru? Nemá být v modelu?
Tak jsem to zkoušel i do modelu ale to zase prezenter jektá že tam nemá tu funkci handleDelete
Editoval jAkErCZ (16. 5. 2017 13:33)
- CZechBoY
- Člen | 3608
Handle metody mají být v presenterech (nebo komponentách). V presenteru můžeš volat modelové metody, ale musíš si ten model předat do presenteru. https://doc.nette.org/…dependencies
- jAkErCZ
- Člen | 322
Po připojení db mi to hází něco jiného…
`Call to a member function table() on null search►
Source file
File: …\Modules\CoreModule\presenters\CompanyPresenter.php:184
174: ‚id.identificationnumber‘ ⇒ ‚IČO‘,
175:
176: ]);
177: $grid->setTranslator($translator);
178:
179: return $grid;
180: }
181:
182: public function handleDelete($id)
183: {
184: $this->database2->table(‚Company‘)
185: ->where(‚id = ?‘, $id)
186: ->delete();
187:
188: $this->flashMessage(„Položka byla smazána [$id]“,
‚info‘);`
- jAkErCZ
- Člen | 322
Tímto:
use App\CoreModule\Model\CompanyManager;
/** @var databese */
private $database2;
A na aktualizaci mi to vypisuje tento error…
Nette\InvalidArgumentException search►
Source file
Call stack
...\app\Modules\CoreModule\model\CompanyManager.php:44 source Nette\Database\Table\Selection->update(arguments)
34: * Vrátí seznam firem v databázi.
35: * @return Selection seznam článků
36: */
37: public function getCompanysAll()
38: {
39: return $this->database2->table(self::TABLE_NAME);
40: }
41:
42: public function saveCompany($id, $value)
43: {
44: $this->database2->table(self::TABLE_NAME)->where(self::COLUMN_ID, $id[self::COLUMN_ID])->update($value);
45: }
46:
47:
48: }
Už jsem fakt bezradný celý google lustruju a nic nikde není..
Editoval jAkErCZ (16. 5. 2017 13:59)
- Pavel Kravčík
- Člen | 1196
Offtopic:
- getCompanysAll (nehezké)
- getCompanies (lepší)
- getComponiesAll (lepší)
- getCompanyAll (lepší)
- jAkErCZ
- Člen | 322
@CZechBoY Tady máš CompanyManager
<?php
namespace App\CoreModule\Model;
use App\Model\BaseManager;
use Nette\Database\Table\IRow;
use Nette\Database\Table\Selection;
use Nette\Utils\ArrayHash;
/**
* Třída poskytuje metody pro správu článků v redakčním systému.
* @package App\CoreModule\Model
*/
class CompanyManager extends BaseManager
{
/** Konstanty pro manipulaci s modelem. */
const
TABLE_NAME = 'Company',
COLUMN_ID = 'ID';
/**
* Vrátí seznam firem v databázi.
* @return Selection seznam článků
*/
public function getCompanys($limit = 10, $offset = 0)
{
$database = $this->database2->table(self::TABLE_NAME);
$select = ($limit === FALSE ? $database->select(self::COLUMN_ID) : $database->order(self::COLUMN_ID) );
return ($limit === FALSE ? $select : $select->limit($limit, $offset));
}
/**
* Vrátí seznam firem v databázi.
* @return Selection seznam článků
*/
public function getCompanysAll()
{
return $this->database2->table(self::TABLE_NAME);
}
public function saveCompany($id, $value)
{
$this->database2->table(self::TABLE_NAME)->where(self::COLUMN_ID, $id[self::COLUMN_ID])->update($value);
}
}
a zde CompanyPresenter
<?php
namespace App\CoreModule\Presenters;
use App\CoreModule\Model\CompanyManager;
use Nette\Security\IUserStorage;
use Nette\Application\BadRequestException;
use Nette\Database\UniqueConstraintViolationException;
use Nette\Utils\ArrayHash;
use Nette\Localization\ITranslator;
use Ublaboo\DataGrid\DataGrid;
/**
* Zpracovává práci s firmami.
* @package App\CoreModule\Presenters
*/
class CompanyPresenter extends BaseCorePresenter {
/** Konstanta s hodnotou URL výchozího článku. */
const DEFAULT_COMPANY_ID = '1';
/** @var CompanyManager Instance třídy modelu pro práci s firmami. */
protected $companyManager;
/** @var databese */
public $database2;
/** Volá se před každou akcí presenteru a inicializuje společné proměnné. */
public function startup() {
parent::startup();
if (!$this->getUser()->isLoggedIn()) {
if ($this->getUser()->getLogoutReason() === IUserStorage::INACTIVITY) {
$this->flashMessage('Byl jste odhlášen kvůli nečinnosti. Přihlaste se znovu.');
}
$this->redirect('Login:default');
}
}
/**
* Konstruktor s injektovaným modelem pro práci s firmami.
* @param CompanyManager $companyManager automaticky injektovaná třída modelu pro práci s firmami
*/
public function __construct(CompanyManager $companyManager, \App\Model\ConnectionCompany $database2) {
parent::__construct();
$this->companyManager = $companyManager;
$this->database2 = $database2->getConnection();
}
/** Vykreslí seznam firem do šablony. */
public function renderList($page = 1)
{
/*$onPage = 20;
$offset = ($page * $onPage) - $onPage;
$this->template->page = $page;
$this->template->previous = $this->getPrevious($page);
$this->template->nexts = $this->getNexts($page, count($this->companyManager->getCompanys(false)));
$this->template->companys = $this->companyManager->getCompanys($onPage, $offset);*/
}
public function createComponentSimpleGrid($name)
{
$manager = $this->companyManager;
$grid = new DataGrid($this, $name);
$grid->setDataSource($manager->getComponiesAll());
$grid->addColumnNumber('ID', '#')
->setSortable();
$grid->addColumnText('Name', 'id.name')
->setSortable()
->setEditableCallback(function($id, $value) use ($manager) {
$manager->saveCompany($id, $value);
$this->flashMessage("Id: $id, new value: $value");
$this->redrawControl('flashes');
})->addAttributes(['class' => 'text-center']);
$grid->addColumnText('Email', 'id.mail')
->setSortable()
->setEditableCallback(function($id, $value) use ($manager) {
// $manager->neco(blabla);
$this->flashMessage("Id: $id, new value: $value");
$this->redrawControl('flashes');
})->addAttributes(['class' => 'text-center']);
$grid->addColumnText('Street', 'id.street')
->setSortable()
->setEditableCallback(function($id, $value) use ($manager) {
// $manager->neco(blabla);
$this->flashMessage("Id: $id, new value: $value");
$this->redrawControl('flashes');
})->addAttributes(['class' => 'text-center']);
$grid->addColumnText('Town', 'id.town')
->setSortable()
->setEditableCallback(function($id, $value) use ($manager) {
// $manager->neco(blabla);
$this->flashMessage("Id: $id, new value: $value");
$this->redrawControl('flashes');
})->addAttributes(['class' => 'text-center']);
$grid->addColumnText('ZipCode', 'id.zipcode')
->setSortable()
->setEditableCallback(function($id, $value) use ($manager) {
// $manager->neco(blabla);
$this->flashMessage("Id: $id, new value: $value");
$this->redrawControl('flashes');
})->addAttributes(['class' => 'text-center']);
$grid->addColumnText('PhoneNumber', 'id.phonenumber')
->setSortable()
->setEditableCallback(function($id, $value) use ($manager) {
// $manager->neco(blabla);
$this->flashMessage("Id: $id, new value: $value");
$this->redrawControl('flashes');
})->addAttributes(['class' => 'text-center']);
$grid->addColumnText('PhoneNumber2', 'id.phonenumber2')
->setSortable()
->setEditableCallback(function($id, $value) use ($manager) {
// $manager->neco(blabla);
$this->flashMessage("Id: $id, new value: $value");
$this->redrawControl('flashes');
})->addAttributes(['class' => 'text-center']);
$grid->addColumnText('IdentificationNumber', 'id.identificationnumber')
->setSortable()
->setEditableCallback(function($id, $value) use ($manager) {
// $manager->neco(blabla);
$this->flashMessage("Id: $id, new value: $value");
$this->redrawControl('flashes');
})->addAttributes(['class' => 'text-center']);
$grid->addFilterText('Name', 'Search:', ['Name', 'Email', 'IdentificationNumber'])
->setPlaceholder('Jméno,E-mail,IČO...');
if ($this->getUser()->isInRole('admin'))
{
$grid->addAction('delete', '', 'delete!')
->setTitle('Vymazat')
->setClass('icon-trash btn btn-xs btn-danger ajax')
->setConfirm(function($item) {
return 'Opravdu chcete smazat řádek s id ' . $item->ID . ' a jménem ' . $item->Name . '?';
});
}
/**
* Překlad
*/
$translator = new \Ublaboo\DataGrid\Localization\SimpleTranslator([
'ublaboo_datagrid.no_item_found_reset' => 'Žádné položky nenalezeny. Filtr můžete vynulovat',
'ublaboo_datagrid.no_item_found' => 'Žádné položky nenalezeny.',
'ublaboo_datagrid.here' => 'zde',
'ublaboo_datagrid.items' => 'Položky',
'ublaboo_datagrid.all' => 'všechny',
'ublaboo_datagrid.from' => 'z',
'ublaboo_datagrid.reset_filter' => 'Resetovat filtr',
'ublaboo_datagrid.group_actions' => 'Hromadné akce',
'ublaboo_datagrid.show_all_columns' => 'Zobrazit všechny sloupce',
'ublaboo_datagrid.hide_column' => 'Skrýt sloupec',
'ublaboo_datagrid.action' => 'Akce',
'ublaboo_datagrid.previous' => 'Předchozí',
'ublaboo_datagrid.next' => 'Další',
'ublaboo_datagrid.choose' => 'Vyberte',
'ublaboo_datagrid.execute' => 'Provést',
'id.name' => 'Firma',
'id.mail' => 'E-mail',
'id.street' => 'Ulice',
'id.town' => 'Město',
'id.zipcode' => 'PSČ',
'id.phonenumber' => 'Telefon',
'id.phonenumber2' => 'Telefon 2',
'id.identificationnumber' => 'IČO',
]);
$grid->setTranslator($translator);
return $grid;
}
public function handleDelete($id)
{
$this->database2->table('Company')
->where('ID = ?', $id)
->delete();
$this->flashMessage("Položka byla smazána [$id]", 'info');
if ($this->isAjax()) {
$this->redrawControl('flashes');
$this['simpleGrid']->reload();
} else {
$this->redirect('this');
}
}
/* public function handleDelete($id)
{
dump($id);
}*/
}
Opravdu potřebuji tu ukládání a mazání zprovoznit… tlačí mě hodně čas ..
Editoval jAkErCZ (17. 5. 2017 12:54)
- jAkErCZ
- Člen | 322
@DavidMatějka
No do hodnoty $id…
Třeba při aktualizaci jsem si nechal vypsat argumenty které se tam přenáší…
$id = NULL
$value = "Test company-ja" (15)
Prostě ani do funkce mazání a ani do funkce aktualizace databáze se mi nepřenese ID daného itemu.
A nevím proč už to řeším 3 dny a fakt už nevím co stím prolezl jsem celej google nikde nic…
ale přitom když chci něco smazat tak tam mám…
$grid->addAction('delete', '', 'delete!')
->setTitle('Vymazat')
->setClass('icon-trash btn btn-xs btn-danger ajax')
->setConfirm(function($item) {
return 'Opravdu chcete smazat řádek s id ' . $item->ID . ' a jménem ' . $item->Name . '?';
});
a hodnota $item->ID mi vrátí hodnotu řádku… ale již nepřenese do handleDelete($id)
Editoval jAkErCZ (17. 5. 2017 13:50)
- jAkErCZ
- Člen | 322
@PavelJanda A to mám vložit do do všech řádků nebo kam? Jelikož když jsem ho dal
$manager = $this->companyManager;
$grid = new DataGrid($this, $name);
$grid->setDataSource($manager->getComponiesAll());
$grid->setPrimaryKey('ID');
tak mám chybu…
Please set datagrid primary key before setting datasource. search►
Source file
Call stack
...\Modules\CoreModule\presenters\CompanyPresenter.php:73 source Ublaboo\DataGrid\DataGrid->setPrimaryKey(arguments)
63: $this->template->companys = $this->companyManager->getCompanys($onPage, $offset);*/
64: }
65:
66:
67: public function createComponentSimpleGrid($name)
68: {
69: $manager = $this->companyManager;
70: $grid = new DataGrid($this, $name);
71:
72: $grid->setDataSource($manager->getComponiesAll());
73: $grid->setPrimaryKey('ID');
74:
75: $grid->addColumnNumber('ID', '#')
76: ->setSortable();
77: