Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/Gathering/Item/Item.php
Строк: 431
<?php

namespace ConcreteCoreGatheringItem;

use 
Core;
use 
Database;
use 
View;
use 
ConcreteCoreFoundationObject;
use 
ConcreteCoreGatheringDataSourceDataSource as GatheringDataSource;
use 
RuntimeException;

/**
 * Base class for gathering items.
 *
 * @method static Key[] add(Gathering $ag, GatheringDataSource $ags, string $gaiPublicDateTime, string $gaiTitle, string $gaiKey, int $gaiSlotWidth = 1, int $gaiSlotHeight = 1) Deprecated method. Use Item::create instead.
 */
abstract class Item extends Object
{
    abstract public function 
loadDetails();

    abstract public function 
canViewGatheringItem();

    abstract public function 
assignFeatureAssignments($mixed);

    
/**
     * @param mixed $mixed
     *
     * @abstract
     */
    
public static function getListByItem($mixed)
    {
        throw new 
RuntimeException('This method has not yet been implemented.');
    }

    protected 
$feHandles;
    protected 
$templates;

    public function 
getGatheringItemID()
    {
        return 
$this->gaiID;
    }

    public function 
getGatheringDataSourceHandle()
    {
        return 
$this->gasHandle;
    }

    public function 
getGatheringDataSourceID()
    {
        return 
$this->gasID;
    }

    public function 
getGatheringItemPublicDateTime()
    {
        return 
$this->gaiPublicDateTime;
    }

    public function 
getGatheringItemTemplateID(GatheringItemTemplateType $type)
    {
        if (!isset(
$this->templates)) {
            
$this->loadGatheringItemTemplates();
        }

        return 
$this->templates[$type->getGatheringItemTemplateTypeID()];
    }

    public function 
getGatheringItemTemplateObject(GatheringItemTemplateType $type)
    {
        
$gatID $this->getGatheringItemTemplateID($type);
        if (
$gatID) {
            return 
GatheringItemTemplate::getByID($gatID);
        }
    }

    public function 
getGatheringItemTemplateHandle()
    {
        return 
$this->gatHandle;
    }

    public function 
getGatheringItemSlotWidth()
    {
        return 
$this->gaiSlotWidth;
    }

    public function 
getGatheringItemSlotHeight()
    {
        return 
$this->gaiSlotHeight;
    }

    public function 
getGatheringItemBatchTimestamp()
    {
        return 
$this->gaiBatchTimestamp;
    }

    public function 
getGatheringItemBatchDisplayOrder()
    {
        return 
$this->gaiBatchDisplayOrder;
    }

    public function 
getGatheringItemKey()
    {
        return 
$this->gaiKey;
    }

    public function 
getGatheringObject()
    {
        return 
Gathering::getByID($this->gaID);
    }

    public function 
getGatheringID()
    {
        return 
$this->gaID;
    }

    public function 
getGatheringItemFeatureHandles()
    {
        if (!isset(
$this->feHandles)) {
            
$db Database::connection();
            
$this->feHandles $db->GetCol(
                
'select distinct feHandle from GatheringItemFeatureAssignments afa inner join FeatureAssignments fa on afa.faID = fa.faID inner join Features fe on fa.feID = fe.feID where gaiID = ?',
                array(
$this->gaiID)
            );
        }

        return 
$this->feHandles;
    }

    protected function 
loadGatheringItemTemplates()
    {
        
$this->templates = array();
        
$db Database::connection();
        
$r $db->Execute(
            
'select gatID, gatTypeID from GatheringItemSelectedTemplates where gaiID = ?',
            array(
$this->gaiID)
        );
        while (
$row $r->FetchRow()) {
            
$this->templates[$row['gatTypeID']] = $row['gatID'];
        }
    }

