public function buildSqlWhere() { $where = $this->config->filter(); $depth = Status::depth($this->statusVariables); if ($depth > 1) { if (!$this->config->connectionField()) { throw new \Ip\Exception("Nested GRID require 'connectionField' setting to be set."); } $where .= ' and (' . $where . ') and ' . $this->config->tableName() . '.`' . $this->config->connectionField() . '` = ' . ipDb()->getConnection()->quote($this->statusVariables['gridParentId' . ($depth - 1)]); } $searchVariables = array(); foreach ($this->statusVariables as $key => $value) { if (preg_match('/^s_/', $key)) { $searchVariables[substr($key, 2)] = $value; } } if (!empty($searchVariables)) { foreach ($this->config->fields() as $fieldData) { if (!empty($fieldData['type']) && $fieldData['type'] == 'Tab') { continue; } $fieldObject = $this->config->fieldObject($fieldData); $fieldQuery = $fieldObject->searchQuery($searchVariables); if ($fieldQuery) { if ($where != ' ') { $where .= ' and '; } $where .= $fieldQuery; } } } return $where; }
protected function getBreadcrumb() { $depth = Status::depth($this->statusVariables); if ($depth <= 1) { return array(); } $breadcrumb = array(); $gridConfig = $this->config; $breadcrumb[] = array('title' => $gridConfig->getTitle(), 'url' => '#'); $lastStatusVariables = array(); $db = new Db($this->config, $this->statusVariables); for ($i = 1; $i <= $depth - 1; $i++) { if (isset($this->statusVariables['gridParentId' . $i])) { $parentId = $this->statusVariables['gridParentId' . $i]; } else { $parentId = null; } if (isset($this->statusVariables['gridId' . $i])) { $gridId = $this->statusVariables['gridId' . $i]; } else { $gridId = null; } $lastStatusVariables = Status::genSubgridVariables($lastStatusVariables, $gridId, $parentId); $tmpGridConfig = $gridConfig->subgridConfig($lastStatusVariables); $hash = Status::build($lastStatusVariables); $breadcrumbGridconfig = $gridConfig->subgridConfig($lastStatusVariables, $i); if ($breadcrumbGridconfig->getBreadcrumbField()) { $title = $db->breadcrumbTitle($i); } else { $title = $tmpGridConfig->getTitle(); } $breadcrumb[] = array('title' => $title, 'url' => '#' . $hash); } return $breadcrumb; }
public static function genSubgridVariables($curStatusVariables, $gridId, $gridParentId) { $newStatusVariables = array(); $depth = Status::depth($curStatusVariables); for ($i = 1; $i < $depth; $i++) { $newStatusVariables['gridId' . $i] = $curStatusVariables['gridId' . $i]; $newStatusVariables['gridParentId' . $i] = $curStatusVariables['gridParentId' . $i]; } if ($gridId !== null) { $newStatusVariables['gridId' . $depth] = $gridId; } if ($gridParentId !== null) { $newStatusVariables['gridParentId' . $depth] = $gridParentId; } return $newStatusVariables; }
/** * Return nested grid config object * @param $statusVariables * @return Config * @throws \Ip\Exception */ public function subgridConfig($statusVariables, $depthLimit = null) { $depth = Status::depth($statusVariables); if ($depthLimit !== null && $depthLimit < $depth) { $depth = $depthLimit; } $config = $this->config; for ($i = 1; $i < $depth; $i++) { $found = false; foreach ($config['fields'] as $field) { if (!empty($field['type']) && $field['type'] == 'Grid' && $field['gridId'] == $statusVariables['gridId' . $i]) { $config = $field['config']; $found = true; break; } } if (!$found) { throw new \Ip\Exception('Unknown subgrid'); } } return new self($config); }
public function create($data) { $languages = ipContent()->getlanguages(); $fields = $this->subgridConfig->fields(); $dbData = array(); $languageData = array(); foreach ($fields as $field) { if (!empty($field['type']) && $field['type'] == 'Tab' && empty($field['preview']) || !empty($field['ignoreDb'])) { continue; } $fieldObject = $this->subgridConfig->fieldObject($field); $fieldObject->beforeCreate(null, $data); //one vent for multilingual and non-multilingual fields. if (empty($field['multilingual'])) { $fieldData = $fieldObject->createData($data); if (!is_array($fieldData)) { throw new \Ip\Exception("createData method in class " . esc(get_class($fieldObject)) . " has to return array."); } $dbData = array_merge($dbData, $fieldData); } else { foreach ($languages as $language) { $tmpData = $data; if (isset($data[$field['field'] . '_' . $language->getCode()])) { $tmpData[$field['field']] = $data[$field['field'] . '_' . $language->getCode()]; } $fieldObject = $this->subgridConfig->fieldObject($field); $fieldData = $fieldObject->createData($tmpData); if (!is_array($fieldData)) { throw new \Ip\Exception("createData method in class " . esc(get_class($fieldObject)) . " has to return array."); } if (empty($languageData[$language->getCode()])) { $languageData[$language->getCode()] = array(); } $languageData[$language->getCode()] = array_merge($languageData[$language->getCode()], $fieldData); } } } $sortField = $this->subgridConfig->sortField(); if ($sortField) { if ($this->subgridConfig->createPosition() == 'top') { $orderValue = ipDb()->selectValue($this->subgridConfig->rawTableName(), "MIN(`{$sortField}`)", array()); $dbData[$sortField] = is_numeric($orderValue) ? $orderValue - 1 : 1; // 1 if null } else { $orderValue = ipDb()->selectValue($this->subgridConfig->rawTableName(), "MAX(`{$sortField}`)", array()); $dbData[$sortField] = is_numeric($orderValue) ? $orderValue + 1 : 1; // 1 if null } } $depth = Status::depth($this->statusVariables); if ($depth > 1) { $dbData[$this->subgridConfig->connectionField()] = $this->statusVariables['gridParentId' . ($depth - 1)]; } if ($this->subgridConfig->createFilter()) { $dbData = call_user_func($this->subgridConfig->createFilter(), $dbData); } if ($this->subgridConfig->isMultilingual() && $this->subgridConfig->createLanguageFilter()) { $languageData = call_user_func($this->subgridConfig->createLanguageFilter(), $languageData); } $recordId = ipDb()->insert($this->subgridConfig->rawTableName(), $dbData); if (!empty($languageData)) { foreach ($languageData as $languageCode => $rawData) { $rawData[$this->subgridConfig->languageCodeField()] = $languageCode; $rawData[$this->subgridConfig->languageForeignKeyField()] = $recordId; ipDb()->insert($this->subgridConfig->rawLanguageTableName(), $rawData); } } foreach ($fields as $field) { $fieldObject = $this->subgridConfig->fieldObject($field); $fieldObject->afterCreate($recordId, $data); } return $recordId; }