Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/croogo/croogo/Core/src/Model/Behavior/PublishableBehavior.php
<?php

namespace Croogo\Core\Model\Behavior;

use
Cake\Event\Event;
use
Cake\ORM\Behavior;
use
Cake\ORM\Query;
use
Cake\Utility\Hash;
use
Croogo\Core\Status;
use
DateTime;

/**
 * Publishable Behavior
 *
 * Provides status and period filtering. Requires the following fields:
 *   - `status` integer value from `Status::statuses()
 *   - `publish_start` datetime indicates the start of publishing period
 *   - `publish_end` datetime indicates the end of publishing period
 *
 * @category Croogo.Model.Behavior
 * @package  Croogo.Croogo.Model.Behavior
 * @author   Rachman Chavik <rchavik@gmail.com>
 * @license  http://www.opensource.org/licenses/mit-license.php The MIT License
 * @link     http://www.croogo.org
 * @see      CroogoStatus
 */
class PublishableBehavior extends Behavior
{

    protected
$_defaultConfig = [
       
'admin' => false,
       
'fields' => [
           
'publish_start' => 'publish_start',
           
'publish_end' => 'publish_end',
        ],
    ];

   
/**
     * Setup
     *
     * Valid options:
     *
     *   `admin`: Enable/disable date filtering for users with Admin roles
     *   `fields`: Specifies the physical field name to use
     *
     * @return void
     */
   
public function initialize(array $config)
    {
       
$this->_CroogoStatus = new Status();
    }

   
/**
     * Get status for conditions in query based on current user's role id
     *
     * @return array Array of status
     */
   
public function status($roleId = null, $statusType = 'publishing', $accessType = 'public')
    {
        return
$this->_CroogoStatus->status($roleId, $statusType, $accessType);
    }

   
/**
     * Filter records based on period
     *
     * @return array Options passed to Model::find()
     */
   
public function beforeFind(Event $event, Query $query, $options)
    {
       
$table = $this->_table;
       
$config = $this->getConfig();
        if (!empty(
$config['enabled'])) {
            return
$query;
        }

        if (
$config['admin'] === false && isset($_SESSION)) {
           
// FIXME Avoid superglobals
           
$roleId = Hash::get($_SESSION, 'Auth.User.role_id');
            if (
$roleId == 1) {
                return
$query;
            }
        }

        if (!
$table->hasField($config['fields']['publish_start']) ||
            !
$table->hasField($config['fields']['publish_end'])
        ) {
            return
$query;
        }

       
$date = isset($options['date']) ? $options['date'] : new DateTime();
       
$start = $table->aliasField($config['fields']['publish_start']);
       
$end = $table->aliasField($config['fields']['publish_end']);

       
$query = $query->where([
           
'OR' => [
               
$start . ' IS' => null,
                [
                   
$start . ' IS NOT' => null,
                   
$start . ' <=' => $date,
                ],
            ],
        ]);

       
$query = $query->andWhere([
           
'OR' => [
               
$end . ' IS' => null,
                [
                   
$end . ' IS NOT' => null,
                   
$end . ' >=' => $date,
                ],
            ],
        ]);

        return
$query;
    }

   
/**
     * Populate publish_start
     */
   
public function beforeMarshal(Event $event, $options = [])
    {
       
$data = $event->getData('data');
        if (
array_key_exists('publish_start', $data)) {
            if (empty(
$data['publish_start'])) {
               
$data['publish_start'] = new \DateTime();
            }
        }
        return
true;
    }

}