Datagrip jak vytvořit funkci?

jAkErCZ
Člen | 321
+
0
-

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
+
0
-

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 | 321
+
0
-

@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
+
0
-

rozklikej si parametry v ladence a uvidis, ze $value neobsahuje pole, ale rovnou tu hodnotu

jAkErCZ
Člen | 321
+
0
-

Tohle mi to vypisuje…
SCREEN

jak to tedy opravím aby to ukládalo jak má?

Jinak mám ten

Editoval jAkErCZ (16. 5. 2017 12:34)

David Matějka
Moderator | 6445
+
0
-
->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 | 321
+
0
-

@DavidMatějka Ok pokusím se…

Jinak proč mě při mazání či úpravě háže tuto chybu? Zkoušel sem ji najít ale neúspěšně…
SCREEN

Editoval jAkErCZ (16. 5. 2017 12:43)

David Matějka
Moderator | 6445
+
0
-

jak vypada handleDelete metoda?

jAkErCZ
Člen | 321
+
0
-

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
+
0
-

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 | 321
+
0
-

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
+
0
-

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 | 321
+
0
-

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‘);`

David Matějka
Moderator | 6445
+
0
-

ukaz, jak to database2 predavas do presenteru

jAkErCZ
Člen | 321
+
0
-

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 | 1182
+
0
-

Offtopic:

  • getCompanysAll (nehezké)
  • getCompanies (lepší)
  • getComponiesAll (lepší)
  • getCompanyAll (lepší)
CZechBoY
Člen | 3608
+
0
-

Připadá mi že mícháš 2 věci dohromady. Pošli prosím obě celé třídy – CompanyManager a presenter k tomu.

jAkErCZ
Člen | 321
+
0
-

@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 | 321
+
0
-

Zjistil jsem že z nějakého důvodu dtagrip nepředává ID daných argumentů a já nevím absolutně proč…

Rada? nebo řešení?

David Matějka
Moderator | 6445
+
0
-

kam se nepredava ID?

jAkErCZ
Člen | 321
+
0
-

@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)

Pavel Janda
Člen | 977
+
0
-

@jAkErCZ Zkus $grid->setPrimaryKey('ID')

jAkErCZ
Člen | 321
+
-3
-

@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:
Pavel Janda
Člen | 977
+
+2
-

@jAkErCZ A čemu na té chybové hlášce nerozumíš?

jAkErCZ
Člen | 321
+
-3
-

@PavelJanda Už sem to pochopil ten setPrimaryKey měl být nad datasource… ale mám tu zas něco jiného…
a opět $id = null

DELETE
FROM `Company`
WHERE (`Company`.ID IS NULL)

Opět ID null…

Editoval jAkErCZ (17. 5. 2017 15:34)