Ublaboo datagrid – ako zamedziť edit cez setEditableCallback() na určitých riadkoch
- Čamo
- Člen | 798
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)
- jAkErCZ
- Člen | 322
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
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)
- Čamo
- Člen | 798
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)
- iNviNho
- Člen | 352
@Čamo ked si inspectneš na stránke datagridu button, ktory „zapne“ inline edit, tak je to button:
<?php
<a href="/datagrid/?examplesGrid-id=2&examplesGrid-per_page=10&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&examplesGrid-per_page=10&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)