Пример #1
0
 public function testGetAvailable()
 {
     $available = Controller::getAvailable(self::$DI['app']);
     $this->assertTrue(is_array($available));
     foreach ($available as $controller) {
         $this->assertInstanceOf('\\Alchemy\\Phrasea\\Vocabulary\\ControlProvider\\ControlProviderInterface', $controller);
     }
 }
Пример #2
0
 public function testGetVocabulary()
 {
     self::$DI['client']->request("GET", "/admin/fields/vocabularies/user");
     $response = self::$DI['client']->getResponse()->getContent();
     $this->assertEquals("application/json", self::$DI['client']->getResponse()->headers->get("content-type"));
     $data = json_decode($response, true);
     $this->assertArrayHasKey('type', $data);
     $this->assertEquals('User', $data['type']);
     $this->assertArrayHasKey('name', $data);
     $voc = VocabularyController::get(self::$DI['app'], $data['type']);
     $this->assertInstanceOf('Alchemy\\Phrasea\\Vocabulary\\ControlProvider\\UserProvider', $voc);
 }
Пример #3
0
 protected function retrieveValues()
 {
     try {
         $datas = $this->get_data_from_cache();
         $this->value = $datas['value'];
         $this->VocabularyType = $datas['vocabularyType'] ? Vocabulary\Controller::get($this->app, $datas['vocabularyType']) : null;
         $this->VocabularyId = $datas['vocabularyId'];
         return $this;
     } catch (\Exception $e) {
     }
     $connbas = $this->databox_field->get_databox()->get_connection();
     $sql = 'SELECT record_id, value, VocabularyType, VocabularyId
         FROM metadatas WHERE id = :id';
     $stmt = $connbas->prepare($sql);
     $stmt->execute([':id' => $this->id]);
     $row = $stmt->fetch(PDO::FETCH_ASSOC);
     $stmt->closeCursor();
     $this->value = $row ? $row['value'] : null;
     try {
         $this->VocabularyType = $row['VocabularyType'] ? Vocabulary\Controller::get($this->app, $row['VocabularyType']) : null;
         $this->VocabularyId = $row['VocabularyId'];
     } catch (\InvalidArgumentException $e) {
     }
     if ($this->VocabularyType) {
         /**
          * Vocabulary Control has been deactivated
          */
         if (!$this->databox_field->getVocabularyControl()) {
             $this->removeVocabulary();
         } elseif ($this->databox_field->getVocabularyControl()->getType() !== $this->VocabularyType->getType()) {
             $this->removeVocabulary();
         } elseif (!$this->VocabularyType->validate($this->VocabularyId)) {
             $this->removeVocabulary();
         } elseif ($this->VocabularyType->getValue($this->VocabularyId) !== $this->value) {
             $this->set_value($this->VocabularyType->getValue($this->VocabularyId));
         }
     }
     $datas = ['value' => $this->value, 'vocabularyId' => $this->VocabularyId, 'vocabularyType' => $this->VocabularyType ? $this->VocabularyType->getType() : null];
     $this->set_data_to_cache($datas);
     return $this;
 }
Пример #4
0
 public function searchVocabularyAction(Request $request, $vocabulary)
 {
     $datas = ['success' => false, 'message' => '', 'results' => []];
     $sbas_id = (int) $request->query->get('sbas_id');
     try {
         if ($sbas_id === 0) {
             throw new \Exception('Invalid sbas_id');
         }
         $VC = VocabularyController::get($this->app, $vocabulary);
         $databox = $this->findDataboxById($sbas_id);
     } catch (\Exception $e) {
         $datas['message'] = $this->app->trans('Vocabulary not found');
         return $this->app->json($datas);
     }
     $query = $request->query->get('query');
     $results = $VC->find($query, $this->getAuthenticatedUser(), $databox);
     $list = [];
     foreach ($results as $Term) {
         /* @var \Alchemy\Phrasea\Vocabulary\Term $Term */
         $list[] = ['id' => $Term->getId(), 'context' => $Term->getContext(), 'value' => $Term->getValue()];
     }
     $datas['success'] = true;
     $datas['results'] = $list;
     return $this->app->json($datas);
 }
Пример #5
0
 private function loadVocabulary()
 {
     try {
         $this->Vocabulary = Vocabulary\Controller::get($this->app, $this->VocabularyType);
     } catch (\InvalidArgumentException $e) {
     }
 }
