Home

Awesome

Duplicatable behavior for CakePHP

CI Coverage Status Latest Version Total Downloads Software License

This plugin contains a behavior that handles duplicating entities including related data.

Installation

Using composer

composer require riesenia/cakephp-duplicatable

Load plugin using

bin/cake plugin load Duplicatable

Usage

This behavior provides multiple methods for your Table objects.

Method duplicate

This behavior provides a duplicate method for the table. It takes the primary key of the record to duplicate as its only argument. Using this method will clone the record defined by the primary key provided as well as all related records as defined in the configuration.

Method duplicateEntity

This behavior provides a duplicateEntity method for the table. It mainly acts as the duplicate method except it does not save the duplicated record but returns the Entity to be saved instead. This is useful if you need to manipulate the Entity before saving it.

Configuration options:

Examples

class InvoicesTable extends Table
{
    public function initialize(array $config): void
    {
        parent::initialize($config);

        // add Duplicatable behavior
        $this->addBehavior('Duplicatable.Duplicatable', [
            // table finder
            'finder' => 'all',
            // duplicate also items and their properties
            'contain' => ['InvoiceItems.InvoiceItemProperties'],
            // remove created field from both invoice and items
            'remove' => ['created', 'invoice_items.created'],
            // mark invoice as copied
            'set' => [
                'name' => function($entity) {
                    return md5($entity->name) . ' ' . $entity->name;
                },
                'copied' => true
            ],
            // prepend properties name
            'prepend' => ['invoice_items.invoice_items_properties.name' => 'NEW '],
            // append copy to the name
            'append' => ['name' => ' - copy']
        ]);

        // associations (InvoiceItems table hasMany InvoiceItemProperties)
        $this->hasMany('InvoiceItems', [
            'foreignKey' => 'invoice_id',
            'className' => 'InvoiceItems'
        ]);
    }
}

// ... somewhere in the controller
$this->Invoices->duplicate(4);

Sometimes you need to access the original entity, e.g. for setting an ancestor/parent id reference. In this case you can leverage the $original entity being passed in as 2nd argument:

'set' => [
    'ancestor_id' => function ($entity, $original) {
        return $original->id;
    },
],