NiftyGrid vykresleni tabulky

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
muflix
Člen | 92
+
0
-

Dobrý den, zkoušel jsem doplňek NiftyGrid, podle tohoto postupu

  1. nejdříve jsem NiftyGrid.zip rozbalil a zkopíroval do app/components
  2. do AdminPresenter.php jsem vložil
protected function createComponentNovinkyGrid()
{
	return new NovinkyGrid($this->context->database->table('novinky'));
}

3. do app/models jsem přidal NovinkyGrid.php

<?php

use \NiftyGrid\Grid;

class NovinkyGrid extends Grid{

    protected $novinky;

    public function __construct($novinky)
    {
        parent::__construct();
        $this->novinky = $novinky;
    }

    protected function configure($presenter)
    {
        //Vytvoríme si zdroj dat pro Grid
        //Pri výberu dat vždy vybereme id
        $source = new \NiftyGrid\NDataSource($this->novinky->select('novinky.id, perex, text, datum_vlozeni'));
        //Predáme zdroj
        $this->setDataSource($source);

        $this->addColumn('perex', 'Perex', '100px');
        $this->addColumn('text', 'Text', '100px');
        $this->addColumn('datum_vlozeni', 'Datum', '100px');
    }
}

4. teď bych potřeboval poradit, jak to mohu zobrazit v mé .latte šabloně ?
zkoušel jsem

{control createComponentNovinkyGrid}

ale to mi píše „Component with name ‚createComponentNovinkyGrid‘ does not exist.“

Jinak používám Dibi, ale ten postup zapsání SQL by snad měl být ok.
Předem, děkuji za pomoc. Muflix

Editoval muflix (23. 8. 2012 18:45)

David Matějka
Moderator | 6445
+
0
-

napis pouze

{control novinkyGrid}

podle toho nazvu komponenty to najde tovarnicku s prefixem createComponent

muflix
Člen | 92
+
0
-

Díky moc za odpověď, teď mi to akorát ještě píše
„Service ‚database‘ not found.“
u AdminPresenteru na řádce

return new NovinkyGrid($this->context->database->table('novinky'));

přičemž v AdminPresenter.php mám něco takového, ale nevím jestli to má souvislost

class AdminPresenter extends SecuredPresenter {
        /** @var Novinky */
        private $novinky;

        protected function startup()
        {
            parent::startup();
            $this->novinky = $this->context->novinky;

a v config.neon

common:
	parameters:
		database:
			driver: mysql
			host: localhost
			database: nette
			username: root
			password: 123456
			lazy: TRUE #s db se pracuje az kdyz je potreba
			profiler: TRUE #debug panel
	services:
		connection:
			class: DibiConnection(%database%)

		novinky:
			class: Model\Novinky(@connection)

tady to asi nebude úplné ?

David Matějka
Moderator | 6445
+
0
-

za 1. definujes service connection, pak se snazis ziskat sluzbu database
a za 2. dibi nepouzivam, ale nepletes si metodu table() (a potom i select) s nette\database?

muflix
Člen | 92
+
0
-

jo máš pravdu, ale mě prostě normální Dibi syntaxe nefunguje, pouze Dibi Fluent, která se mi plete s Nette Database..

mám v models/Novinky.php

public function getTable()
{
	return $this->db->select('*')->from('novinky');
 	//return $this->db->query("SELECT * FROM novinky"); // Nefuguje proc ?:/
}

a teď sem upravil AdminPresenter.php na

protected function createComponentNovinkyGrid()
{
	return new NovinkyGrid($this->novinky->getTable());
}

jenže mi to píše
„You have an error in your SQL syntax;“
což neni divu, protože mi to vygenerovalo

SELECT COUNT(*)
FROM (
SELECT * , novinky.id, perex, text, datum_vlozeni GET PRIMARY
FROM `novinky` ) AS `data`

což nevím proč :/

MartyIX
Člen | 217
+
0
-

muflix: https://componette.org/search/?… ← rikas, ze pouzivas Dibi, tudiz bys mel pouzivat NiftyGrid\DibiFluentDataSource a ne NiftyGrid\NDataSource.

muflix
Člen | 92
+
0
-

Aha, supr diky uz to funguje :)

$source = new \NiftyGrid\DibiFluentDataSource($this->modelNovinky->getTable(),"id");

Editoval muflix (24. 8. 2012 13:14)

muflix
Člen | 92
+
0
-

Ještě bych se rád zeptal, přidal jsem do tabulky tlačítko pro smazání

$self = $this;
       $this->addButton("delete", "Smazat")
           ->setClass("delete")
           ->setLink(function($row) use ($self){return $self->link("delete!", $row['id']);})
           ->setConfirmationDialog(function($row){return "Určitě chcete odstranit novinku $row[perex]?";});

vytvořil jsem v komponentě událost(signál)

public function handleDelete($id){
	$this->modelNovinky->deleteRow($id);
}

a do modelu metodu deleteRow

public function deleteRow($id)
{
	$this->db->query("DELETE FROM novinky WHERE id = $id");
}

ono mi to správně po kliku na delete ikonku smaže záznam v tabulce, ale nezeptá se mě to jestli opravdu chci, jako kdyby to přeskočilo

->setConfirmationDialog(function($row){return "Určitě chcete odstranit novinku $row[perex]?";});

JQuery includovaný mám (ale žádný jeho doplňěk), nevíte čím by to mohlo být ?

Editoval muflix (24. 8. 2012 13:13)

David Matějka
Moderator | 6445
+
0
-

a tyhle js mas vlozeny?
https://github.com/…ee/master/js

muflix
Člen | 92
+
0
-

Neměl jsem, už to funguje, děkuji :-)
Ještě zkouším jednořádkovou editaci, a upravil jsem
NiftyGrid.php

