<?php class Meta_KeysModelWpf extends ModelWpf { // meta_mode: 0-global, 1-filter // meta_type: 0-text, 1-decimal, 2-int, 3-decimal+int, 7-array json, 8-serialised array, 9-list // key_size: for array count keys // value_size: for text max lenght // status: 1-calculated (global), 0-need calc, 2- lock, 9-don't recalc public $lockLimit = 10; //minutes public function __construct() { $this->_setTbl('meta_keys'); } public function getAllKeys( $params = array() ) { if (!empty($params)) { $this->addWhere($params); } $data = $this->addWhere('meta_like=0')->getFromTbl(); $keys = array(); foreach ($data as $fields) { $key = $fields['meta_key']; $keys[$key] = $fields; $typ = $fields['meta_type']; $keys[$key]['field'] = ( 1 == $typ ? 'dec' : ( 2 == $typ || 3 == $typ ? 'int' : 'id' ) ); } return $keys; } public function getKeysWithCalcControl( $params = array()) { if (FrameWpf::_()->getModule('options')->getModel()->get('start_indexing') == 2) { return array(); } return $this->getAllKeys($params); } public function isOldLock( $lock ) { return is_null($lock) || empty($lock) || $lock > $this->lockLimit; } public function resetLockedKeys() { $query = 'UPDATE @__meta_keys SET status=0, updated=CURRENT_TIMESTAMP WHERE status=2 AND TIMESTAMPDIFF(MINUTE, locked, CURRENT_TIMESTAMP)>' . $this->lockLimit; if (!DbWpf::query($query)) { $this->pushError(DbWpf::getError()); return false; } return true; } public function getKeysForRecalc( $params ) { // $params['key_ids'] - array of ids $where = 'status!=9'; if (!empty($params)) { foreach ($params as $key => $value) { $where .= ' AND ' . $key . ( is_array($value) ? " IN ('" . implode("','", $value) . "')" : "='" . $value . "'" ); } } $keys = $this->addWhere($where)->setOrderBy('id')->getFromTbl(); return $keys; } public function getKeyData( $key, $calcLock = false ) { $select = '*'; if ($calcLock) { $select .= ', TIMESTAMPDIFF(MINUTE, locked, CURRENT_TIMESTAMP) as lock_duration'; } return $this->setSelectFields($select)->addWhere(array('meta_key' => $key))->getFromTbl(array('return' => 'row')); } public function saveKeyData( $data ) { unset($data['id'], $data['added'], $data['calculated']); $data['status'] = 0; FrameWpf::_()->getModule('woofilters')->resetMetaKeys(); return $this->insert( $data ); } public function updateKeyData( $id, $data ) { $now = DbWpf::get('SELECT CURRENT_TIMESTAMP', 'one'); if (!$now) { $this->pushError(DbWpf::getError()); return false; } $data['updated'] = $now; if (isset($data['status'])) { if (1 == $data['status']) { $data['calculated'] = $now; } else if (2 == $data['status']) { $data['locked'] = $now; } FrameWpf::_()->getModule('woofilters')->resetMetaKeys(); } if (!$this->updateById($data, $id)) { return false; } return true; } public function addFilterMetaKeys( $filterKeys, $remove = false ) { if (!is_array($filterKeys)) { return false; } $filterKeys = array_unique($filterKeys); $valuesMeta = FrameWpf::_()->getModule('meta')->getModel('meta_values'); $allKeys = $this->getAllKeys(); $keyIds = array(); foreach ($filterKeys as $key) { if (isset($allKeys[$key])) { $data = $allKeys[$key]; if (9 == $data['status']) { if (!$this->updateKeyData($data['id'], array('status' => 0))) { return false; } $keyIds[] = $data['id']; } } else if (!$this->insert(array('meta_key' => $key, 'meta_mode' => 1, 'status' => 0))) { return false; } } if (!empty($keyIds)) { $valuesMeta->restoreOldValues($keyIds); $keyIds = array(); } if ($remove) { foreach ($allKeys as $key => $data) { if ( ( 1 == $data['meta_mode'] ) && ( 9 != $data['status'] ) && !in_array($key, $filterKeys) ) { if (!$this->updateKeyData($data['id'], array('status' => 9))) { return false; } $keyIds[] = $data['id']; } } if (!empty($keyIds)) { $valuesMeta->backupOldValues($keyIds); } } FrameWpf::_()->getModule('woofilters')->resetMetaKeys(); return true; } public function controlFiltersMetaKeys( $deep = false ) { $filtersModel = FrameWpf::_()->getModule('woofilters')->getModel(); $filterKeys = $filtersModel->getFiltersMetaKeys(0, $deep); if (false === $filterKeys) { $this->pushError($filtersModel->getErrors()); return false; } return $this->addFilterMetaKeys($filterKeys, true); } }