feature/slug-handling #18
@ -12,6 +12,8 @@ interface IPersistentDataManager
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public function selectFromDbById($id, string $type, bool $useRelations = false, array $withRelations = []);
 | 
					    public function selectFromDbById($id, string $type, bool $useRelations = false, array $withRelations = []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function selectFromDbBySlug(string $slug, string $type, bool $useRelations = false, array $withRelations = []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function loadRelationsFromDb(Model $model, bool $recursive = false, array $withRelations = []): void;
 | 
					    public function loadRelationsFromDb(Model $model, bool $recursive = false, array $withRelations = []): void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function saveToDb(Model $model): void;
 | 
					    public function saveToDb(Model $model): void;
 | 
				
			||||||
 | 
				
			|||||||
@ -8,9 +8,12 @@ use SokoWeb\Interfaces\Database\IAuditLogger;
 | 
				
			|||||||
use SokoWeb\Interfaces\Database\IResultSet;
 | 
					use SokoWeb\Interfaces\Database\IResultSet;
 | 
				
			||||||
use SokoWeb\Interfaces\PersistentData\IPersistentDataManager;
 | 
					use SokoWeb\Interfaces\PersistentData\IPersistentDataManager;
 | 
				
			||||||
use SokoWeb\PersistentData\Model\Model;
 | 
					use SokoWeb\PersistentData\Model\Model;
 | 
				
			||||||
 | 
					use SokoWeb\PersistentData\Model\ModelWithSlug;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PersistentDataManager implements IPersistentDataManager
 | 
					class PersistentDataManager implements IPersistentDataManager
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    const SLUG_MAX_LENGTH = 255;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private IConnection $dbConnection;
 | 
					    private IConnection $dbConnection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private ?IAuditLogger $auditLogger;
 | 
					    private ?IAuditLogger $auditLogger;
 | 
				
			||||||
@ -58,6 +61,14 @@ class PersistentDataManager implements IPersistentDataManager
 | 
				
			|||||||
        return $this->selectFromDb($select, $type, $useRelations, $withRelations);
 | 
					        return $this->selectFromDb($select, $type, $useRelations, $withRelations);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function selectFromDbBySlug(string $slug, string $type, bool $useRelations = false, array $withRelations = [])
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $select = new Select($this->dbConnection);
 | 
				
			||||||
 | 
					        $select->where('slug', '=', $slug);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $this->selectFromDb($select, $type, $useRelations, $withRelations);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function loadRelationsFromDb(Model $model, bool $recursive = false, array $withRelations = []): void
 | 
					    public function loadRelationsFromDb(Model $model, bool $recursive = false, array $withRelations = []): void
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $relations = $model::getRelations();
 | 
					        $relations = $model::getRelations();
 | 
				
			||||||
@ -103,12 +114,21 @@ class PersistentDataManager implements IPersistentDataManager
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (count($modified) > 0) {
 | 
					            if (count($modified) > 0) {
 | 
				
			||||||
 | 
					                if ($model instanceof ModelWithSlug && isset($modified['slug'])) {
 | 
				
			||||||
 | 
					                    $modified['slug'] = $this->generateUniqueSlug($model, $modified['slug']);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                $modify->setId($id);
 | 
					                $modify->setId($id);
 | 
				
			||||||
                $modify->setDiff($diff);
 | 
					                $modify->setDiff($diff);
 | 
				
			||||||
                $modify->fill($modified);
 | 
					                $modify->fill($modified);
 | 
				
			||||||
                $modify->save();
 | 
					                $modify->save();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
 | 
					            if ($model instanceof ModelWithSlug) {
 | 
				
			||||||
 | 
					                $slug = $model->generateSlug();
 | 
				
			||||||
 | 
					                $modified['slug'] = $this->generateUniqueSlug($model, $slug);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            $modify->fill($modified);
 | 
					            $modify->fill($modified);
 | 
				
			||||||
            $modify->save();
 | 
					            $modify->save();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -129,6 +149,29 @@ class PersistentDataManager implements IPersistentDataManager
 | 
				
			|||||||
        $model->resetSnapshot();
 | 
					        $model->resetSnapshot();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private function generateUniqueSlug(ModelWithSlug $model, string $notUniqueSlug): string
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $numbered = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        do {
 | 
				
			||||||
 | 
					            if ($numbered > 1) {
 | 
				
			||||||
 | 
					                $slug = substr($notUniqueSlug, 0, static::SLUG_MAX_LENGTH - (strlen((string)$numbered) + 1));
 | 
				
			||||||
 | 
					                $slug = $notUniqueSlug . '_' . (string)$numbered;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                $slug = substr($notUniqueSlug, 0, static::SLUG_MAX_LENGTH);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $select = new Select($this->dbConnection, $model::getTable());
 | 
				
			||||||
 | 
					            $select->where('slug', '=', $slug);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $numbered++;
 | 
				
			||||||
 | 
					        } while ($select->count() != 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $model->setSlug($slug);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $slug;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private function createSelect(Select $select, string $type, bool $useRelations = false, array $withRelations = []): Select
 | 
					    private function createSelect(Select $select, string $type, bool $useRelations = false, array $withRelations = []): Select
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $table = call_user_func([$type, 'getTable']);
 | 
					        $table = call_user_func([$type, 'getTable']);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user