    public function 
moveToNewGathering(Gathering $gathering)
    {
        
$db Database::connection();
        
$db->Execute(
            
'update GatheringItems set gaID = ? where gaiID = ?',
            array(
$gathering->getGatheringID(), $this->gaiID)
        );
        
$this->gaID $gathering->getGatheringID();
        
$batch $db->GetOne('select max(gaiBatchTimestamp) from GatheringItems where gaiID = ?', array($this->gaiID));
        
$this->setGatheringItemBatchTimestamp($batch);
        
$this->setGatheringItemBatchDisplayOrder(0);
    }

    public function 
setGatheringItemTemplate(GatheringItemTemplateType $typeGatheringItemTemplate $template)
    {
        
$db Database::connection();
        
$db->Execute(
            
'delete from GatheringItemSelectedTemplates where gaiID = ? and gatTypeID = ?',
            array(
$this->gaiID$type->getGatheringItemTemplateTypeID())
        );
        
$db->Execute(
            
'insert into GatheringItemSelectedTemplates (gatTypeID, gaiID, gatID) values (?, ?, ?)',
            array(
                
$type->getGatheringItemTemplateTypeID(),
                
$this->gaiID,
                
$template->getGatheringItemTemplateID(),
            )
        );
        
$this->loadGatheringItemTemplates();
    }

    public function 
setGatheringItemBatchDisplayOrder($gaiBatchDisplayOrder)
    {
        
$db Database::connection();
        
$db->Execute(
            
'update GatheringItems set gaiBatchDisplayOrder = ? where gaiID = ?',
            array(
$gaiBatchDisplayOrder$this->gaiID)
        );
        
$this->gaiBatchDisplayOrder $gaiBatchDisplayOrder;
    }

    public function 
setGatheringItemBatchTimestamp($gaiBatchTimestamp)
    {
        
$db Database::connection();
        
$db->Execute(
            
'update GatheringItems set gaiBatchTimestamp = ? where gaiID = ?',
            array(
$gaiBatchTimestamp$this->gaiID)
        );
        
$this->gaiBatchTimestamp $gaiBatchTimestamp;
    }

    public function 
setGatheringItemSlotWidth($gaiSlotWidth)
    {
        
$db Database::connection();
        
$db->Execute('update GatheringItems set gaiSlotWidth = ? where gaiID = ?', array($gaiSlotWidth$this->gaiID));
        
$this->gaiSlotWidth $gaiSlotWidth;
    }

    public function 
setGatheringItemSlotHeight($gaiSlotHeight)
    {
        
$db Database::connection();
        
$db->Execute(
            
'update GatheringItems set gaiSlotHeight = ? where gaiID = ?',
            array(
$gaiSlotHeight$this->gaiID)
        );
        
$this->gaiSlotHeight $gaiSlotHeight;
    }

    public static function 
getByID($gaiID)
    {
        
$db Database::connection();
        
$r $db->GetRow(
            
'select GatheringItems.*, GatheringDataSources.gasHandle from GatheringItems inner join GatheringDataSources on GatheringItems.gasID = GatheringDataSources.gasID where gaiID = ?',
            array(
$gaiID)
        );
        if (
is_array($r) && $r['gaiID'] == $gaiID) {
            if (!
$r['gaiIsDeleted']) {
                
$class Core::make('helper/text')->camelcase($r['gasHandle']) . 'GatheringItem';
                
$ags = new $class();
                
$ags->setPropertiesFromArray($r);
                
$ags->loadDetails();

                return 
$ags;
            }
        }
    }

    protected static function 
getListByKey(GatheringDataSource $ags$gaiKey)
    {
        
$db Database::connection();
        
$r $db->Execute(
            
'select gaiID from GatheringItems where gasID = ? and gaiKey = ?',
            array(
                
$ags->getGatheringDataSourceID(),
                
$gaiKey,
            )
        );
        
$items = array();
        while (
$row $r->FetchRow()) {
            
$item GatheringItem::getByID($row['gaiID']);
            if (
is_object($item)) {
                
$items[] = $item;
            }
        }

        return 
$items;
    }

