CakePHP3: plugin that facilitates versioned database entities

Overview

Build Status Coverage Status Total Downloads Latest Stable Version Documentation Status Gratipay

Version

A CakePHP 4.x plugin that facilitates versioned database entities

Installation

Add the following lines to your application's composer.json:

"require": {
    "josegonzalez/cakephp-version": "dev-master"
}

followed by the command:

composer update

Or run the following command directly without changing your composer.json:

composer require josegonzalez/cakephp-version:dev-master

Usage

In your app's config/bootstrap.php add:

Plugin::load('Josegonzalez/Version', ['bootstrap' => true]);

Usage

Run the following schema migration:

CREATE TABLE `version` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `version_id` int(11) DEFAULT NULL,
    `model` varchar(255) NOT NULL,
    `foreign_key` int(10) NOT NULL,
    `field` varchar(255) NOT NULL,
    `content` text NULL,
    `created` datetime NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Note that the content field must be nullable if you want to be able to version any nullable fields in your application.

You may optionally add a version_id field of type integer to the table which is being versioned. This will store the latest version number of a given page.

If you wish to create the table using cakephp/migrations then you will need to use a migration that looks something like this:

<?php

use Phinx\Migration\AbstractMigration;

class CreateVersions extends AbstractMigration
{
    public function change()
    {
        $this->table('version')
             ->addColumn('version_id', 'integer', ['null' => true])
             ->addColumn('model', 'string')
             ->addColumn('foreign_key', 'integer')
             ->addColumn('field', 'string')
             ->addColumn('content', 'text', ['null' => true])
             ->addColumn('created', 'datetime')
             ->create();
    }
}

Add the following line to your entities:

use \Josegonzalez\Version\Model\Behavior\Version\VersionTrait;

And then include the trait in the entity class:

class PostEntity extends Entity {
    use VersionTrait;
}

Attach the behavior in the models you want with:

public function initialize(array $config) {
    $this->addBehavior('Josegonzalez/Version.Version');
}

Whenever an entity is persisted - whether via insert or update - that entity is also persisted to the version table. You can access a given revision by executing the following code:

// Will contain a generic `Entity` populated with data from the specified version.
$version = $entity->version(1);

You can optionally retrieve all the versions:

$versions = $entity->versions();

Storing Additional Meta Data

cakephp-version dispatches an event Model.Version.beforeSave which you can optionally handle to attach additional meta-data about the version.

Add the necessary additional fields to your migration, for example:

CREATE TABLE `version` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `version_id` int(11) DEFAULT NULL,
    `model` varchar(255) NOT NULL,
    `foreign_key` int(10) NOT NULL,
    `field` varchar(255) NOT NULL,
    `content` text,
    `created` datetime NOT NULL,
    `custom_field1` varchar(255) NOT NULL, /* column to store our metadata */
    `custom_field2` varchar(255) NOT NULL, /* column to store our metadata */
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Then define an event listener to handle the event and pass in additional metadata, for example:

use Cake\Event\Event;
use Cake\Event\EventListenerInterface;

class VersionListener implements EventListenerInterface {

    public function implementedEvents() {
        return array(
            'Model.Version.beforeSave' => 'insertAdditionalData',
        );
    }

    public function insertAdditionalData(Event $event) {
        return [
            'custom_field1' => 'foo',
            'custom_field2' => 'bar'
        ];
    }
}

Your event listener can then be attached in your project, for example:

use App\Event\VersionListener;
use Cake\Event\EventManager;

$VersionListener = new VersionListener();
EventManager::instance()->on($VersionListener);

Note that handling this event also allows you to modify/overwrite values generated by the plugin. This can provide useful functionality, but ensure that if your event listener returns array keys called version_id, model, foreign_key, field, content or created that this is the intended behavior.

Storing user_id as Meta Data

