Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/croogo/croogo/Settings/src/Model/Table/SettingsTable.php
<?php

namespace Croogo\Settings\Model\Table;

use
ArrayObject;
use
Cake\Core\Configure;
use
Cake\Database\Schema\TableSchema;
use
Cake\Datasource\EntityInterface;
use
Cake\Event\Event;
use
Cake\Log\Log;
use
Cake\ORM\Query;
use
Cake\ORM\RulesChecker;
use
Cake\Utility\Hash;
use
Cake\Validation\Validator;
use
Croogo\Acl\AclGenerator;
use
Croogo\Core\Model\Table\CroogoTable;
use
Croogo\Core\PluginManager;

/**
 * Setting
 *
 * @category Model
 * @package  Croogo.Settings.Model
 * @version  1.0
 * @author   Fahad Ibnay Heylaal <contact@fahad19.com>
 * @license  http://www.opensource.org/licenses/mit-license.php The MIT License
 * @link     http://www.croogo.org
 * @method Query findByKey(string $key)
 */
class SettingsTable extends CroogoTable
{

    public function
validationDefault(Validator $validator)
    {
       
$validator
           
->notBlank('key', __d('croogo', 'Key cannot be empty.'));

        return
$validator;
    }

    public function
buildRules(RulesChecker $rules)
    {
       
$rules
           
->add($rules->isUnique(
                [
'key'],
               
__d('croogo', 'That key is already taken')
            ));

        return
$rules;
    }

   
/**
     * @param array $config
     */
   
public function initialize(array $config)
    {
       
$this->addBehavior('Croogo/Core.Trackable');
//        $this->addBehavior('Croogo/Core.Ordered', [
//            'field' => 'weight',
//            'foreign_key' => false,
//        ]);
       
$this->addBehavior('Croogo/Core.Cached', [
           
'groups' => [
               
'settings',
            ],
        ]);
       
$this->addBehavior('Search.Search');

       
$this->searchManager()
            ->
add('key', 'Search.Like', [
               
'after' => true,
               
'field' => $this->aliasField('key'),
            ]);
    }

   
/**
     * @param Table $schema
     * @return Table
     */
   
protected function _initializeSchema(TableSchema $schema)
    {
       
$schema->setColumnType('params', 'params');

        return
$schema;
    }

   
/**
     * beforeSave callback
     */
   
public function beforeSave()
    {
       
$this->getConnection()->getDriver()->enableAutoQuoting();
    }

   
/**
     * afterSave callback
     */
   
public function afterSave(Event $event, EntityInterface $entity, ArrayObject $options)
    {
       
$this->getConnection()->getDriver()->enableAutoQuoting(false);
        if (
$entity->key == 'Access Control.rowLevel') {
            if (
$entity->value == true && $entity->_original['value'] == false) {
               
$aclGenerator = new AclGenerator();
               
$aclGenerator->syncContentAcos();
            }
        }
    }

   
/**
     * Creates a new record with key/value pair if key does not exist.
     *
     * @param string $key
     * @param string $value
     * @param array $options
     * @return bool
     */
   
public function write($key, $value, $options = [])
    {
       
$setting = $this->findByKey($key)->first();
        if (
$setting) {
           
$setting->value = $value;
           
$setting->type = gettype($value);

           
$setting = $this->patchEntity($setting, $options);
        } else {
           
$user = Configure::read('Trackable.Auth.User');
            if (!
$user && session_status() === PHP_SESSION_ACTIVE) {
               
$userId = Hash::get($_SESSION, 'Auth.User.id');
            } else {
               
$userId = 1;
            }

           
$options = array_merge([
               
'title' => '',
               
'description' => '',
               
'input_type' => '',
               
'editable' => 0,
               
'weight' => 0,
               
'params' => '',
               
'option_class' => '',
            ],
$options);

           
$setting = $this->newEntity([
               
'key' => $key,
               
'value' => $value,
               
'type' => gettype($value),
               
'title' => $options['title'],
               
'description' => $options['description'],
               
'input_type' => $options['input_type'],
               
'editable' => $options['editable'],
               
'weight' => $options['weight'],
               
'params' => $options['params'],
               
'option_class' => $options['option_class'],
               
'created_by' => $userId,
            ]);
        }

        if (
$this->save($setting)) {
           
Configure::write($key, $value);

            return
true;
        } else {
            return
false;
        }
    }

   
/**
     * Deletes setting record for given key
     *
     * @param string $key
     * @return bool
     */
   
public function deleteKey($key)
    {
       
$setting = $this->findByKey($key)->first();
        if (
$setting && $this->delete($setting)) {
            return
true;
        }

        return
false;
    }

   
/**
     * Update Croogo.version in settings
     */
   
public function updateVersionInfo()
    {
       
$gitDir = realpath(PluginManager::path('Croogo/Core') . '..') . DS . '.git';
        if (!
file_exists($gitDir)) {
           
Log::error('Git repository not found');

            return
false;
        }
        if (!
is_dir($gitDir)) {
           
$gitDir = dirname($gitDir);
        }

       
$git = trim(shell_exec('which git'));
        if (empty(
$git)) {
           
Log::error('Git executable not found');

            return
false;
        }

       
chdir($gitDir);
       
$version = trim(shell_exec('git describe --tags'));
        if (
$version) {
            return
$this->write('Croogo.version', $version);
        }
    }

   
/**
     * Update Croogo.appVersion in settings
     */
   
public function updateAppVersionInfo()
    {
       
$gitDir = realpath(ROOT . DS . '.git');
        if (!
file_exists($gitDir)) {
           
Log::error('Git repository not found');

            return
false;
        }
        if (!
is_dir($gitDir)) {
           
$gitDir = dirname($gitDir);
        }

       
$git = trim(shell_exec('which git'));
        if (empty(
$git)) {
           
Log::error('Git executable not found');

            return
false;
        }

       
chdir($gitDir);
       
$version = trim(shell_exec('git describe --tags'));
        if (
$version) {
            return
$this->write('Croogo.appVersion', $version);
        }
    }

}