$this->addColumn('text', 'Text', '300px')
	->setTextEditable();

        $this->addColumn('datum_vlozeni', 'Datum', '200px')
            ->setRenderer(function($row){return date('j.n.Y', strtotime($row['datum_vlozeni']));})
            ->setDateEditable();

        $self = $this;
        $this->addButton(Grid::ROW_FORM, "Rychlá editace")
            ->setClass("fast-edit");

a take jsem přidal metodu

$this->setRowFormCallback(function($values){
//db update, flash message, ..

 }
);

jelikož, ale nevím co obsahuje proměnná $values, tak jsem si jí chtěl přes print_r() vypsat ve flash zprávě. To se mi, ale nepodařilo.

Takto jde editaci otevřít a zavřít uložením, ale pokuď do Callback upravím

$this->setRowFormCallback(function($values){
	$this->flashMessage('Položka byla editována.');
	$this->redirect();
	//nebo $this->redirect('niftyTb');
	//nebo $this->redirect('Admin:niftyTb');
	//nebo bez redirectu uplně
  }
 );

a do .latte šablony přidám

{foreach $flashes as $flash}
<div class="flash {$flash->type}">{$flash->message}</div>
{/foreach}

tak se mi již editace nechce uložit (byť bez provedení změn), ale řekl bych, že se mi to sekne v tom callbacku.. na githubu doplňku jsem demo nenašel a v návodu pro flash zprávy také nevím jak vyplnit položku redirect. Co s tím ? Děkuji

Editoval muflix (26. 8. 2012 23:51)

David Matějka
Moderator | 6445
+
0
-

ve $values se nachazi pole s id radku a odeslanyma hodnotama..

v tom callbacku nemuzes pouzivat $this, protoze uz nejsi v kontextu objektu, necha se to obejit takovym trikem:

<?php

$self = $this;
$this->setRowFormCallback(function($values) use($self){

//... ulozeni atd
});

?>

do toho use napises vsechny promenne, ktere chces pouzivat v te funkci (museji byt dostupne v nadrazenem kontextu a $this nejde primo pouzit, jen nejak jak je to uvedeno)

jelikoz flash zpravu posilas do komponenty a ne do presenteru, nemusis se starat o jeji vykresleni – o to se postara sama komponenta (pokud to teda komponenta ma ve sve sablone, coz nifty grid ma).

redirect na stejnou stranku se dela pomoci ->redirect("this");, ale v tomhle pripade asi nebude potreba

muflix
Člen | 92
+
0
-

Díky moc, nakonec to mám takto

$this->setRowFormCallback(function($values) use ($self, $presenter){
              $vals = array(
                   "perex" => $values["perex"],
                   "text" => $values["text"],
                   "datum_vlozeni" => $values["datum_vlozeni"],
               );

           $presenter->context->novinky->updateTable($vals,$values["id"]);
           $self->flashMessage("Záznam byl úspěšně uložen.","grid-successful");
           }
       );
David Matějka
Moderator | 6445
+
0
-

jen to sahani pres presenter do contextu neni moc city, podle predchozich ukazek kodu mas to $presenter->context->novinky v $this->modelNovinky, ne?

takze by asi bylo nejlepsi to udelat takhle:

<?php

$this->setRowFormCallback(function($values) use ($self){
              $vals = array(
                   "perex" => $values["perex"],
                   "text" => $values["text"],
                   "datum_vlozeni" => $values["datum_vlozeni"],
               );

           $self->modelNovinky->updateTable($vals,$values["id"]);
           $self->flashMessage("Záznam byl úspěšně uložen.","grid-successful");
           }
       );

?>