    public static function 
__callStatic($name$arguments)
    {
        if (
strcasecmp($name'add') === 0) {
            return 
call_user_func_array('static::create'$arguments);
        }
        
trigger_error("Call to undefined method ".__CLASS__."::$name()"E_USER_ERROR);
    }

    public static function 
create(
        
Gathering $ag,
        
GatheringDataSource $ags,
        
$gaiPublicDateTime,
        
$gaiTitle,
        
$gaiKey,
        
$gaiSlotWidth 1,
        
$gaiSlotHeight 1
    
) {
        
$db Database::connection();
        
$gaiDateTimeCreated Core::make('helper/date')->getOverridableNow();
        
$r $db->Execute(
            
'insert into GatheringItems (gaID, gasID, gaiDateTimeCreated, gaiPublicDateTime, gaiTitle, gaiKey, gaiSlotWidth, gaiSlotHeight) values (?, ?, ?, ?, ?, ?, ?, ?)',
            array(
                
$ag->getGatheringID(),
                
$ags->getGatheringDataSourceID(),
                
$gaiDateTimeCreated,
                
$gaiPublicDateTime,
                
$gaiTitle,
                
$gaiKey,
                
$gaiSlotWidth,
                
$gaiSlotHeight,
            )
        );

        return 
GatheringItem::getByID($db->Insert_ID());
    }

    public function 
duplicate(Gathering $gathering)
    {
        
$db Database::connection();
        
$gaID $gathering->getGatheringID();
        
$db->Execute(
            
'insert into GatheringItems (gaID, gasID, gaiDateTimeCreated, gaiPublicDateTime, gaiTitle, gaiKey, gaiSlotWidth, gaiSlotHeight, gaiBatchTimestamp, gaiBatchDisplayOrder)
                        values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
,
            array(
                
$gaID,
                
$this->getGatheringDataSourceID(),
                
$this->gaiDateTimeCreated,
                
$this->gaiPublicDateTime,
                
$this->gaiTitle,
                
$this->gaiKey,
                
$this->gaiSlotWidth,
                
$this->gaiSlotHeight,
                
$this->gaiBatchTimestamp,
                
$this->gaiBatchDisplayOrder,
            )
        );

        
$this->loadGatheringItemTemplates();
        
$gaiID $db->Insert_ID();

        foreach (
$this->templates as $gatTypeID => $gatID) {
            
$db->Execute(
                
'insert into GatheringItemSelectedTemplates (gaiID, gatTypeID, gatID) values (?, ?, ?)',
                array(
$gaiID$gatTypeID$gatID)
            );
        }

        
$item GatheringItem::getByID($gaiID);

        
$assignments GatheringItemFeatureAssignment::getList($this);
        foreach (
$assignments as $as) {
            
$item->copyFeatureAssignment($as);
        }

        return 
$item;
    }

    public function 
deleteFeatureAssignments()
    {
        
$assignments GatheringItemFeatureAssignment::getList($this);
        foreach (
$assignments as $as) {
            
$as->delete();
        }
    }

    public function 
addFeatureAssignment($feHandle$mixed)
    {
        
$f Feature::getbyHandle($feHandle);
        
$fd $f->getFeatureDetailObject($mixed);
        
$as GatheringItemFeatureAssignment::add($f$fd$this);

        return 
$as;
    }

    public function 
copyFeatureAssignment(FeatureAssignment $fa)
    {
        return 
GatheringItemFeatureAssignment::add($fa->getFeatureObject(), $fa->getFeatureDetailObject(), $this);
    }

    protected function 
sortByFeatureScore($a$b)
    {
        
$ascore $a->getGatheringTemplateFeaturesTotalScore();
        
$bscore $b->getGatheringTemplateFeaturesTotalScore();
        if (
$ascore $bscore) {
            return -
1;
        } else {
            if (
$ascore $bscore) {
                return 
1;
            } else {
                return 
0;
            }
        }
    }

