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

namespace ConcreteCoreAttributeKey;

use 
ConcreteCoreFoundationObject;
use 
ConcreteCoreAttributeType as AttributeType;
use 
ConcreteCoreAttributeKeyCategory as AttributeKeyCategory;
use 
ConcreteCoreDatabaseSchemaSchema;
use 
GettextTranslations;
use 
Package;
use 
Core;
use 
User;
use 
Database;
use 
AttributeSet;
use 
ConcreteCoreAttributeValueValue as AttributeValue;
use 
ConcreteCorePackagePackageList;
use 
ConcreteCoreAttributeValueCollectionValue;
use 
WhoopsExceptionErrorException;

/**
 * Base class for attribute keys.
 * 
 * @method static Key[] getList(string $akCategoryHandle, $filters = array()) Deprecated method. Use Key::getAttributeKeyList instead.
 * @method static Key|null add(string $akCategoryHandle, AttributeType|string$type, array $args, ConcreteCorePackagePackage|false $pkg = false) Deprecated method. Use Key::addAttributeKey instead.
 */
class Key extends Object
{
    protected 
$akID;

    public function 
getIndexedSearchTable()
    {
        return static::
getDefaultIndexedSearchTable();
    }

    public static function 
getDefaultIndexedSearchTable()
    {
        return 
false;
    }

    public function 
getSearchIndexFieldDefinition()
    {
        return 
$this->searchIndexFieldDefinition;
    }

    
/**
     * Returns the name for this attribute key.
     */
    
public function getAttributeKeyName()
    {
        return 
$this->akName;
    }

    
/** Returns the display name for this attribute (localized and escaped accordingly to $format)
     * @param string $format = 'html'
     *    Escape the result in html format (if $format is 'html').
     *    If $format is 'text' or any other value, the display name won't be escaped.
     *
     * @return string
     */
    
public function getAttributeKeyDisplayName($format 'html')
    {
        
$value tc('AttributeKeyName'$this->getAttributeKeyName());
        switch (
$format) {
            case 
'html':
                return 
h($value);
            case 
'text':
            default:
                return 
$value;
        }
    }

    
/**
     * Returns the handle for this attribute key.
     */
    
public function getAttributeKeyHandle()
    {
        return 
$this->akHandle;
    }

    
/**
     * Deprecated. Going to be replaced by front end display name.
     */
    
public function getAttributeKeyDisplayHandle()
    {
        return 
Core::make('helper/text')->unhandle($this->akHandle);
    }

    
/**
     * Returns the ID for this attribute key.
     */
    
public function getAttributeKeyID()
    {
        return 
$this->akID;
    }

    public function 
getAttributeKeyCategoryID()
    {
        return 
$this->akCategoryID;
    }

    
/**
     * Returns whether the attribute key is searchable.
     */
    
public function isAttributeKeySearchable()
    {
        return 
$this->akIsSearchable;
    }

    
/**
     * Returns whether the attribute key is internal.
     */
    
public function isAttributeKeyInternal()
    {
        return 
$this->akIsInternal;
    }

    
/**
     * Returns whether the attribute key is indexed as a "keyword search" field.
     */
    
public function isAttributeKeyContentIndexed()
    {
        return 
$this->akIsSearchableIndexed;
    }

    
/**
     * Returns whether the attribute key is one that was automatically created by a process.
     */
    
public function isAttributeKeyAutoCreated()
    {
        return 
$this->akIsAutoCreated;
    }

    
/**
     * Returns whether the attribute key is included in the standard search for this category.
     */
    
public function isAttributeKeyColumnHeader()
    {
        return 
$this->akIsColumnHeader;
    }

    
/**
     * Returns whether the attribute key is one that can be edited through the frontend.
     */
    
public function isAttributeKeyEditable()
    {
        return 
$this->akIsEditable;
    }

