示例#1
0
 /**
  * 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;
 }
示例#2
0
 /**
  * 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;
 }
示例#3
0
 /**
  * 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;
 }
示例#4
0
 /**
  * [[@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;
 }
示例#5
0
 /**
  * @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);
 }
示例#6
0
 /**
  * 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;
 }
示例#7
0
 /**
  * [[@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);
 }
示例#8
0
 /**
  * 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;
 }
示例#9
0
 /**
  * [[@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;
 }
示例#10
0
 /**
  * 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;
 }
示例#11
0
 /**
  * [[@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;
         }
     }
 }