To store the user_id as additional meta data is easiest in combination with Muffin/Footprint. The above insertAdditionalData() method could then look like this:

    /**
     * @param \Cake\Event\Event $event
     *
     * @return array
     */
    public function insertAdditionalData(Event $event)
    {
        $data = [
            ...
        ];

        if ($event->data('_footprint')) {
            $user = $event->data('_footprint');
            $data += [
                'user_id' => $user->id,
            ];
        }

        return $data;
    }

Any controller with the FootprintAwareTrait used will then provide the _footprint data into the model layer for this event callback to use.

Bake Integration

If you load the plugin using 'bootstrap' => true, this plugin can be used to autodetect usage via the properly named database table. To do so, simply create a table with the version schema above named after the table you'd like to revision plus the suffix _versions. For instance, to version the following table:

CREATE TABLE `posts` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `category_id` int(11) DEFAULT NULL,
    `user_id` int(11) DEFAULT NULL,
    `status` varchar(255) NOT NULL DEFAULT 'published',
    `visibility` varchar(255) NOT NULL DEFAULT 'public',
    `title` varchar(255) NOT NULL DEFAULT '',
    `route` varchar(255) DEFAULT NULL,
    `content` text,
    `published_date` datetime DEFAULT NULL,
    `created` datetime NOT NULL,
    `modified` datetime NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Create the following table:

CREATE TABLE `posts_versions` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `version_id` int(11) NOT NULL,
    `model` varchar(255) NOT NULL,
    `foreign_key` int(11) NOT NULL,
    `field` varchar(255) NOT NULL,
    `content` text,
    `created` datetime NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

You can create a migration for this with the following bake command:

bin/cake bake migration create_posts_versions version_id:integer model foreign_key:integer field content:text created

You'll also want to set the content field in this migration to nullable, otherwise you won't be able to version fields that can be nulled.

To track the current version in the posts table, you can create a migration to add the version_id field to the table:

bin/cake bake migration add_version_id_to_posts version_id:integer

Configuration

There are five behavior configurations that may be used:

  • versionTable: (Default: version) The name of the table to be used to store versioned data. It may be useful to use a different table when versioning multiple types of entities.
  • versionField: (Default: version_id) The name of the field in the versioned table that will store the current version. If missing, the plugin will continue to work as normal.
  • additionalVersionFields: (Default ['created']) The additional or custom fields of the versioned table to be exposed as well. By default prefixed with version_, e.g. 'version_user_id' for 'user_id'.
  • referenceName: (Default: db table name) Discriminator used to identify records in the version table.
  • onlyDirty: (Default: false) Set to true to version only dirty properties.