Пример #6
0
 private function updateFieldWithData(Application $app, \databox_field $field, array $data)
 {
     $field->set_name($data['name'])->set_thumbtitle($data['thumbtitle'])->set_tag(\databox_field::loadClassFromTagName($data['tag']))->set_business($data['business'])->set_aggregable($data['aggregable'])->set_indexable($data['indexable'])->set_required($data['required'])->set_separator($data['separator'])->set_readonly($data['readonly'])->set_type($data['type'])->set_tbranch($data['tbranch'])->set_report($data['report'])->setVocabularyControl(null)->setVocabularyRestricted(false);
     foreach ($data['labels'] as $code => $label) {
         $field->set_label($code, $label);
     }
     if (isset($data['sorter'])) {
         $field->set_position($data['sorter']);
     }
     try {
         $vocabulary = VocabularyController::get($app, $data['vocabulary-type']);
         $field->setVocabularyControl($vocabulary);
         $field->setVocabularyRestricted($data['vocabulary-restricted']);
     } catch (\InvalidArgumentException $e) {
     }
     if ('' !== ($dcesElement = (string) $data['dces-element'])) {
         $class = sprintf('\\databox_Field_DCES_%s', $dcesElement);
         if (!class_exists($class)) {
             throw new BadRequestHttpException(sprintf('DCES element %s does not exist.', $dcesElement));
         }
         $field->set_dces_element(new $class());
     }
 }
