callbackUpdate(callable $callback)

The function callbackUpdate is used when we need to completely skip the default update functionality of Grocery CRUD Enterprise. The usage is simple, for example:

$crud->callbackUpdate(function ($stateParameters) {
    // Your code goes here

    return $stateParameters;

You can see a full working example below:

$crud->setSubject('Order', 'Orders');

$crud->callbackUpdate(function ($stateParameters) use ($callbackUpdateModel) {
    $updateString = '[Update - ' .date('d M Y') . '] ';

    if (!strstr($stateParameters->data['comments'], $updateString)) {
        $stateParameters->data['comments'] = $updateString . $stateParameters->data['comments'];

    // As we are skipping the actual update we will also need to update the data as well
    $callbackUpdateModel->updateOrder($stateParameters->data, $stateParameters->primaryKeyValue);

    return $stateParameters;

With the below live example you can see that when we are updating any row then the text "[Update - day Month]" is prepend at the beginning of the field comments.

$callbackUpdateModel is using Grocery CRUD Custom Model but you can also use your own custom model.

For reference the code for CallbackUpdate class can be found below:

namespace App\Models;
use GroceryCrud\Core\Exceptions\Exception;
use GroceryCrud\Core\Model;
use Laminas\Db\Sql\Sql;

class CallbackUpdate extends Model {
    public function updateOrder($data, $primaryKeyValue) {
        // Always make sure that we validate our data
        $fields = ['orderDate','requiredDate','shippedDate','status','comments','customerNumber'];

        // Make sure that the update data has the exact numbers of inputs
        if (count($data) !== count($fields)) {
            throw new Exception("Wrong input");

        // Make sure that we validate all of our inputs
        foreach ($data as $fieldName => $fieldValue) {
            if (!in_array($fieldName, $fields)) {
                throw new Exception("Wrong input");

        // And lastly also validating the $primaryKeyValue
        if (!is_numeric($primaryKeyValue)) {
            throw new Exception("Wrong input");

        $sql = new Sql($this->adapter);
        $update = $sql->update('orders');
            'orderNumber = ?' => $primaryKeyValue


        $statement = $sql->prepareStatementForSqlObject($update);

        return $statement->execute();