    protected function 
weightByFeatureScore($a$b)
    {
        
$ascore $a->getGatheringTemplateFeaturesTotalScore();
        
$bscore $b->getGatheringTemplateFeaturesTotalScore();

        return 
mt_rand(0, ($ascore $bscore)) > $ascore : -1;
    }

    public function 
setAutomaticGatheringItemSlotWidth()
    {
        
$amount floor(pow(lcg_value(), 1.4) * 4);
        
$this->setGatheringItemSlotWidth($amount);
    }

    public function 
setAutomaticGatheringItemSlotHeight()
    {
        
$amount floor(pow(lcg_value(), 1.4) * 2);
        
$this->setGatheringItemSlotHeight($amount);
    }

    public function 
setAutomaticGatheringItemTemplate()
    {
        
$arr Core::make('helper/arrays');
        
$db Database::connection();
        
$myFeatureHandles $this->getGatheringItemFeatureHandles();

        
// we loop through and do it for all installed gathering item template types
        
$types GatheringItemTemplateType::getList();
        foreach (
$types as $type) {
            
$matched = array();
            
$r $db->Execute(
                
'select gatID from GatheringItemTemplates where gatTypeID = ?',
                array(
$type->getGatheringItemTemplateTypeID())
            );
            while (
$row $r->FetchRow()) {
                
$templateFeatureHandles $db->GetCol(
                    
'select feHandle from Features f inner join GatheringItemTemplateFeatures af on f.feID = af.feID where gatID = ?',
                    array(
$row['gatID'])
                );
                if (
$arr->subset($templateFeatureHandles$myFeatureHandles)) {
                    
$matched[] = GatheringItemTemplate::getByID($row['gatID']);
                }
            }

            
usort($matched, array($this'sortByFeatureScore'));
            if (
is_object($matched[0]) && $matched[0]->gatheringItemTemplateIsAlwaysDefault()) {
                
$template $matched[0];
            } else {
                
// we do some fun randomization math.
                
usort($matched, array($this'weightByFeatureScore'));
                
$template $matched[0];
            }
            if (
is_object($template)) {
                
$this->setGatheringItemTemplate($type$template);
                if (
$template->gatheringItemTemplateControlsSlotDimensions()) {
                    
$this->setGatheringItemSlotWidth($template->getGatheringItemTemplateSlotWidth($this));
                    
$this->setGatheringItemSlotHeight($template->getGatheringItemTemplateSlotHeight($this));
                }
            }
        }
    }

    public function 
itemSupportsGatheringItemTemplate(GatheringItemTemplate $template)
    {
        
// checks to see if all the features necessary to implement the template are present in this item.
        
$templateFeatures $template->getGatheringItemTemplateFeatureHandles();
        
$itemFeatures $this->getGatheringItemFeatureHandles();
        
$features array_intersect($templateFeatures$itemFeatures);

        return 
count($features) == count($templateFeatures);
    }

    public function 
delete()
    {
        
$db Database::connection();
        
$db->Execute('delete from GatheringItems where gaiID = ?', array($this->gaiID));
        
$db->Execute('delete from GatheringItemSelectedTemplates where gaiID = ?', array($this->gaiID));
        
$this->deleteFeatureAssignments();
    }

    public function 
deactivate()
    {
        
$db Database::connection();
        
$db->Execute('update GatheringItems set gaiIsDeleted = 1 where gaiID = ?', array($this->gaiID));
    }

    public function 
render(GatheringItemTemplateType $type)
    {
        
$t $this->getGatheringItemTemplateObject($type);
        if (
is_object($t)) {
            
$data $t->getGatheringItemTemplateData($this);
            
$env Environment::get();
            
extract($data);
            
View::element(
                
DIRNAME_GATHERING '/' DIRNAME_GATHERING_ITEM_TEMPLATES '/' $type->getGatheringItemTemplateTypeHandle(
                ) . 
'/' $t->getGatheringItemTemplateHandle() . '/view',
                
$data
            
);
        }
    }
}
Онлайн: 2
Реклама