Пример #7
0
 public function connect(Application $app)
 {
     $app['controller.prod.edit'] = $this;
     $controllers = $app['controllers_factory'];
     $app['firewall']->addMandatoryAuthentication($controllers);
     $controllers->before(function (Request $request) use($app) {
         $app['firewall']->requireNotGuest()->requireRight('modifyrecord');
     });
     $controllers->post('/', function (Application $app, Request $request) {
         $records = RecordsRequest::fromRequest($app, $request, RecordsRequest::FLATTEN_YES_PRESERVE_STORIES, ['canmodifrecord']);
         $thesaurus = false;
         $status = $ids = $elements = $suggValues = $fields = $JSFields = [];
         $databox = null;
         $multipleDataboxes = count($records->databoxes()) > 1;
         if (1 === count($records->databoxes())) {
             $databoxes = $records->databoxes();
             $databox = array_pop($databoxes);
             /**
              * generate javascript fields
              */
             foreach ($databox->get_meta_structure() as $meta) {
                 $fields[] = $meta;
                 $separator = $meta->get_separator();
                 /** @Ignore */
                 $JSFields[$meta->get_id()] = ['meta_struct_id' => $meta->get_id(), 'name' => $meta->get_name(), '_status' => 0, '_value' => '', '_sgval' => [], 'required' => $meta->is_required(), 'label' => $meta->get_label($app['locale']), 'readonly' => $meta->is_readonly(), 'type' => $meta->get_type(), 'format' => '', 'explain' => '', 'tbranch' => $meta->get_tbranch(), 'maxLength' => $meta->get_tag()->getMaxLength(), 'minLength' => $meta->get_tag()->getMinLength(), 'multi' => $meta->is_multi(), 'separator' => $separator, 'vocabularyControl' => $meta->getVocabularyControl() ? $meta->getVocabularyControl()->getType() : null, 'vocabularyRestricted' => $meta->getVocabularyControl() ? $meta->isVocabularyRestricted() : false];
                 if (trim($meta->get_tbranch()) !== '') {
                     $thesaurus = true;
                 }
             }
             /**
              * generate javascript sugg values
              */
             foreach ($records->collections() as $collection) {
                 /* @var $record record_adapter */
                 $suggValues['b' . $collection->get_base_id()] = [];
                 if ($sxe = simplexml_load_string($collection->get_prefs())) {
                     $z = $sxe->xpath('/baseprefs/sugestedValues');
                     if (!$z || !is_array($z)) {
                         continue;
                     }
                     foreach ($z[0] as $ki => $vi) {
                         // les champs
                         $field = $databox->get_meta_structure()->get_element_by_name($ki);
                         if (!$field || !$vi) {
                             continue;
                         }
                         $suggValues['b' . $collection->get_base_id()][$field->get_id()] = [];
                         foreach ($vi->value as $oneValue) {
                             $suggValues['b' . $collection->get_base_id()][$field->get_id()][] = (string) $oneValue;
                         }
                     }
                 }
                 unset($collection);
             }
             /**
              * generate javascript status
              */
             if ($app['acl']->get($app['authentication']->getUser())->has_right('changestatus')) {
                 $dbstatus = \databox_status::getDisplayStatus($app);
                 if (isset($dbstatus[$databox->get_sbas_id()])) {
                     foreach ($dbstatus[$databox->get_sbas_id()] as $n => $statbit) {
                         $status[$n] = [];
                         $status[$n]['label0'] = $statbit['labels_off_i18n'][$app['locale']];
                         $status[$n]['label1'] = $statbit['labels_on_i18n'][$app['locale']];
                         $status[$n]['img_off'] = $statbit['img_off'];
                         $status[$n]['img_on'] = $statbit['img_on'];
                         $status[$n]['_value'] = 0;
                     }
                 }
             }
             /**
              * generate javascript elements
              */
             foreach ($databox->get_meta_structure() as $field) {
                 $databox_fields[$field->get_id()] = ['dirty' => false, 'meta_struct_id' => $field->get_id(), 'values' => []];
             }
             foreach ($records as $record) {
                 $indice = $record->get_number();
                 $elements[$indice] = ['bid' => $record->get_base_id(), 'rid' => $record->get_record_id(), 'sselcont_id' => null, '_selected' => false, 'fields' => $databox_fields];
                 $elements[$indice]['statbits'] = [];
                 if ($app['acl']->get($app['authentication']->getUser())->has_right_on_base($record->get_base_id(), 'chgstatus')) {
                     foreach ($status as $n => $s) {
                         $tmp_val = substr(strrev($record->get_status()), $n, 1);
                         $elements[$indice]['statbits'][$n]['value'] = $tmp_val == '1' ? '1' : '0';
                         $elements[$indice]['statbits'][$n]['dirty'] = false;
                     }
                 }
                 $elements[$indice]['originalname'] = $record->get_original_name();
                 foreach ($record->get_caption()->get_fields(null, true) as $field) {
                     $meta_struct_id = $field->get_meta_struct_id();
                     if (!isset($JSFields[$meta_struct_id])) {
                         continue;
                     }
                     $values = [];
                     foreach ($field->get_values() as $value) {
                         $type = $id = null;
                         if ($value->getVocabularyType()) {
                             $type = $value->getVocabularyType()->getType();
                             $id = $value->getVocabularyId();
                         }
                         $values[$value->getId()] = ['meta_id' => $value->getId(), 'value' => $value->getValue(), 'vocabularyId' => $id, 'vocabularyType' => $type];
                     }
                     $elements[$indice]['fields'][$meta_struct_id] = ['dirty' => false, 'meta_struct_id' => $meta_struct_id, 'values' => $values];
                 }
                 $elements[$indice]['subdefs'] = [];
                 $thumbnail = $record->get_thumbnail();
                 $elements[$indice]['subdefs']['thumbnail'] = ['url' => $thumbnail->get_url(), 'w' => $thumbnail->get_width(), 'h' => $thumbnail->get_height()];
                 $elements[$indice]['preview'] = $app['twig']->render('common/preview.html.twig', ['record' => $record]);
                 $elements[$indice]['type'] = $record->get_type();
             }
         }
         $params = ['multipleDataboxes' => $multipleDataboxes, 'recordsRequest' => $records, 'databox' => $databox, 'JSonStatus' => json_encode($status), 'JSonRecords' => json_encode($elements), 'JSonFields' => json_encode($JSFields), 'JSonIds' => json_encode(array_keys($elements)), 'status' => $status, 'fields' => $fields, 'JSonSuggValues' => json_encode($suggValues), 'thesaurus' => $thesaurus];
         return $app['twig']->render('prod/actions/edit_default.html.twig', $params);
     });
     $controllers->get('/vocabulary/{vocabulary}/', function (Application $app, Request $request, $vocabulary) {
         $datas = ['success' => false, 'message' => '', 'results' => []];
         $sbas_id = (int) $request->query->get('sbas_id');
         try {
             if ($sbas_id === 0) {
                 throw new \Exception('Invalid sbas_id');
             }
             $VC = VocabularyController::get($app, $vocabulary);
             $databox = $app['phraseanet.appbox']->get_databox($sbas_id);
         } catch (\Exception $e) {
             $datas['message'] = $app->trans('Vocabulary not found');
             return $app->json($datas);
         }
         $query = $request->query->get('query');
         $results = $VC->find($query, $app['authentication']->getUser(), $databox);
         $list = [];
         foreach ($results as $Term) {
             /* @var $Term \Alchemy\Phrasea\Vocabulary\Term */
             $list[] = ['id' => $Term->getId(), 'context' => $Term->getContext(), 'value' => $Term->getValue()];
         }
         $datas['success'] = true;
         $datas['results'] = $list;
         return $app->json($datas);
     });
     $controllers->post('/apply/', function (Application $app, Request $request) {
         $records = RecordsRequest::fromRequest($app, $request, RecordsRequest::FLATTEN_YES_PRESERVE_STORIES, ['canmodifrecord']);
         if (count($records->databoxes()) !== 1) {
             throw new \Exception('Unable to edit on multiple databoxes');
         }
         if ($request->request->get('act_option') == 'SAVEGRP' && $request->request->get('newrepresent') && $records->isSingleStory()) {
             try {
                 $reg_record = $records->singleStory();
                 $newsubdef_reg = new \record_adapter($app, $reg_record->get_sbas_id(), $request->request->get('newrepresent'));
                 if ($newsubdef_reg->get_type() !== 'image') {
                     throw new \Exception('A reg image must come from image data');
                 }
                 foreach ($newsubdef_reg->get_subdefs() as $name => $value) {
                     if (!in_array($name, ['thumbnail', 'preview'])) {
                         continue;
                     }
                     $media = $app['mediavorus']->guess($value->get_pathfile());
                     $app['subdef.substituer']->substitute($reg_record, $name, $media);
                     $app['phraseanet.logger']($reg_record->get_databox())->log($reg_record, \Session_Logger::EVENT_SUBSTITUTE, $name == 'document' ? 'HD' : $name, '');
                 }
             } catch (\Exception $e) {
             }
         }
         if (!is_array($request->request->get('mds'))) {
             return $app->json(['message' => '', 'error' => false]);
         }
         $databoxes = $records->databoxes();
         $databox = array_pop($databoxes);
         $meta_struct = $databox->get_meta_structure();
         $write_edit_el = false;
         $date_obj = new \DateTime();
         foreach ($meta_struct->get_elements() as $meta_struct_el) {
             if ($meta_struct_el->get_tag() instanceof TfEditdate) {
                 $write_edit_el = $meta_struct_el;
             }
         }
         $elements = $records->toArray();
         foreach ($request->request->get('mds') as $rec) {
             try {
                 $record = $databox->get_record($rec['record_id']);
             } catch (\Exception $e) {
                 continue;
             }
             $key = $record->get_serialize_key();
             if (!array_key_exists($key, $elements)) {
                 continue;
             }
             $statbits = $rec['status'];
             $editDirty = $rec['edit'];
             if ($editDirty == '0') {
                 $editDirty = false;
             } else {
                 $editDirty = true;
             }
             if (is_array($rec['metadatas'])) {
                 $record->set_metadatas($rec['metadatas']);
             }
             /**
              * todo : this should not work
              */
             if ($write_edit_el instanceof \databox_field) {
                 $fields = $record->get_caption()->get_fields([$write_edit_el->get_name()], true);
                 $field = array_pop($fields);
                 $meta_id = null;
                 if ($field && !$field->is_multi()) {
                     $values = $field->get_values();
                     $meta_id = array_pop($values)->getId();
                 }
                 $metas = [['meta_struct_id' => $write_edit_el->get_id(), 'meta_id' => $meta_id, 'value' => $date_obj->format('Y-m-d h:i:s')]];
                 $record->set_metadatas($metas, true);
             }
             $newstat = $record->get_status();
             $statbits = ltrim($statbits, 'x');
             if (!in_array($statbits, ['', 'null'])) {
                 $mask_and = ltrim(str_replace(['x', '0', '1', 'z'], ['1', 'z', '0', '1'], $statbits), '0');
                 if ($mask_and != '') {
                     $newstat = \databox_status::operation_and_not($app, $newstat, $mask_and);
                 }
                 $mask_or = ltrim(str_replace('x', '0', $statbits), '0');
                 if ($mask_or != '') {
                     $newstat = \databox_status::operation_or($app, $newstat, $mask_or);
                 }
                 $record->set_binary_status($newstat);
             }
             $record->write_metas()->get_collection()->reset_stamp($record->get_record_id());
             if ($statbits != '') {
                 $app['phraseanet.logger']($record->get_databox())->log($record, \Session_Logger::EVENT_STATUS, '', '');
             }
             if ($editDirty) {
                 $app['phraseanet.logger']($record->get_databox())->log($record, \Session_Logger::EVENT_EDIT, '', '');
             }
         }
         return $app->json(['success' => true]);
     });
     return $controllers;
 }