function setFieldCache(&$model, $name, $opt = null) { if (is_null($opt)) { $opt = $name; } else { $opt['name'] = $name; } $reset = false; $localOpt = array('dry', 'association', 'usedField'); App::import('Lib', 'SetMulti'); if (!empty($opt['association'])) { if (!is_array($opt['association']) || SetMulti::isAssoc($opt['association'])) { $opt['association'] = array($opt['association']); } foreach ($opt['association'] as $assoc) { $fieldOpt = array_diff_key($opt, array_flip($localOpt)); $fieldOpt['association'] = $assoc; if (isset($fieldOpt['association']) && !is_array($fieldOpt['association'])) { $fieldOpt['association'] = array('name' => $fieldOpt['association']); } $fieldOpt = Set::merge($this->defFieldOpt, $fieldOpt); if (!empty($fieldOpt['name'])) { if (isset($model->{$fieldOpt['association']['type']}[$fieldOpt['association']['name']])) { $fieldOpt['association'] = Set::merge($model->{$fieldOpt['association']['type']}[$fieldOpt['association']['name']], $fieldOpt['association']); } if (empty($fieldOpt['association']['className'])) { $fieldOpt['association']['className'] = $fieldOpt['association']['name']; } if (!empty($fieldOpt['association']['className'])) { $className = $fieldOpt['association']['className']; $fieldOpt['model'] = $model->name; $invalidations = Cache::read($className, 'cacheBehavior'); //debug($fieldOpt); if (empty($invalidations[$model->name][$fieldOpt['name']]) || count(array_diff_assoc($invalidations[$model->name][$fieldOpt['name']], $fieldOpt))) { $reset = true; $invalidations[$model->name][$fieldOpt['name']] = $fieldOpt; Cache::write($className, $invalidations, 'cacheBehavior'); } } } } } if (!empty($opt['usedField'])) { $invalidations = Cache::read($model->name, 'cacheBehavior'); $invalidations['usedField'][$opt['name']] = (array) $opt['usedField']; Cache::write($model->name, $invalidations, 'cacheBehavior'); } if (empty($opt['dry'])) { if ($reset) { $model->updateAll(array($fieldOpt['name'] => null), 1); } return true; } elseif ($reset) { return $fieldOpt['name']; } return false; }
function _getNormalizedSubItem($types, $subItems, &$ids, &$parent = null) { $subItemDef = array('nb' => 1); $finalSubItems = array(); foreach ($types as $type) { $n = $type['name']; if (isset($subItems[$n])) { if (!is_array($subItems[$n]) || SetMulti::isAssoc($subItems[$n])) { $finalSubItems[$n] = array(&$subItems[$n]); } else { $finalSubItems[$n] = $subItems[$n]; } foreach ($finalSubItems[$n] as &$subItem) { if (!is_array($subItem)) { $subItem = array('id' => $subItem); } if ($parent) { $subItem['parent'] =& $parent; } $subItem = array_merge($subItemDef, $subItem); unset($subItem); } $tmp = array_merge($finalSubItems[$n], array()); foreach ($tmp as &$subItem) { if (!empty($subItems['children'][$subItem['id']])) { $finalSubItems = array_merge($finalSubItems, $this->_getNormalizedSubItem($type['children'], $subItems['children'][$subItem['id']], $ids, $subItem)); } unset($subItem); } } $ids = array_merge($ids, SetMulti::extractKeepKey('id', $finalSubItems[$n])); } return $finalSubItems; }
function getFullData($products = null, $opt = array()) { App::import('Lib', 'Shop.SetMulti'); $single = false; $prods = $products; if (!is_array($prods) || SetMulti::isAssoc($prods)) { $prods = array($prods); $single = true; } if (isset($prods[0]['ShopProduct']['DynamicField']) || isset($prods[0]['DynamicField'])) { return $products; } $prods = $this->getAllRelated($prods, $opt); foreach ($prods as &$product) { $dynamicField = $this->getDynamicFields($product, $opt); $product['DynamicField'] = $dynamicField; if ($this->getPromos) { $product['ShopPromotion'] = $this->possiblePromo($product); } if (!empty($product['ShopProduct']['ShopSubproduct'])) { $product['ShopSubproduct'] = $product['ShopProduct']['ShopSubproduct']; unset($product['ShopProduct']['ShopSubproduct']); } if (!empty($product['ShopSubproduct'])) { $product['ShopSubproduct'] = $this->formatSubproduct($product['ShopSubproduct']); } } if ($single) { return $prods[0]; } else { return $prods; } }
function dataToContainedRelations(&$model, $data = null, $alias = null) { if (is_null($alias)) { $alias = $model->alias; } if (is_null($data)) { $data = $model->data; } App::import('Lib', 'SetMulti'); if (is_array($data) && !SetMulti::isAssoc($data)) { $res = array(); foreach ($data as $d) { $res[$alias][] = $model->dataToContainedRelations($d, $alias); } return $res; } if (isset($data[$alias])) { $relation = $data; unset($relation[$alias]); return array_merge($relation, $data[$alias]); } return $data; }