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

namespace Croogo\Blocks\Model\Table;

use
Cake\Cache\Cache;
use
Cake\Database\Schema\TableSchema;
use
Cake\ORM\Query;
use
Cake\ORM\RulesChecker;
use
Cake\Validation\Validator;
use
Croogo\Core\Model\Table\CroogoTable;
use
Croogo\Core\Status;

/**
 * Block
 *
 * @category Blocks.Model
 * @package  Croogo.Blocks.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
 */
class BlocksTable extends CroogoTable
{

   
/**
     * Find methods
     */
   
public $findMethods = [
       
'published' => true,
    ];

    public function
validationDefault(Validator $validator)
    {
       
$validator
           
->notBlank('title', __d('croogo', 'Title cannot be empty.'))
            ->
notBlank('alias', __d('croogo', 'Alias cannot be empty.'));

        return
$validator;
    }

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

        return
$rules;
    }

    public function
initialize(array $config)
    {
       
$this->setEntityClass('Croogo/Blocks.Block');

       
$this->belongsTo('Regions', [
           
'className' => 'Croogo/Blocks.Regions',
           
'foreignKey' => 'region_id',
           
'counterCache' => true,
           
'counterScope' => ['Blocks.status >=' => Status::PUBLISHED],
        ]);

       
$this->addBehavior('CounterCache', [
           
'Regions' => ['block_count'],
        ]);
       
$this->addBehavior('Croogo/Core.Publishable');
       
$this->addBehavior('Croogo/Core.Visibility');
       
$this->addBehavior('ADmad/Sequence.Sequence', [
           
'order' => 'weight',
           
'scope' => ['region_id'],
        ]);
       
$this->addBehavior('Croogo/Core.Cached', [
           
'groups' => [
               
'blocks',
            ],
        ]);

       
$this->addBehavior('Timestamp');
       
$this->addBehavior('Croogo/Core.Trackable');
       
$this->addBehavior('Search.Search');

       
$this->searchManager()
            ->
value('region_id')
            ->
add('regionAlias', 'Search.Finder', [
               
'finder' => 'filterByRegionAlias',
            ])
            ->
add('title', 'Search.Like', [
               
'before' => true,
               
'after' => true,
               
'field' => $this->aliasField('title')
            ]);
    }

    protected function
_initializeSchema(TableSchema $table)
    {
       
$table->setColumnType('visibility_roles', 'encoded');
       
$table->setColumnType('visibility_paths', 'encoded');
       
$table->setColumnType('params', 'params');

        return
parent::_initializeSchema($table);
    }

    public function
afterSave()
    {
       
Cache::clear(false, 'croogo_blocks');
    }

    public function
findPublished(Query $query, array $options = [])
    {
       
$options += ['roleId' => null];

        return
$query->andWhere([
           
$this->aliasField('status') . ' IN' => $this->status($options['roleId']),
        ]);
    }

   
/**
     * Find Published blocks
     *
     * Query options:
     * - status Status
     * - regionId Region Id
     * - roleId Role Id
     * - cacheKey Cache key (optional)
     */
   
public function findRegionPublished(Query $query, array $options = [])
    {
       
$options += [
           
'regionId' => null,
        ];

        return
$query
           
->find('published', $options)
            ->
find('byAccess', $options)
            ->
where([
               
'region_id IN' => $options['regionId']
            ]);
    }

    public function
findFilterByRegionAlias(Query $query, array $options = [])
    {
        return
$query
           
->find('published', $options)
            ->
find('byAccess', $options)
            ->
innerJoinWith('Regions')
            ->
where([
               
$this->Regions->aliasField('alias') => $options['regionAlias'],
            ]);
    }

}