    public function 
getComputedAttributeKeyCategoryHandle()
    {
        
$class explode('\', get_class($this));
        $start = Core::make('
helper/text')->uncamelcase($class[count($class) - 1]);

        return substr($start, 0, strpos($start, '
_key'));
    }

    /**
     * Loads the required attribute fields for this instantiated attribute.
     */
    protected function load($akIdentifier, $loadBy = '
akID')
    {
        if (empty($akIdentifier)) {
            $row = array();
        } else {
            $db = Database::connection();
            $akCategoryHandle = $this->getComputedAttributeKeyCategoryHandle();
            if ($akCategoryHandle != '') {
                $row = $db->GetRow(
                    '
select akIDakHandleakNameAttributeKeys.akCategoryIDakIsInternalakIsEditableakIsSearchableakIsSearchableIndexedakIsAutoCreatedakIsColumnHeaderAttributeKeys.atIDatHandleAttributeKeys.pkgID from AttributeKeys inner join AttributeKeyCategories on AttributeKeys.akCategoryID AttributeKeyCategories.akCategoryID inner join AttributeTypes on AttributeKeys.atID AttributeTypes.atID where ' . $loadBy . ' = ? and akCategoryHandle = ?',
                    array($akIdentifier, $akCategoryHandle)
                );
            } else {
                $row = $db->GetRow(
                    '
select akIDakHandleakNameakCategoryIDakIsEditableakIsInternalakIsSearchableakIsSearchableIndexedakIsAutoCreatedakIsColumnHeaderAttributeKeys.atIDatHandleAttributeKeys.pkgID from AttributeKeys inner join AttributeTypes on AttributeKeys.atID AttributeTypes.atID where ' . $loadBy . ' = ?',
                    array($akIdentifier)
                );
            }
        }
        $this->setPropertiesFromArray($row);
    }

    public function getPackageID()
    {
        return $this->pkgID;
    }

    public function getPackageHandle()
    {
        return PackageList::getHandle($this->pkgID);
    }

    public static function getInstanceByID($akID)
    {
        $db = Database::connection();
        $akCategoryID = $db->fetchColumn('
select akCategoryID from AttributeKeys where akID = ?', (array) $akID);
        if ($akCategoryID > 0) {
            $akc = AttributeKeyCategory::getByID($akCategoryID);

            return $akc->getAttributeKeyByID($akID);
        }
    }

    /**
     * Returns an attribute type object.
     */
    public function getAttributeType()
    {
        return AttributeType::getByID($this->atID);
    }

    /**
     * Returns the attribute type handle.
     */
    public function getAttributeTypeHandle()
    {
        return $this->atHandle;
    }

    //deprecated
    public function getAttributeKeyType()
    {
        return $this->getAttributeType();
    }

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

    /**
     * Returns a list of all attributes of this category.
     */
    public static function getAttributeKeyList($akCategoryHandle, $filters = array())
    {
        $db = Database::connection();
        $pkgHandle = $db->fetchColumn(
            '
select pkgHandle from AttributeKeyCategories inner join Packages on Packages.pkgID AttributeKeyCategories.pkgID where akCategoryHandle = ?',
            array($akCategoryHandle)
        );
        $q = '
SELECT k.akIDs.asIDs.asDisplayOrdersk.displayOrder'
            . ' 
FROM (AttributeKeys k INNER JOIN AttributeKeyCategories kc ON k.akCategoryID kc.akCategoryID)'
            . ' 
LEFT JOIN (AttributeSetKeys sk INNER JOIN AttributeSets s ON sk.asID s.asIDON k.akID sk.akID'
            . ' 
WHERE kc.akCategoryHandle = ?';
        foreach ($filters as $key => $value) {
            $q .= ' 
and ' . $key . ' ' . $value . ' ';
        }
        $q .= ' 
ORDER BY (s.asID IS NULL), s.asDisplayordersk.displayOrder';
        $r = $db->executeQuery($q, array($akCategoryHandle));
        $list = array();
        $txt = Core::make('
helper/text');

        $prefix = $pkgHandle;
        $className = core_class('
Core\Attribute\Key\' . $txt->camelcase($akCategoryHandle) . 'Key', $prefix);
        while ($row = $r->FetchRow()) {
            $c1a = call_user_func(array($className, '
getByID'), $row['akID']);
            if (is_object($c1a)) {
                $list[] = $c1a;
            }
        }
        $r->Close();

        return $list;
    }

    public function export($axml, $exporttype = '
full')
    {
        $type = $this->getAttributeType()->getAttributeTypeHandle();
        $category = AttributeKeyCategory::getByID($this->akCategoryID)->getAttributeKeyCategoryHandle();
        $akey = $axml->addChild('
attributekey');
        $akey->addAttribute('
handle', $this->getAttributeKeyHandle());

        if ($exporttype == '
full') {
            $akey->addAttribute('
name', $this->getAttributeKeyName());
            $akey->addAttribute('
package', $this->getPackageHandle());
            $akey->addAttribute('
searchable', $this->isAttributeKeySearchable());
            $akey->addAttribute('
indexed', $this->isAttributeKeySearchable());
            $akey->addAttribute('
type', $type);
            $akey->addAttribute('
category', $category);
            $this->getController()->exportKey($akey);
        }

        return $akey;
    }

    public static function exportList($xml)
    {
        $categories = AttributeKeyCategory::getList();
        $axml = $xml->addChild('
attributekeys');
        foreach ($categories as $cat) {
            $attributes = static::getAttributeKeyList($cat->getAttributeKeyCategoryHandle());
            foreach ($attributes as $at) {
                $at->export($axml);
            }
        }
    }

    /**
     * Note, this queries both the pkgID found on the AttributeKeys table AND any attribute keys of a special type
     * installed by that package, and any in categories by that package.
     * That'
s because a special type, if the package is uninstalledis going to be unusable
     
by attribute keys that still remain.
     */
    public static function 
getListByPackage($pkg)
    {
        
$db Database::connection();
        
$list = array();
        
$tina[] = '-1';
        
$tinb $db->GetCol('select atID from AttributeTypes where pkgID = ?', array($pkg->getPackageID()));
        if (
is_array($tinb)) {
            
$tina array_merge($tina$tinb);
        }
        
$tinstr implode(','$tina);

        
$kina[] = '-1';
        
$kinb $db->GetCol(
            
'select akCategoryID from AttributeKeyCategories where pkgID = ?',
            array(
$pkg->getPackageID())
        );
        if (
is_array($kinb)) {
            
$kina array_merge($kina$kinb);
        }
        
$kinstr implode(','$kina);

        
$r $db->executeQuery(
            
'select akID, akCategoryID from AttributeKeys where (pkgID = ? or atID in (' $tinstr ') or akCategoryID in (' $kinstr ')) order by akID asc',
            array(
$pkg->getPackageID())
        );
        while (
$row $r->FetchRow()) {
            
$akc AttributeKeyCategory::getByID($row['akCategoryID']);
            
$ak $akc->getAttributeKeyByID($row['akID']);
            
$list[] = $ak;
        }
        
$r->Close();

        return 
$list;
    }

    public static function 
import(SimpleXMLElement $ak)
    {
        
$type AttributeType::getByHandle($ak['type']);
        
$akCategoryHandle $ak['category'];
        
$pkg false;
        if (
$ak['package']) {
            
$pkg Package::getByHandle($ak['package']);
        }
        
$akIsInternal 0;
        if (
$ak['internal']) {
            
$akIsInternal 1;
        }
        
$db Database::connection();

        
$akc AttributeKeyCategory::getByHandle($akCategoryHandle);
        
$akID $db->fetchColumn('select akID from AttributeKeys where akHandle = ? and akCategoryID = ?',
            array(
$ak['handle'], $akc->getAttributeKeyCategoryID()));

        if (!
$akID) {
            
$akn self::addAttributeKey(
                
$akCategoryHandle,
                
$type,
                array(
                    
'akHandle' => $ak['handle'],
                    
'akName' => $ak['name'],
                    
'akIsInternal' => $akIsInternal,
                    
'akIsSearchableIndexed' => $ak['indexed'],
                    
'akIsAutoCreated' => 1,
                    
'akIsSearchable' => $ak['searchable'],
                ),
                
$pkg
            
);
            
$akn->getController()->importKey($ak);
        }
    }

    
/**
     * Adds an attribute key.
     */
    
protected static function addAttributeKey($akCategoryHandle$type$args$pkg false)
    {
        
$vn Core::make('helper/validation/numbers');
        
$txt Core::make('helper/text');
        if (!
is_object($type)) {
            
// The passed item is not an object. It is probably something like 'DATE'
            
$type AttributeType::getByHandle(strtolower($type));
        }
        
$atID $type->getAttributeTypeID();

        
$pkgID 0;
        if (
is_object($pkg)) {
            
$pkgID $pkg->getPackageID();
        }

        
extract($args);

        
$_akIsSearchable 0;
        
$_akIsSearchableIndexed 0;
        
$_akIsAutoCreated 0;
        
$_akIsEditable 1;
        
$_akIsInternal 0;

        if (!isset(
$akHandle)) {
            throw new 
ErrorException('No attribute key handle set.');
        }
        if (!isset(
$akName)) {
            throw new 
ErrorException('No Attribute Key name set.');
        }

        if (isset(
$akIsSearchable) && $akIsSearchable != 0) {
            
$_akIsSearchable 1;
        }
        if (isset(
$akIsInternal) && $akIsInternal != 0) {
            
$_akIsInternal 1;
        }
        if (isset(
$akIsSearchableIndexed) && $akIsSearchableIndexed != 0) {
            
$_akIsSearchableIndexed 1;
        }
        if (isset(
$akIsAutoCreated) && $akIsAutoCreated != 0) {
            
$_akIsAutoCreated 1;
        }
        if (isset(
$akIsEditable) && $akIsEditable == 0) {
            
$_akIsEditable 0;
        }

        
$db Database::connection();
        
$akCategoryID $db->fetchColumn(
            
"select akCategoryID from AttributeKeyCategories where akCategoryHandle = ?",
            array(
$akCategoryHandle)
        );
        
$a = array(
            
$akHandle,
            
$akName,
            
$_akIsSearchable,
            
$_akIsSearchableIndexed,
            
$_akIsInternal,
            
$_akIsAutoCreated,
            
$_akIsEditable,
            
$atID,
            
$akCategoryID,
            
$pkgID,
        );
        
$r $db->executeQuery(
            
"insert into AttributeKeys (akHandle, akName, akIsSearchable, akIsSearchableIndexed, akIsInternal, akIsAutoCreated, akIsEditable, atID, akCategoryID, pkgID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
            
$a
        
);

        if (
$r) {
            
//getting the insert id must happen right after insertion or
            //certain adodb drivers (like mysqli) will fail and return 0
            
$akID $db->lastInsertId();
            
$category AttributeKeyCategory::getByID($akCategoryID);
            
$pkgID $category->getPackageID();
            
$prefix = ($pkgID 0) ? $category->getPackageHandle() : false;
            
$className core_class('Core\Attribute\Key\' . $txt->camelcase($akCategoryHandle) . 'Key', $prefix);
            $ak = Core::make($className);
            $ak->load($akID);
            switch ($category->allowAttributeSets()) {
                case AttributeKeyCategory::ASET_ALLOW_SINGLE:
                    if (isset($asID) && $asID > 0) {
                        $ak->setAttributeSet(AttributeSet::getByID($asID));
                    }
                    break;
            }

            $at = $ak->getAttributeType();
            $cnt = $at->getController();
            $cnt->setAttributeKey($ak);
            $cnt->saveKey($args);
            $ak->updateSearchIndex();

            $at->__destruct();
            unset($at);
            unset($cnt);

            return $ak;
        }
    }

    public function refreshCache()
    {
    }

    /**
     * Updates an attribute key.
     */
    public function update($args)
    {
        $prevHandle = $this->getAttributeKeyHandle();

        extract($args);

        if (!isset($akHandle)) {
            throw new ErrorException('
No attribute key handle set.');
        }
        if (!isset($akName)) {
            throw new ErrorException('
No Attribute Key name set.');
        }
        $akIsSearchable = intval($akIsSearchable);
        $akIsSearchableIndexed = intval($akIsSearchableIndexed);
        $db = Database::connection();

        $akCategoryHandle = $db->fetchColumn(
            "select akCategoryHandle from AttributeKeyCategories inner join AttributeKeys on AttributeKeys.akCategoryID = AttributeKeyCategories.akCategoryID where akID = ?",
            (array) $this->getAttributeKeyID()
        );
        $a = array($akHandle, $akName, $akIsSearchable, $akIsSearchableIndexed, $this->getAttributeKeyID());

        $r = $db->executeQuery(
            "update AttributeKeys set akHandle = ?, akName = ?, akIsSearchable = ?, akIsSearchableIndexed = ? where akID = ?",
            $a
        );

        $category = AttributeKeyCategory::getByID($this->akCategoryID);
        switch ($category->allowAttributeSets()) {
            case AttributeKeyCategory::ASET_ALLOW_SINGLE:
                if (isset($asID) && $asID > 0) {
                    $as = AttributeSet::getByID($asID);
                    if ((!$this->inAttributeSet($as)) && is_object($as)) {
                        $this->clearAttributeSets();
                        $this->setAttributeSet($as);
                    }
                } else {
                    // clear set
                    $this->clearAttributeSets();
                }
                break;
        }

        if ($r) {
            $txt = Core::make('
helper/text');
            $pkgID = $category->getPackageID();
            $prefix = ($pkgID > 0) ? $category->getPackageHandle() : false;
            $className = core_class('
Core\Attribute\Key\' . $txt->camelcase($akCategoryHandle) . 'Key', $prefix);
            $ak = Core::make($className);
            $ak->load($this->getAttributeKeyID());
            $at = $ak->getAttributeType();
            $cnt = $at->getController();
            $cnt->setAttributeKey($ak);
            $cnt->saveKey($args);
            $ak->updateSearchIndex($prevHandle);

            return $ak;
        }
    }

    /**
     * Duplicates an attribute key.
     */
    public function duplicate($args = array())
    {
        $db = Database::connection();
        $r1 = $db->GetRow('
select from AttributeKeys where akID = ?', array($this->akID));
        unset($r1['
akID']);
        $r2 = $db->insert('
AttributeKeys', $r1);
        $newAKID = $db->lastInsertId();

        $ak = new AttributeKey();
        $ak->load($newAKID);

        // now we duplicate the specific category fields
        $this->getController()->duplicateKey($ak);

        return $ak;
    }

    public function inAttributeSet($as)
    {
        if (is_object($as)) {
            return $as->contains($this);
        }
    }

    public function setAttributeKeyColumnHeader($r)
    {
        $db = Database::connection();
        $r = ($r == true) ? 1 : 0;
        $db->executeQuery(
            '
update AttributeKeys set akIsColumnHeader = ? where akID = ?',
            array($r, $this->getAttributeKeyID())
        );
    }

    /**
     * @param string $table
     * @param array $columnHeaders
     * @param ConcreteCoreAttributeValueValueList $attribs
     * @param mixed $rs this is a legacy parameter, not actually used anymore
     */
    public function reindex($table, $columnHeaders, $attribs, $rs = null)
    {
        /** @var ConcreteCoreDatabaseConnection $db */
        $db = Database::connection();
        $sm = $db->getSchemaManager();

        /** @var DoctrineDBALSchemaColumn[] $columns */
        $columns = $sm->listTableColumns($table);

        $attribs->rewind();
        while ($attribs->valid()) {
            $column = '
ak_' . $attribs->key();
            if (is_array($attribs->current())) {
                foreach ($attribs->current() as $key => $value) {
                    $col = $column . '
_' . $key;
                    if (isset($columns[strtolower($col)])) {
                        $columnHeaders[$col] = $value;
                    }
                }
            } else {
                if (isset($columns[strtolower($column)])) {
                    $columnHeaders[$column] = $attribs->current();
                }
            }

            $attribs->next();
        }

        $db->insert($table, $columnHeaders);
    }

    public function updateSearchIndex($prevHandle = false)
    {
        $type = $this->getAttributeType();
        $cnt = $type->getController();

        if ($this->akHandle == $prevHandle) {
            return false;
        }

        if ($this->getIndexedSearchTable() == false) {
            return false;
        }
        if ($cnt->getSearchIndexFieldDefinition() == false) {
            return false;
        }

        $fields = array();
        $dropColumns = array();
        $definition = $cnt->getSearchIndexFieldDefinition();

        /** @var ConcreteCoreDatabaseConnection $db */
        $db = Database::connection();
        $platform = $db->getDatabasePlatform();
        $sm = $db->getSchemaManager();
        $toTable = $sm->listTableDetails($this->getIndexedSearchTable());

        if ($prevHandle) {
            if (isset($definition['
type'])) {
                $dropColumns[] = '
ak_' . $prevHandle;
            } else {
                foreach ($definition as $name => $column) {
                    $dropColumns[] = '
ak_' . $prevHandle . '_' . $name;
                }
            }
        }

        if (isset($definition['
type'])) {
            if (!$toTable->hasColumn('
ak_' . $this->akHandle)) {
                $fields[] = array(
                    '
name' => 'ak_' . $this->akHandle,
                    '
type' => $definition['type'],
                    '
options' => $definition['options'],
                );
            }
        } else {
            foreach ($definition as $name => $column) {
                if (!$toTable->hasColumn('
ak_' . $this->akHandle . '_' . $name)) {
                    $fields[] = array(
                        '
name' => 'ak_' . $this->akHandle . '_' . $name,
                        '
type' => $column['type'],
                        '
options' => $column['options'],
                    );
                }
            }
        }

        $fromTable = $sm->listTableDetails($this->getIndexedSearchTable());
        $parser = new ConcreteCoreDatabaseSchemaParserArrayParser();
        $comparator = new DoctrineDBALSchemaComparator();

        if ($prevHandle != false) {
            foreach ($dropColumns as $column) {
                $toTable->dropColumn($column);
            }
        }

        $toTable = $parser->addColumns($toTable, $fields);
        $diff = $comparator->diffTable($fromTable, $toTable);
        if ($diff !== false) {
            $sql = $platform->getAlterTableSQL($diff);
            $arr = array();
            foreach ($sql as $q) {
                $arr[] = $q;
                $db->exec($q);
            }
        }
    }

    public function delete()
    {
        $at = $this->getAttributeType();
        $at->controller->setAttributeKey($this);
        $at->controller->deleteKey();
        $cnt = $this->getController();

        $db = Database::connection();
        $db->executeQuery('
delete from AttributeKeys where akID = ?', array($this->getAttributeKeyID()));
        $db->executeQuery('
delete from AttributeSetKeys where akID = ?', array($this->getAttributeKeyID()));

        if ($this->getIndexedSearchTable()) {
            $definition = $cnt->getSearchIndexFieldDefinition();
            $prefix = $this->akHandle;
            $sm = $db->getSchemaManager();
            $platform = $db->getDatabasePlatform();
            $fromTable = $sm->listTableDetails($this->getIndexedSearchTable());
            $toTable = $sm->listTableDetails($this->getIndexedSearchTable());
            $dropColumns = array();
            if (isset($definition['
type'])) {
                $dropColumns[] = '
ak_' . $prefix;
            } else {
                if (is_array($definition)) {
                    foreach ($definition as $name => $column) {
                        $dropColumns[] = '
ak_' . $prefix . '_' . $name;
                    }
                }
            }
            $comparator = new DoctrineDBALSchemaComparator();

            foreach ($dropColumns as $dc) {
                $toTable->dropColumn($dc);
            }

            $diff = $comparator->diffTable($fromTable, $toTable);
            if ($diff) {
                $sql = $platform->getAlterTableSQL($diff);
                foreach ($sql as $q) {
                    $db->exec($q);
                }
            }
        }
    }

    public function getAttributeValueIDList()
    {
        $db = Database::connection();
        $ids = array();
        $r = $db->executeQuery('
select avID from AttributeValues where akID = ?', array($this->getAttributeKeyID()));
        while ($row = $r->FetchRow()) {
            $ids[] = $row['
avID'];
        }
        $r->Close();

        return $ids;
    }

    /**
     * Adds a generic attribute record (with this type) to the AttributeValues table.
     */
    public function addAttributeValue()
    {
        $db = Database::connection();
        $u = new User();
        $dh = Core::make('
helper/date');
        $uID = $u->isRegistered() ? $u->getUserID() : 0;
        $avDate = $dh->getOverridableNow();
        $v = array($this->atID, $this->akID, $uID, $avDate);
        $db->executeQuery('
insert into AttributeValues (atIDakID,  uIDavDateAddedvalues (?, ?, ?, ?)', $v);
        $avID = $db->lastInsertId();

        return AttributeValue::getByID($avID);
    }

    public function getAttributeKeyIconSRC()
    {
        $type = $this->getAttributeType();

        return $type->getAttributeTypeIconSRC();
    }

    public function getController()
    {
        $at = AttributeType::getByHandle($this->atHandle);
        $cnt = $at->getController();
        $cnt->setAttributeKey($this);

        return $cnt;
    }

    /**
     * Renders a view for this attribute key. If no view is default we display it'
"view"
     
Valid views are "view""form" or a custom view (if the attribute has one in its directory)
     * 
Additionallyan attribute does not have to have its own interface. If it doesn't, then whatever
     * is printed in the corresponding $view function in the attribute'
s controller is printed out.
     */
    public function 
render($view 'view'$value false$return false)
    {
        
$at AttributeType::getByHandle($this->atHandle);
        
$resp $at->render($view$this$value$return);
        if (
$return) {
            return 
$resp;
        } else {
            print 
$resp;
        }
    }

    
/**
     * Calls the functions necessary to save this attribute to the database. If no passed value is passed, then we save it via the stock form.
     * NOTE: this code is screwy because all code ever written that EXTENDS this code creates an attribute value object and passes it in, like
     * this code implies. But if you call this code directly it passes the object that you're messing with (Page, User, etc...) in as the $attributeValue
     * object, which is obviously not right. So we're going to do a little procedural if/then checks in this to ensure we're passing the right
     * stuff.
     *
     * @param CollectionValue|mixed $mixed
     * @param mixed $passedValue
     */
    
protected function saveAttribute($mixed$passedValue false)
    {
        
/** @var ConcreteCoreAttributeType $at */
        
$at $this->getAttributeType();

        
$at->getController()->setAttributeKey($this);

        if (
$mixed instanceof AttributeValue) {
            
$attributeValue $mixed;
        } else {
            
// $mixed is ACTUALLY the object that we're setting the attribute against
            //todo: figure out what $nvc should really be since it doesn't exist in this scope
            
$attributeValue $nvc->getAttributeValueObject($mixedtrue);
        }
        
$at->getController()->setAttributeValue($attributeValue);
        if (
$passedValue) {
            
$at->getController()->saveValue($passedValue);
        } else {
            
$at->getController()->saveForm($at->getController()->post());
        }
        
$at->__destruct();
        unset(
$at);
    }

    public function 
__destruct()
    {
    }

    
/**
     * Validates the request object to see if the current request fulfills the "requirement" portion of an attribute.
     *
     * @return bool|ConcreteCoreErrorError
     */
    
public function validateAttributeForm()
    {
        
$at $this->getAttributeType();
        
$at->controller->setAttributeKey($this);
        
$e true;
        if (
method_exists($at->controller'validateForm')) {
            
$e $at->controller->validateForm($at->controller->post());
        }

        return 
$e;
    }

    public function 
createIndexedSearchTable()
    {
        if (
$this->getIndexedSearchTable() != false) {
            
$db Database::get();
            
$platform $db->getDatabasePlatform();
            
$array[$this->getIndexedSearchTable()] = $this->searchIndexFieldDefinition;
            
$schema Schema::loadFromArray($array$db);
            
$queries $schema->toSql($platform);
            foreach (
$queries as $query) {
                
$db->query($query);
            }
        }
    }

    public function 
setAttributeSet($as)
    {
        if (!
is_object($as)) {
            
$as AttributeSet::getByHandle($as);
        }
        
$as->addKey($this);
    }

    public function 
clearAttributeSets()
    {
        
$db Database::connection();
        
$db->executeQuery('delete from AttributeSetKeys where akID = ?', (array) $this->akID);
    }

    public function 
getAttributeSets()
    {
        
$db Database::connection();
        
$sets = array();
        
$r $db->executeQuery('select asID from AttributeSetKeys where akID = ?', (array) $this->akID);
        while (
$row $r->FetchRow()) {
            
$sets[] = AttributeSet::getByID($row['asID']);
        }

        return 
$sets;
    }

    
/**
     * Saves an attribute using its stock form.
     */
    
public function saveAttributeForm($obj)
    {
        
$this->saveAttribute($obj);
    }

    
/**
     * Sets an attribute directly with a passed value.
     */
    
public function setAttribute($obj$value)
    {
        
$this->saveAttribute($obj$value);
    }

    
/**
     * @deprecated
     */
    
public function outputSearchHTML()
    {
        
$this->render('search');
    }

    
/**
     * @deprecated
     */
    
public function getKeyName()
    {
        return 
$this->getAttributeKeyName();
    }

    
/**
     * Returns the handle for this attribute key.
     */
    
public function getKeyHandle()
    {
        return 
$this->getAttributeKeyHandle();
    }

    
/**
     * Returns the ID for this attribute key.
     */
    
public function getKeyID()
    {
        return 
$this->getAttributeKeyID();
    }

    public static function 
exportTranslations()
    {
        
$translations = new Translations();
        
$db Database::get();
        
$r $db->executeQuery('select akID from AttributeKeys order by akID asc', array());
        while (
$row $r->FetchRow()) {
            
$key = static::getInstanceByID($row['akID']);
            
$translations->insert('AttributeKeyName'$key->getAttributeKeyName());
        }

        return 
$translations;
    }
}
Онлайн: 0
Реклама