/** * Get data source. * * @return [[@doctodo return_type:getDataSource]] [[@doctodo return_description:getDataSource]] */ public function getDataSource() { if (is_null($this->_dataSource)) { $typeItem = Yii::$app->collectors['types']->getOne($this->instructions['type']); if (!$typeItem || !($type = $typeItem->object)) { return $this->_dataSource = false; } $primaryModel = $type->primaryModel; if (isset($this->instructions['parent'])) { $registryClass = Yii::$app->classes['Registry']; $object = $registryClass::getObject($this->instructions['parent']); if (!$object) { return $this->_dataSource = false; } $this->_dataSource = $object->queryChildObjects($primaryModel, [], []); } else { $this->_dataSource = $primaryModel::find(); } $dummyModel = new $primaryModel(); $sortOptions = array_values($dummyModel->sortOptions); if ($this->filterQuery) { $primaryModel::simpleSearchTermQuery($this->_dataSource, $this->filterQuery); } elseif (isset($sortOptions[0])) { $this->_dataSource->orderBy($sortOptions[0]); } } return $this->_dataSource; }
/** * Get content. * * @return [[@doctodo return_type:getContent]] [[@doctodo return_description:getContent]] */ public function getContent() { if (!isset($this->_content)) { $this->_content = $this->sourceFile->readLine($this->lineNumber); } return $this->_content; }
/** * Get data. * * @return [[@doctodo return_type:getData]] [[@doctodo return_description:getData]] */ public function getData() { if (is_null($this->_currentData)) { $this->_currentDataRaw = $this->dataProvider->getData(); $this->_currentData = []; $itemNumber = $this->dataProvider->pagination->offset; $row = 0; foreach ($this->_currentDataRaw as $r) { $p = ['itemNumber' => $itemNumber, 'id' => $r->primaryKey, 'values' => []]; foreach ($this->columns as $key => $c) { $p['values'][$key] = $c->getDataValue($row, $r, false); } $p['acl'] = []; if ($this->owner->instanceSettings['whoAmI'] === 'parent' and isset($r->childObject) and $r->childObject->hasBehavior('Access')) { $p['acl'] = $r->childObject->aclSummary(); } elseif ($this->owner->instanceSettings['whoAmI'] === 'child' and isset($r->parentObject) and $r->parentObject->hasBehavior('Access')) { $p['acl'] = $r->parentObject->aclSummary(); } elseif ($r->hasBehavior('Access')) { $p['acl'] = $r->aclSummary(); } $this->_currentData['item-' . $itemNumber] = $p; $row++; $itemNumber++; } } return $this->_currentData; }
/** * [[@doctodo method_description:handle]]. * * @return [[@doctodo return_type:handle]] [[@doctodo return_description:handle]] */ public function handle() { $result = false; switch ($this->target) { case 'delete_object': $result = true; if (!is_null($this->relationModel)) { $result = $this->relationModel->suppressAudit()->delete(); } $result = $result && $this->object->delete(); break; case 'archive_object': $result = $this->object->archive(); break; case 'unarchive_object': $result = $this->object->unarchive(); break; case 'delete_relationship': $result = $this->relationModel->delete(); break; case 'end_relationship': $result = $this->relationModel->endRelationship(); break; } return $result; }
/** * @inheritdoc */ public function getLabel() { if (isset($this->baseModel)) { $labels = $this->baseModel->attributeLabels(); if (isset($labels[$this->field])) { return $labels[$this->field]; } } return $this->relationship->getLabel($this->modelRole); }
/** * Set handled data item. * * @param [[@doctodo param_type:value]] $value [[@doctodo param_description:value]] * * @return [[@doctodo return_type:setHandledDataItem]] [[@doctodo return_description:setHandledDataItem]] */ public function setHandledDataItem($value) { if (isset($this->_pairedDataItem)) { $this->pairedDataItem->handledDataItem = $value; } if (!$this->_handledDataItem && $value) { $this->dataSource->reduceRemaining($this); } $this->clean(); return $this->_handledDataItem = $value; }
/** * [[@doctodo method_description:prepareTask]]. */ public function prepareTask() { $total = 0; if (in_array($this->settings['direction'], ['to_local', 'both'])) { $total += count($this->foreignDataItems); } if (in_array($this->settings['direction'], ['to_foreign', 'both'])) { $total += count($this->localDataItems); } $this->task->setWeight($total * $this->taskWeight); $this->task->setProgressTotal($total); }
/** * Get interface object. * * @throws Exception [[@doctodo exception_description:Exception]] * @return [[@doctodo return_type:getInterfaceObject]] [[@doctodo return_description:getInterfaceObject]] * */ public function getInterfaceObject() { if (is_null($this->_interfaceObject)) { $this->_interfaceObject = DataInterface::find()->where(['system_id' => $this->object->systemId])->one(); if (empty($this->_interfaceObject)) { $this->_interfaceObject = new DataInterface(); $this->_interfaceObject->name = $this->object->name; $this->_interfaceObject->system_id = $this->object->systemId; if (!$this->_interfaceObject->save()) { var_dump($this->_interfaceObject->errors); throw new Exception("Unable to save interface object!"); } } } return $this->_interfaceObject; }
/** * [[@doctodo method_description:extractValue]]. * * @param [[@doctodo param_type:caller]] $caller [[@doctodo param_description:caller]] * @param [[@doctodo param_type:foreignModel]] $foreignModel [[@doctodo param_description:foreignModel]] [optional] * @param [[@doctodo param_type:localModel]] $localModel [[@doctodo param_description:localModel]] [optional] * * @return [[@doctodo return_type:extractValue]] [[@doctodo return_description:extractValue]] */ public function extractValue($caller, $foreignModel = null, $localModel = null) { if (is_null($foreignModel)) { $foreignModel = $this->foreignModel; } $foreignField = $this->foreignField; $value = null; if (isset($this->value)) { if (is_callable($this->value)) { $value = call_user_func($this->value, $foreignModel, $this); } else { $value = $this->value; } } elseif (isset($foreignField)) { if (is_callable($foreignField)) { $value = call_user_func($foreignField, $foreignModel); } elseif (!is_object($foreignField) && is_array($foreignField)) { $value = $caller->buildLocalAttributes($foreignModel, $localModel, $caller->buildMap($foreignField)); } elseif (is_string($foreignField)) { $value = isset($foreignModel->{$foreignField}) ? $foreignModel->{$foreignField} : null; } } if (is_object($value) && $value instanceof DataItem) { $object = $value->handle(); if ($object) { $value = $object->primaryKey; } else { $value = null; } } if (!is_array($value)) { if (isset($this->filter)) { $value = call_user_func($this->filter, $value); } $value = $this->dataSource->universalFilter($value); } return $value; }
/** * Get fields. * * @return unknown */ protected function getFields() { $settings = $this->settings; if (is_null($this->_fields)) { $this->_fields = []; if (is_array($settings)) { $this->_settings = $settings; } else { $this->_settings = []; } if (!isset($this->_settings['fieldSettings'])) { $this->_settings['fieldSettings'] = []; } if (!isset($this->_settings['formField'])) { $this->_settings['formField'] = []; } if (!isset($this->_settings['ignoreFields'])) { $this->_settings['ignoreFields'] = []; } if (is_array($this->_settings['fields']) && empty($this->_settings['fields'])) { $this->_settings['fields'] = null; } $fields = $this->_model->getFields($this); if (!isset($this->_model->_moduleHandler)) { $modelClass = get_class($this->_model); $this->_model->_moduleHandler = $modelClass::FORM_PRIMARY_MODEL; } $requiredFields = true; $fieldsTemplate = false; if (!is_null($this->relationField)) { $fieldName = $this->relationField->modelRole . ':' . $this->relationField->baseModel->objectType->systemId; if (isset($fields[$fieldName])) { $fields[$fieldName]->baseModel = $this->relationField->baseModel; $fields[$fieldName]->model = $this->relationField->model; $fields[$fieldName]->formField = $this->relationField->formField; $fields[$fieldName]->required = true; $this->relationField->formField->inlineRelation = true; if (!$this->relationField->model->isNewRecord && $this->relationField->companion->hasDashboard) { $fieldsTemplate = [[$fieldName]]; $requiredFields = false; } } } if ($requiredFields) { $requiredFields = $this->_model->getRequiredFields($this); } else { $requiredFields = [$fieldName => $fields[$fieldName]]; } if (!$fieldsTemplate) { if (!empty($this->subform)) { $fieldsTemplate = [[$this->subform => ['relationSettings' => $this->relationSettings]]]; } elseif (!isset($this->_settings['fields'])) { $fieldsTemplate = []; foreach ($fields as $fieldName => $field) { if (!$field->human) { continue; } //if (!$field->required) { continue; } if (!$field instanceof ModelField) { continue; } $fieldsTemplate[] = [$fieldName]; } } else { $fieldsTemplate = $this->_settings['fields']; } } if ($fieldsTemplate !== false) { $this->_settings['fields'] = []; foreach ($fields as $fieldKey => $field) { if (!is_object($field->model)) { \d($field); exit; } if ($field->model->isNewRecord) { continue; } if ($field->human) { continue; } if (!$field->required) { continue; } $this->grid->prepend($field->formField); } $fields['_moduleHandler']->formField->owner = $this; $this->grid->prepend($fields['_moduleHandler']->formField); $cellClass = $this->cellClass; // make sure all required fields are part of the form if (empty($this->subform)) { if (!empty($requiredFields)) { foreach ($fieldsTemplate as $rowFields) { foreach ($rowFields as $fieldKey => $fieldSettings) { if (is_numeric($fieldKey)) { $fieldKey = $fieldSettings; $fieldSettings = []; } unset($requiredFields[$fieldKey]); } } } foreach ($requiredFields as $fieldName => $field) { if (in_array($fieldName, $this->_settings['ignoreFields'])) { continue; } $fieldsTemplate[] = [$fieldName]; } } foreach ($fieldsTemplate as $rowFields) { $rowItems = []; foreach ($rowFields as $fieldKey => $fieldSettings) { if (is_numeric($fieldKey)) { $fieldKey = $fieldSettings; $fieldSettings = []; } if ($fieldKey === false || $fieldKey === ':empty') { $rowItems[] = Yii::createObject(['class' => $cellClass, 'content' => ' ']); continue; } if ($fieldKey === ':separator') { $rowItems[] = Yii::createObject(['class' => $cellClass, 'content' => '<span class="separator"></span>']); continue; } if (!isset($fields[$fieldKey])) { \d([$fieldKey, array_keys($fields)]); continue; } $this->_fields[$fieldKey] = $fields[$fieldKey]; if ($fieldKey === false) { $rowItems[] = false; } else { //\d([$fieldKey, $fieldSettings]); $cellOptions = ['class' => $cellClass, 'content' => $fields[$fieldKey]->formField->configure($fieldSettings)]; if (isset($cellOptions['content']->columns)) { $cellOptions['columns'] = $cellOptions['content']->columns; } $rowItems[] = Yii::createObject($cellOptions); } } $this->grid->addRow($rowItems); } } } //\d($this->_fields);exit; return $this->_fields; }
/** * [[@doctodo method_description:searchLocal]]. * * @param cascade\components\dataInterface\DataItem $item [[@doctodo param_description:item]] * @param array $searchParams [[@doctodo param_description:searchParams]] [optional] * * @return [[@doctodo return_type:searchLocal]] [[@doctodo return_description:searchLocal]] */ public function searchLocal(DataItem $item, $searchParams = []) { if (empty($searchParams['searchFields'])) { $searchParams['searchFields'] = $this->localFields; } if (empty($searchParams['searchFields'])) { return; } if (!isset($searchParams['limit'])) { $searchParams['limit'] = 5; } $searchParams['skipForeign'] = true; $query = []; foreach ($this->foreignFields as $field) { if (!empty($item->foreignObject->{$field})) { $value = $item->foreignObject->{$field}; if (isset($this->foreignFilter)) { $value = call_user_func($this->foreignFilter, $value); } $query[] = $value; } } if (empty($query)) { return; } $localClass = $this->dataSource->localModel; $searchResults = $localClass::searchTerm(implode(' ', $query), $searchParams); $resultsLeft = $totalResults = count($searchResults); foreach ($searchResults as $k => $r) { // if ($r->descriptor === $query[0]) { continue; } $score = $resultsLeft / $totalResults * 100 * 0.2 + StringHelper::compareStrings($r->descriptor, implode(' ', $query)) * 0.8; $r->score = $score; if ($score < $this->threshold) { unset($searchResults[$k]); } else { $reverseKey = $this->dataSource->getReverseKeyTranslation($r->id); if (!empty($reverseKey)) { unset($searchResults[$k]); } } $resultsLeft--; } ArrayHelper::multisort($searchResults, 'scoreSort', SORT_DESC); $searchResults = array_values($searchResults); if (empty($searchResults)) { return; } elseif ($safeResult = $this->getSafeResult($searchResults)) { $this->dataSource->task->addInfo('Auto-matched "' . implode(' ', $query) . '" to "' . $safeResult->descriptor . '" (Score: ' . round($safeResult->score, 2) . ')', ['query' => $query, 'foreignObject' => $item->foreignObject->attributes, 'localObject' => ['id' => $safeResult->id, 'descriptor' => $safeResult->descriptor]]); return $safeResult->object; } else { $options = []; $resultsNice = []; $optionNumber = 1; $defaultOption = 'new'; if ($searchResults[0]->score > $this->defaultOptionThreshold) { $defaultOption = '1'; } foreach ($searchResults as $result) { $resultsNice['' . $optionNumber] = $result; $options['' . $optionNumber] = $result->descriptor . ' (' . round($result->score) . '%)'; $optionNumber++; } $options['new'] = 'Create New Object'; $options['selectObject'] = 'Select Object'; $select = false; $interactionOptions = ['inputType' => 'select', 'options' => $options]; $interactionOptions['details'] = $item->foreignObject->attributes; $interactionOptions['default'] = $defaultOption; $callback = ['callback' => function ($response) use(&$select, $options) { if (empty($response)) { return false; } if (substr($response, 0, 2) !== '*-' && !isset($options[$response])) { return false; } $select = $response; return true; }]; if (!$this->dataSource->action->createInteraction('Match Object (' . implode(' ', $query) . ')', $interactionOptions, $callback)) { return false; } if ($select === 'new') { $this->dataSource->task->addInfo('For "' . implode(' ', $query) . '" user chose to to create new object', ['query' => $query, 'foreignObject' => $item->foreignObject->attributes]); return; } elseif (substr($select, 0, 2) === '*-') { $matchedObjectId = substr($select, 2); $matchedObject = Registry::getObject($matchedObjectId, false); if (!$matchedObject) { $this->dataSource->task->addWarning('For "' . implode(' ', $query) . '" user tried to match it to a different object, but object wasn\'t found! Created new object.', ['query' => $query, 'foreignObject' => $item->foreignObject->attributes, 'matchedObject' => $matchedObjectId]); return; } $this->dataSource->task->addInfo('For "' . implode(' ', $query) . '" matched to an existing object "' . $matchedObject->descriptor . '"', ['query' => $query, 'foreignObject' => $item->foreignObject->attributes, 'matchedObject' => $matchedObject->attributes]); return $matchedObject; } else { $this->dataSource->task->addInfo('User matched "' . implode(' ', $query) . '" to "' . $resultsNice[$select]->descriptor . '"', ['query' => $query, 'foreignObject' => $item->foreignObject->attributes, 'localObject' => $resultsNice[$select]->id]); return $resultsNice[$select]->object; } } }