public function update(\SplSubject $subject)
 {
     $this->allow_models[] = 'Account';
     $this->allow_models[] = 'Order';
     $this->allow_models[] = 'OrderDetail';
     $this->allow_models[] = 'Lead';
     $this->allow_models[] = 'Patient';
     $this->allow_models[] = 'User';
     $Recipient_id = $subject->getParam('recipient', 0);
     if ($Recipient_id) {
         $dataModel = $subject->getGatewayServiceVerify()->get('Email')->findOne(['model_id' => $Recipient_id]);
         if ($dataModel) {
             $this->allow_models[] = ucfirst($dataModel->data);
         }
     }
     if (!is_array($this->allow_models)) {
         return;
     }
     foreach ($this->allow_models as $model) {
         $visibleFields['pattern_items'][$model] = $subject->getAclServiceVerify()->getVisibleFields($model);
     }
     /* Copy current recipient data to array 'Contacts' */
     if (isset($dataModel)) {
         $visibleFields['pattern_items']['Contacts'] = $visibleFields['pattern_items'][ucfirst($dataModel->data)];
     }
     $subject->setData($visibleFields);
 }
 /**
  * @param \SplSubject|View $subject
  *
  * @throws \Exception
  */
 public function update(\SplSubject $subject)
 {
     $data = $subject->getParam('data', null);
     $view = $subject->getParam('view', null);
     if ($data == null || $view == null) {
         throw new \Exception('Please specify data param');
     }
     $data = ucfirst($data);
     $viewConfig = $subject->getConfigServiceVerify()->getByObject($data . '.' . $view, new ViewConfig());
     if ($viewConfig == null) {
         throw new \Exception('Please fill ViewConfig for the ' . $data . '.' . $view);
     }
     $this->viewViewConfig = $viewConfig;
     $modelConfig = $subject->getModelServiceVerify()->getParsedModelConfig($data);
     $aclData = $subject->getAclServiceVerify()->getAclConfig($data);
     $fieldConfigs = ['fields' => [], 'labels' => []];
     foreach ($viewConfig->fields as $field) {
         if (array_key_exists($field, $modelConfig['fields'])) {
             $fieldConfigs['fields'][$field] = false;
         }
     }
     //        ksort( $modelConfig['fields']);
     uasort($modelConfig['fields'], function ($a, $b) {
         return strcmp($a['label'], $b['label']);
     });
     foreach ($modelConfig['fields'] as $field => $fConfig) {
         if ($fConfig['type'] == 'field') {
             //check $field in acl
             if (!array_key_exists($field, $aclData->fields) || !in_array($aclData->fields[$field], ['read', 'write'])) {
                 unset($fieldConfigs['fields'][$field]);
                 continue;
             }
         }
         if ($fConfig['type'] == 'alias') {
             //check $fConfig['source'] in acl
             if (!array_key_exists($fConfig['source'], $aclData->fields) || !in_array($aclData->fields[$fConfig['source']], ['read', 'write'])) {
                 unset($fieldConfigs['fields'][$field]);
                 continue;
             }
         }
         if ($fConfig['type'] == 'source') {
             if ($fConfig['source'] !== $field || !array_key_exists($fConfig['source'], $aclData->fields) || !in_array($aclData->fields[$fConfig['source']], ['read', 'write'])) {
                 unset($fieldConfigs['fields'][$field]);
                 continue;
             }
         }
         if ($fConfig['type'] == 'pk') {
             continue;
         }
         $fieldConfigs['fields'][$field] = in_array($field, $viewConfig->fields) ? true : false;
         $fieldConfigs['labels'][$field] = $fConfig['label'];
     }
     $result = [];
     $result['fieldconfigs'] = $fieldConfigs;
     $result['params'] = ['data' => $data, 'view' => $view];
     $subject->setData($result);
     $this->postVerify($subject);
 }
 /**
  * @param \SplSubject|View $subject
  *
  * @throws \Exception
  */
 public function update(\SplSubject $subject)
 {
     $viewConfig = $subject->getViewConfigVerify();
     $query = $subject->getQueryServiceVerify()->get($viewConfig->query)->setParams($subject->getParams())->process();
     $subject->setData($query->getData());
     $result = [];
     $model = $subject->getGatewayVerify()->findOne($query->getWhere());
     if (!$model) {
         throw new \Exception('Data not found');
     }
     $subject->setDataModel($model);
     $data = $subject->getData();
     foreach (['actions', 'links'] as $datapartam) {
         foreach ($data[$datapartam] as $key => $link) {
             foreach (['routeparams', 'queryparams'] as $keyparams) {
                 foreach ($link[$keyparams] as $paramkey => $param) {
                     if ($param[0] == ':') {
                         $_f = substr($param, 1);
                         $data[$datapartam][$key][$keyparams][$paramkey] = $model->{$_f};
                     }
                 }
             }
         }
     }
     $result['fieldsets'] = [];
     $aclData = $subject->getAclServiceVerify()->getAclConfig($viewConfig->model);
     $modelFields = $subject->getParsedModelConfigVerify()->fields;
     $usedGroups = [];
     foreach ($viewConfig->fields as $field) {
         if (!array_key_exists($field, $modelFields)) {
             continue;
         }
         $fConfig = $modelFields[$field];
         //check $field in acl
         if (!array_key_exists($field, $aclData->fields) || !in_array($aclData->fields[$field], ['read', 'write'])) {
             continue;
         }
         if ($fConfig['type'] == 'pk') {
             continue;
         }
         $usedGroups[$modelFields[$field]['group']][] = $field;
     }
     $chosenGroups = [];
     $fieldSet2Group = [];
     foreach ($viewConfig->groups as $grKey => $groupBlock) {
         if (is_array($groupBlock)) {
             foreach ($groupBlock as $group) {
                 if (array_key_exists($group, $usedGroups)) {
                     $chosenGroups[$group] = $usedGroups[$group];
                     $fieldSet2Group[$group] = $grKey;
                 }
             }
             continue;
         }
         if (array_key_exists($groupBlock, $usedGroups)) {
             $chosenGroups[$groupBlock] = $usedGroups[$groupBlock];
             $fieldSet2Group[$groupBlock] = $groupBlock;
         }
     }
     foreach ($chosenGroups as $group => $groupElements) {
         $fieldSet = $subject->getParsedModelConfigVerify()->fieldsets[$group];
         $elements = $fieldSet['elements'];
         $fieldSet['elements'] = [];
         foreach ($groupElements as $field) {
             $fieldSet['elements'][$field] = $elements[$field];
         }
         $fieldSet['group'] = $fieldSet2Group[$group];
         $chosenGroups[$group] = $fieldSet;
     }
     $result['fieldsets'] = $chosenGroups;
     $subject->getLogicServiceVerify()->get('preview', $viewConfig->model)->trigger($model);
     $result['model'] = $model;
     $result['title'] = $viewConfig->title . ': ' . $model->title;
     $result['actions'] = $data['actions'];
     $result['links'] = $data['links'];
     $subject->setData($result);
     $subject->getLogicServiceVerify()->get('postview', $viewConfig->model)->trigger($model);
 }