Comments
  • Fix additional data coming from right table.

    Fix additional data coming from right table.

    We must read the created/user_id from the correct table, in this case the versions one.

    Now a versions dropdown can actually display the additional meta data:

    <option value="6">6 (3/19/17, 9:30 PM by uid 2)</option>
    
    opened by dereuromark 8
  • Versions get saved but can't retrieve them in my views

    Versions get saved but can't retrieve them in my views

    Hi,

    First of all, thanks a lot for your awesome work :-) I'm trying to implement your awesome plugin, but I'm having some troubles with it, and I think it may be a bug...

    The records (versions) do get saved correctly to the database, but whenever I try to show it in my view, I get nothing... :-(

    Am I missing something?

    Thanks in advance! Gonzalo

    src/Model/Entity/Page.php

    <?php
    //namespace App\Model\Entity;
    namespace SiteManager\Model\Entity;
    
    use Cake\ORM\Entity;
    use \Josegonzalez\Version\Model\Behavior\Version\VersionTrait;
    
    /**
     * Page Entity.
     */
    class Page extends Entity
    {
        use VersionTrait;
    
        /**
         * Fields that can be mass assigned using newEntity() or patchEntity().
         *
         * @var array
         */
        protected $_accessible = [
            'title' => true,
            'content' => true,
            'album_id' => true
        ];
    }
    

    src/Model/Table/PagesTable.php

    class PagesTable extends Table
    {
        public function initialize(array $config)
        {
            $this->table('pages');
            $this->displayField('title');
            $this->primaryKey('id');
            $this->addBehavior('Timestamp');
            $this->belongsTo('Albums', [
                'foreignKey' => 'album_id',
                'className' => 'SiteManager.Albums'
            ]);
    
            $this->addBehavior('Josegonzalez/Version.Version');
    }
    

    src/Controller/PagesController.php

        public function view($id = null)
        {
            $page = $this->Pages->get($id, [
                'contain' => []
            ]);
    
            $version_3 = $page->version(3);
            debug($version_3); // outputs: null
    
            $versions = $page->versions();
            debug($versions); // outputs: []
            $this->set('versions', $versions);
    
            $this->set('page', $page);
            $this->set('_serialize', ['page']);
    
            debug($page); // outputs: see next block 
        }
    
    object(SiteManager\Model\Entity\Page) {
    
        'id' => (int) 21,
        'title' => 'Contact',
        'content' => '<p>Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Vivamus euismod mauris. Praesent nonummy mi in odio. Praesent venenatis metus at tortor pulvinar varius. Sed a libero.</p>',
        'image' => null,
        'slug' => 'contact',
        'album_id' => null,
        'version_id' => (int) 4,
        'created' => object(Cake\I18n\Time) {
    
            'time' => '2015-07-24T01:42:11+0000',
            'timezone' => 'UTC',
            'fixedNowTime' => false
    
        },
        '_versions' => [],
        '[new]' => false,
        '[accessible]' => [
            'title' => true,
            'content' => true,
            'album_id' => true
        ],
        '[dirty]' => [
            '_versions' => true
        ],
        '[original]' => [],
        '[virtual]' => [],
        '[errors]' => [],
        '[repository]' => 'SiteManager.Pages'
    
    }
    
    opened by chonz0 8
  • Enhance table/associations handling

    Enhance table/associations handling

    This PR provides several enhancements:

    • an ability to set referenceName (just like in the core ~Tree~ Translate behavior), table alias isn't always a good discriminator (it fails when a table is loaded several times using different aliases)
    • association handling overhaul: the idea behind versionTable config was rather unclear (sometimes used as a db table, sometimes as a TableRegistry key and sometimes as an associaciot name); now it's used to describe ORM table used to store versions.
    • public accessor for version associations: both "global" versions association and individual "per-field" associations
    • versions are hydrated using source table entityClass rather than the core Entity
    opened by robertpustulka 7
  • Cakephp 4.x

    Cakephp 4.x

    Hello,

    since I'm using this plugin in one of my 3.x cake-apps and I had to upgrade, I thought of upgrading this plugin also.

    As of my tests (manual website-tests) and your initial unit tests, this plugin is working pretty fine. Even with the footprint-plugin and the cakephp-authentication plugin. But regarding this, the README has to be updated since the syntax is slightly different. I forgot to update the README.

    I hope, everything is fine.

    opened by TheMiller2015 6
  • Seems dependency is only on cake orm

    Seems dependency is only on cake orm

    Hi @josegonzalez ,

    I am notified about this repo by lorenzo . Looking at the repo, I believe this have dependency on the cake/orm rather than on the cake framework itself.

    If you think so, I wished this could be a library which can be used by other people who are using cake as a standalone version.

    Thank you for considering.

    opened by harikt 6
  • [RFC] Added typing support

    [RFC] Added typing support

    Adds type support to versions. You can now save versions that have fields with non scalar types, and all version entities now respect the field's type.

    opened by jeremyharris 5
  • Expose preexistent logic in public function getVersionId

    Expose preexistent logic in public function getVersionId

    Need external access to this part inside beforeSave.

    
    class ConcurrentListener implements EventListenerInterface
    {
        public function implementedEvents()
        {
            return [
                'Model.beforeSave' => 'onModelBeforeChange',
                'Model.beforeDelete' => 'onModelBeforeChange',
            ];
        }
    
        public function onModelBeforeChange(Event $event, Entity $entity)
        {
            $table = $event->getSubject();
            if ($table->behaviors()->has('Version')) {
                $version_id = $table->getVersionId($entity);
                if ($version_id !== $entity->version_id) {
                    $event->stopPropagation();
                    $entity->setError('version_id', 'This entity has changed since you get it.');
                    return false;
                }
            }
        }
    }
    
    opened by bouland 4
  • update composer removing the dependency on cakephp/cakephp and to dev…

    update composer removing the dependency on cakephp/cakephp and to dev…

    …. Current time cannot remove the cake dependency due to no tests in orm resides

    Fixes #8 partially.

    Once https://github.com/cakephp/cakephp/issues/6994 is fixed , can make the necessary adjustments.

    Thank you.

    opened by harikt 4
  • Finder should be moved in Table

    Finder should be moved in Table

    The SQL finder part of the VersionTrait (and therefore inside Entity scope) should be moved into table and then called via ->versions() to keep things DRY Some would like to rather pull that from the table then from the entity

        public function versions($reset = false)
        {
            if ($reset === false && $this->has('_versions')) {
                return $this->get('_versions');
            }
    
            $table = TableRegistry::get($this->source());
    
            # --------------- START (move to table)
            $primaryKey = (array)$table->primaryKey();
    
            $query = $table->find('versions');
            $pkValue = $this->extract($primaryKey);
            $conditions = [];
            foreach ($pkValue as $key => $value) {
                $field = current($query->aliasField($key));
                $conditions[$field] = $value;
            }
            $entities = $query->where($conditions)->all();
    
            if (empty($entities)) {
                return new Collection();
            }
           # --------------- END
    
            $entity = $entities->first();
            $this->set('_versions', $entity->get('_versions'));
    
            return $this->get('_versions');
        }
    
    opened by dereuromark 3
  • feature suggestion: store the user who made the change in projects that use authentication

    feature suggestion: store the user who made the change in projects that use authentication

    Hi, I recently used this plugin in a project I was working on. We needed database version history, but there was an additional requirement - we needed to record which user made the change. I was able to solve this for my situation by adding a 'user' field to the 'version' table and extending your plugin roughly as shown in this gist: https://gist.github.com/chris48s/0614201e36fe493a2bc9

    You will note that I've referenced $_SESSION directly here, which is not ideal. This is because:

    1. The AuthComponent::user() method has been removed in CakePHP3. There is further discussion of this here: https://github.com/cakephp/cakephp/issues/3929
    2. The session object can not be used in a Model Behavior ( http://book.cakephp.org/3.0/en/development/sessions.html#accessing-the-session-object )
    3. We also can not access SessionHelper in a Model Behavior and it is now deprecated ( http://book.cakephp.org/3.0/en/views/helpers/session.html )

    so I think there is no abstraction for session that can be used in a Model Behavior.

    Nevertheless, I think this is probably a feature that other users would find useful - I can see that recording which user made a change would be a common requirement in this situation - so I've had a think about how to make this a bit more generic so it could be contributed back to the core plugin. In my case, the user info was stored in $_SESSION['Auth']['User']['name'] but if I rewrite the getUserDetails() function to something like:

    private function getUserDetails()
    {
        if (isset($this->_config['user'])) {
            $keys = $this->_config['user'];
        } else {
            return null;
        }
    
        $session = $_SESSION;
        foreach ($keys as $key) {
            if (isset($session[$key]) && !empty($session[$key])) {
                $session = $session[$key];
            } else {
                return null;
            }
        }
        $user = $session;
    
        return $user;
    }
    

    then the user can add the behaviour using a call like:

    $this->addBehavior('MyVersion', [ 'user' => ['Auth', 'User', 'name'] ]);
    $this->addBehavior('MyVersion', [ 'user' => ['Auth', 'User', 'id'] ]);
    $this->addBehavior('MyVersion', [ 'user' => ['Auth', 'User', 'LDAP', 'fullName'] ]);
    

    ..and so on, depending on the implementation of the user's auth class. Simultaneously we can still call $this->addBehavior('MyVersion'); to avoid breaking backwards compatibility and accommodate projects where authentication is not used.

    This would cover the situation where the user's Auth implementation is using the session storage engine, but does not address the case where the memory storage engine is used. So, I guess my questions are:

    1. If I were to put a bit of time into generalising this feature and submit a pull request (including update to documentation, tests, ensuring backwards-compatibility, etc), would you be interested in adding this feature to the plugin?
    2. Can anyone suggest a more elegant way of accessing the user info?
    3. Can anyone think of a way that it would also be possible to also support the memory storage engine?
    4. If not, would it be acceptable for this feature to only support use of the session storage engine?

    Cheers

    opened by chris48s 3
  • Remove EntityTrait::unsetProperty deprecation

    Remove EntityTrait::unsetProperty deprecation

    Replace EntityTrait::unset with EntityTrait::unsetProperty

    Currently when executing the tests the following Log is written:

    Deprecated Error: EntityTrait::unsetProperty() is deprecated. Use unset() instead. - C:\code\xampp\htdocs\CRM_doxx\vendor\josegonzalez\cakephp-version\src\Model\Behavior\VersionBehavior.php, line: 236 You can disable all deprecation warnings by setting Error.errorLevel to E_ALL & ~E_USER_DEPRECATED, or add vendor/josegonzalez/cakephp-version/src/Model/Behavior/VersionBehavior.php to Error.ignoredDeprecationPaths in your config/app.php to mute deprecations from only this file. In [C:\code\xampp\htdocs\CRM_doxx\vendor\cakephp\cakephp\src\Core\functions.php, line 316]

    opened by androideo 2
  • Error when retrieving and unserialising null DateTime fields

    Error when retrieving and unserialising null DateTime fields

    Hi, I am using this functionality and I have encountered a bug when I try to retrieve a version of an entry that had a timestamp field with a NULL value.

    IE, I have this Model:

    <?php
    
    namespace App\Model\Table;
    
    use Cake\ORM\Table;
    use Cake\Validation\Validator;
    
    /**
     * News Model
     */
    class NewsTable extends Table
    {
        /**
         * Initialize method
         *
         * @param array $config The configuration for the Table.
         * @return void
         */
        public function initialize(array $config): void
        {
            parent::initialize($config);
    
            $this->setTable('news');
            $this->setPrimaryKey('id');
    
            $this->addBehavior(
                'Version',
                [
                    'versionTable' => 'news_versions',
                ]
            );
        }
    
        /**
         * Default validation rules.
         *
         * @param Validator $validator
         * @return Validator
         */
        public function validationDefault(Validator $validator): Validator
        {
            $validator
                ->integer('id')
                ->allowEmptyString('id', 'create');
    
            $validator
                ->scalar('title')
                ->requirePresence('title', 'create')
                ->notEmptyString('title')
                ->maxLength('title', 200);
    
            $validator
                ->scalar('subtitle')
                ->allowEmptyString('subtitle')
                ->maxLength('subtitle', 300);
    
            $validator
                ->dateTime('visible_from')
                ->allowEmptyString('visible_from');
    
            $validator
                ->dateTime('visible_to')
                ->allowEmptyString('visible_to');
        }
    
    
    <?php
    
    namespace App\Model\Entity;
    
    use Cake\ORM\Entity;
    use Josegonzalez\Version\Model\Behavior\Version\VersionTrait;
    
    /**
     * News Entity
     *
     * @property int $id
     * @property string $title
     * @property string $subtitle
     * @property \Cake\I18n\Time $visible_from
     * @property \Cake\I18n\Time $visible_to
     *
     * @property \App\Model\Entity\Version $version
     *
     * @property array $sitemap
     */
    class News extends Entity implements SearchEngineInterface
    {
        use VersionTrait;
    
        protected $_accessible = [
            'id' => false
        ];
    }
    

    When I save it, entries in the news_versions table are correctly created for each field, Since the visible_from and visible_to fields are set as nullable on my DB, they are correctly saved with a value of "N;". When I retrieve the versions for my News entity by calling $news->versions(), I get this error:

    2022-03-31 15:14:41 Error: [Exception] DateTimeImmutable::__construct(): Failed to parse time string (N;) at position 1 (;): Unexpected character in /var/www/repo/public/vendor/cakephp/chronos/src/Chronos.php on line 109
    

    I have found out that this caused by the convertFieldsToType method, called in the groupVersions method of VersionBehavior. This happens only for Datetime fields, (other nullable fields that are saved as "N;" are being unserialized correctly) and only after updating to CakePHP 4, with version 4.0.1 of this package. This was working fine with CakePHP 3.x, and version 2 of this package. I have found that commenting the call to convertFieldsToType solves the problem (and in fact, this call wasn't present in version 2 of the library), but I'm not sure that that's the most correct way to go, therefore I haven't submitted a pull request.

    Thanks.

    bug 
    opened by matteorebeschi 4
  • Get Error: Table class for alias `versions` could not be found.

    Get Error: Table class for alias `versions` could not be found.

    Hi, I installed the plugin:dev-master in an environment with cakephp 4.2.8 and php 7.4 and after update an entities receive this error: Table class for alias versions could not be found.

    I followed the readme for installation and configuration. Also I tried to create the table class using the cake bake model but I always get the same error. Did I do something wrong ?

    Thanks

    opened by sensei84 1
  • getVersionId returns incorrect value

    getVersionId returns incorrect value

    Hi,

    I'm using this functionality, but seems to have a little problem. In this method there is query which is getting the last version_id and increase it with 1, but it's ordering by "id desc" which in my case is not correct, because my id column is not integer - it's uuid. Is it possible to make it sort by vendor_id or to be able to pass the ordering column from the config?

    Thanks.

    opened by GaTioo 0
  • Garbage collector

    Garbage collector

    Would it be useful to have a simple "max versions per entity" config? E.g. "only store the last 10 versions per posts".

    And making it simple for a project cronjob to weekly clean out older versions not needed anymore etc? Maybe providing a basic query or method in the behavior for this.

    opened by dereuromark 1
Releases(4.0.1)
Owner
Jose Diaz-Gonzalez
Jose Diaz-Gonzalez
temperature-pi: a simple Raspberry Pi based temperature logger using a DS18B20 1-Wire digital temperature sensor, & a local sqlite database

temperature-pi temperature-pi is a simple Raspberry Pi based temperature logger using a DS18B20 1-Wire digital temperature sensor, & a local sqlite da

Ronan Guilloux 23 Dec 27, 2020
DatabaseLog CakePHP plugin to log into DB instead of files. Better to filter and search.

CakePHP DatabaseLog Plugin DatabaseLog engine for CakePHP applications. This branch is for CakePHP 4.0+. See version map for details. Features Easy se

Mark Sch. 41 Jul 29, 2022
CakePHP plugin to allow passing currently logged in user to model layer.

Footprint This plugin allows you to pass the currently logged in user info to the model layer of a CakePHP application. It comes bundled with the Foot

Muffin 88 Nov 14, 2022
A light weight laravel package that facilitates dealing with arabic concepts using a set of classes and methods to make laravel speaks arabic

A light weight laravel package that facilitates dealing with arabic concepts using a set of classes and methods to make laravel speaks arabic! concepts like , Hijri Dates & Arabic strings and so on ..

Adnane Kadri 49 Jun 22, 2022
A Magento 1.x module which facilitates automatic purging of static assets from HTTP caches such as browser cache, CDN, Varnish, etc using best practices outlined within the HTML5 boilerplate community.

Magento Cachebuster Cachebuster is a Magento module which facilitates automatic purging of static assets from HTTP caches such as browser cache, CDN,

Gordon Knoppe 129 Apr 1, 2022
This extension facilitates the cms editing process in your store.

Magenerds_PageDesigner This extension facilitates the cms editing process in your store. Instead of just a wysiwyg editor you now have a drag and drop

Magenerds 92 Nov 23, 2022
A plugin that adds worker entities to minecraft.

WorkersDemo A plugin that adds worker entities to minecraft. Workers does things that players does such as mining wood/stone etc. How to use? You can

Oğuzhan 6 Dec 17, 2021
Quickly and easily expose Doctrine entities as REST resource endpoints with the use of simple configuration with annotations, yaml, json or a PHP array.

Drest Dress up doctrine entities and expose them as REST resources This library allows you to quickly annotate your doctrine entities into restful res

Lee Davis 88 Nov 5, 2022
Easily exclude model entities from eloquent queries

Laravel Excludable Easily exclude model entities from eloquent queries. This package allows you to define a subset of model entities who should be exc

H-FARM 49 Jan 4, 2023
This small POC aims to show how Symfony is able, natively without modifications, to use subdirectories for Entities, Repositories, controllers, views…

POC - Using Sub Directories in a Symfony Project This small POC aims to show how Symfony is able, natively without modifications, to use subdirectorie

Yoan Bernabeu 2 May 12, 2022
WordPress entities creation library (CPT, CT, native option page, ACF option page, user role, block pattern category, block category…)

WordPress entities creation library (CPT, CT, native option page, ACF option page, user role, block pattern category, block category…)

Loïc Antignac 2 Jul 25, 2022
Symfony Bundle to create HTML tables with bootstrap-table for Doctrine Entities.

HelloBootstrapTableBundle This Bundle provides simple bootstrap-table configuration for your Doctrine Entities. Used bootstrap-table version 1.18.3. I

Sebastian B 7 Nov 3, 2022
TYPO3 CMS extension which extends TYPO3 page cache, by tags based on entities used in fluid templates.

Fluid Page Cache for TYPO3 CMS This TYPO3 CMS extension allows you to clear frontend page caches, automatically when a displayed record has been updat

Armin Vieweg 1 Apr 8, 2022
A generic filter for contao entities.

Contao filter bundle This bundle offers a generic filter module to use with arbitrary contao entities containing standard filter with initial filters

Heimrich & Hannot GmbH 2 Jan 7, 2022
Pure PHP NoSQL database with no dependency. Flat file, JSON based document database.

Please give it a Star if you like the project ?? ❤️ SleekDB - A NoSQL Database made using PHP Full documentation: https://sleekdb.github.io/ SleekDB i

Kazi Mehedi Hasan 745 Jan 7, 2023
This project processes a small database with php all on a web server. This project uses XAMPP to run the web server and the database.

PHP-introduction This project processes a small database with php all on a web server. This project uses XAMPP to run the web server and the database.

Tyler Jacques 1 Jan 6, 2022
SleekwareDB is a NoSQL database storage service. A database storage service that can be used for various platforms and is easy to integrate.

SleekwareDB is a NoSQL database storage service. A database storage service that can be used for various platforms and is easy to integrate. NoSQL API

SleekwareDB 12 Dec 11, 2022
Automatically updated tree-formatted database from MaxMind database

Geo IP Database This is an automated repository that downloads and processes GeoLite database from Maxmind GeoLite database, and processes it to be co

Ayesh Karunaratne 7 Nov 22, 2022
A PHP MySQL database client class to simplify database access

This lightweight database class is written with PHP and uses the MySQLi extension, it uses prepared statements to properly secure your queries, no need to worry about SQL injection attacks.

Khader Handal 50 Jul 30, 2022