Ublaboo datagrid – ako zamedziť edit cez setEditableCallback() na určitých riadkoch

Čamo
Člen | 798
+
0
-

Zdravím,
prosím vás existuje spôsob ako povoliť editovanie konkrétneho stĺpca cez setEditableCallback() v datagride iba ak je splnená nejaká podmienka? Momentálne som sa dostal do stavu, že je možné editovať každý riadok. Použil som aj $grid->allowRowsInlineEdit ale to zdá sa na editovanie cez setEditableCallback() nemá vplyv (to by mohlo mať, alebo nie?).
Kód vyzerá takto:

foreach ( $stocks as $stock )
{
	$grid->addColumnText( 'stockAvailability-' . $stock->id, $stock->name )
		->setEditableCallback( function ( $id, $value ) {
			...
		});
}


/**
 * @desc Condition to allow inline edit for every row.
 */
$grid->allowRowsInlineEdit( function( $item ) {
	return $item->status == StockRequest::STATUS_ACCEPTED;
});

EDIT:
Skúšal som to cez addColumnCallback() a to síce správne zobrazí input pri edite iba na niektorých riadkoch ale na strane servera to vyhodí error: handleEdit() call_user_func_array() expects parameter 1 to be a valid callback, no array or string given

$grid->addColumnCallback( 'stockAvailability-' . $stock->id, function ( $column, $item ) use ( $stock, $grid ) {
	if( $item->status == StockRequest::STATUS_ACCEPTED )
	{
		$column->setEditableCallback( function ( $id, $value ) use ( $stock, $grid ) {
			...
		});
	}
});

EDIT2:
Ešte ma napadlo pridať na onclick return false aby sa input zobrazil len na vybraných elementoch. Ale nezabránil som tomu:

$grid->addColumnCallback( 'stockAvailability-' . $stock->id, function ( $column, $item ) {
	if( $item->status == StockRequest::STATUS_ACCEPTED )
	{
		$column->addAttributes(['onclick' => 'return false']);
	}
});

Editoval Čamo (8. 2. 2018 9:43)

iNviNho
Člen | 352
+
0
-

Ja to robím jednoducho, že posledný stlpec datagridu mám vždy ako template kde si vykreslujem buttony ako edit, delete atd.

Tam si jednoducho môžeš určiť podmienku presne takú istú ako máš ty a vygeneruješ si button na edit link, niečo som zabudol?

Čamo
Člen | 798
+
0
-

iNviNho No ale action button ťa niekam presmeruje a to ja nechcem. Mne ide práve o ten inline edit. Či som to nepochopil?

Editoval Čamo (8. 2. 2018 9:16)

jAkErCZ
Člen | 322
+
0
-

Já osobně jsem to dělal takto…

$grid->addColumnText('Street', 'id.street')
                ->setSortable()
                ->setEditableCallback(function($ID, $value) use ($manager) {
                    $manager->saveComponiesSingle($ID, 'Street', $value);
                    $this->presenter->flashMessage("Identifikátor: $ID , Změna: $value");
                    $this->presenter->redrawControl('flashes');
                })->addAttributes(['class' => 'text-center']);

V module

/**
	 * Získá hodnoty od CompanyPresenteru
	 */
       public function saveComponiesSingle($ID, $name, $value)
       {
              $data = [$name => $value];
              $this->saveComponies($ID, $data);
       }

A pak uložil kam potřebuji…

/**
	 * Aktualizuje hodnoty v TABLE_NAME za pomocí COLUMN_ID a nových hodnot $value
	 */
      public function saveComponies($ID, $values = [])
      {
              $this->database2->table(self::TABLE_NAME)->where('ID = ?', $ID)->update($values);
      }

Snad ti to nějak pomůže ale takto mi to fungovalo perfektně… :)

Čamo
Člen | 798
+
+1
-

jAkErCZ Ale ja potrebujem ten edit povoliť iba na niektorých riadkoch v gride. So samotným editom problém nemám. Ide o to, aby sa input na niektorých riadkoch nezobrazoval pri kliknutí.

jAkErCZ
Člen | 322
+
0
-

@Čamo Takže pokud dobře chápu ty chceš ten ->setEditableCallback mít v nějakém foreach který ti dle nějakých oprávnění zpřístupní u některých řádků InlineEdit?

Čamo
Člen | 798
+
0
-

jAkErCZ O ten foreach nejde. Ten tam je iba preto, že je počet stlpcov dynamický. Ide o riadky. Predstav si to bez toho foreach. Na niektorých riadkoch setEditableCallback chcem a na niektorých nie. Podľa nejakej podmienky ktorú tam neviem dostať.

Editoval Čamo (8. 2. 2018 9:40)

jAkErCZ
Člen | 322
+
0
-

@Čamo A co třeba přiřazovat dle oprávnění? to potom ten Edit můžeš mít jak mám já…

Čamo
Člen | 798
+
0
-

jAkErCZ Nerozumiem ako to myslíš s tými oprávneniami. Ja totiž chcem už v prehliadači rozhodnuť, či sa input zobrazí alebo nie. Oprávnenia by to riešili iba ak by podmieňovali naviazanie toho callbacku. To je to čo chcem. Ale to sa nedá.
V tvojom príklade je editovateľný každý riadok.

Editoval Čamo (8. 2. 2018 10:08)

Čamo
Člen | 798
+
0
-

Nakoniec som to urobil ako dvojstupňovú akciu. Najprv sa cez hromadné akcie vyberú položky ktoré sa budú editovať. Uložím do session ich idčka a potom zobrazím ten istý grid prefiltrovaný cez idčka a kde každý riadok sa dá editovať.

iNviNho
Člen | 352
+
0
-

@Čamo ked si inspectneš na stránke datagridu button, ktory „zapne“ inline edit, tak je to button:

<?php
<a href="/datagrid/?examplesGrid-id=2&amp;examplesGrid-per_page=10&amp;do=examplesGrid-inlineEdit" title="Edit" class="btn btn-xs btn-default ajax datagrid-inline-edit-trigger"><span class="fa fa-pencil"></span></a>
?>

a ty si vieš v stlpci napriklad action nastavit aby sa ti vykreslovala šablona a do šablony si daš podmienku:

<?php
{if ($enableInlineEdit)}
	<a href="/datagrid/?examplesGrid-id=2&amp;examplesGrid-per_page=10&amp;do=examplesGrid-inlineEdit" title="Edit" class="btn btn-xs btn-default ajax datagrid-inline-edit-trigger"><span class="fa fa-pencil"></span></a>
{/if}
?>

samozrejme parametre toho linku si musiš nastaviť sam, alebo si ho pekne vygenerovať. Asi to bude handleInlineEdit s parametrom ID riadku

Editoval iNviNho (9. 2. 2018 9:25)

Čamo
Člen | 798
+
0
-

@iNviNho To ale nieje to čo chcem alebo som to nepochopil.