Пример #1
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 ? StringHelper::crlfNormalize($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;
 }
Пример #2
0
 /**
  * Query Phraseanet to fetch records
  *
  * @param  Request $request
  * @return Response
  */
 public function query(Request $request)
 {
     $query = (string) $request->request->get('qry');
     // since the query comes from a submited form, normalize crlf,cr,lf ...
     $query = StringHelper::crlfNormalize($query);
     $json = array('query' => $query);
     $options = SearchEngineOptions::fromRequest($this->app, $request);
     $form = $options->serialize();
     $perPage = (int) $this->getSettings()->getUserSetting($this->getAuthenticatedUser(), 'images_per_page');
     $page = (int) $request->request->get('pag');
     $firstPage = $page < 1;
     $engine = $this->getSearchEngine();
     if ($page < 1) {
         $engine->resetCache();
         $page = 1;
     }
     $user = $this->getAuthenticatedUser();
     $userManipulator = $this->getUserManipulator();
     $userManipulator->logQuery($user, $query);
     try {
         /** @var SearchEngineResult $result */
         $result = $engine->query($query, ($page - 1) * $perPage, $perPage, $options);
         if ($this->getSettings()->getUserSetting($user, 'start_page') === 'LAST_QUERY') {
             $userManipulator->setUserSetting($user, 'start_page_query', $query);
         }
         foreach ($options->getDataboxes() as $databox) {
             $collections = array_map(function (\collection $collection) {
                 return $collection->get_coll_id();
             }, array_filter($options->getCollections(), function (\collection $collection) use($databox) {
                 return $collection->get_databox()->get_sbas_id() == $databox->get_sbas_id();
             }));
             $this->getSearchEngineLogger()->log($databox, $result->getQuery(), $result->getTotal(), $collections);
         }
         $proposals = $firstPage ? $result->getProposals() : false;
         $npages = $result->getTotalPages($perPage);
         $page = $result->getCurrentPage($perPage);
         $string = '';
         if ($npages > 1) {
             $d2top = $npages - $page;
             $d2bottom = $page;
             if (min($d2top, $d2bottom) < 4) {
                 if ($d2bottom < 4) {
                     if ($page != 1) {
                         $string .= "<a id='PREV_PAGE' class='btn btn-primary btn-mini'></a>";
                     }
                     for ($i = 1; $i <= 4 && $i <= $npages === true; $i++) {
                         if ($i == $page) {
                             $string .= '<input onkeypress="if(event.keyCode == 13 && !isNaN(parseInt(this.value)))gotopage(parseInt(this.value))" type="text" value="' . $i . '" size="' . strlen((string) $i) . '" class="btn btn-mini" />';
                         } else {
                             $string .= "<a onclick='gotopage(" . $i . ");return false;' class='btn btn-primary btn-mini'>" . $i . "</a>";
                         }
                     }
                     if ($npages > 4) {
                         $string .= "<a id='NEXT_PAGE' class='btn btn-primary btn-mini'></a>";
                     }
                     $string .= "<a onclick='gotopage(" . $npages . ");return false;' class='btn btn-primary btn-mini' id='last'></a>";
                 } else {
                     $start = $npages - 4;
                     if ($start > 0) {
                         $string .= "<a onclick='gotopage(1);return false;' class='btn btn-primary btn-mini' id='first'></a>";
                         $string .= "<a id='PREV_PAGE' class='btn btn-primary btn-mini'></a>";
                     } else {
                         $start = 1;
                     }
                     for ($i = $start; $i <= $npages; $i++) {
                         if ($i == $page) {
                             $string .= '<input onkeypress="if(event.keyCode == 13 && !isNaN(parseInt(this.value)))gotopage(parseInt(this.value))" type="text" value="' . $i . '" size="' . strlen((string) $i) . '" class="btn btn-mini" />';
                         } else {
                             $string .= "<a onclick='gotopage(" . $i . ");return false;' class='btn btn-primary btn-mini'>" . $i . "</a>";
                         }
                     }
                     if ($page < $npages) {
                         $string .= "<a id='NEXT_PAGE' class='btn btn-primary btn-mini'></a>";
                     }
                 }
             } else {
                 $string .= "<a onclick='gotopage(1);return false;' class='btn btn-primary btn-mini' id='first'></a>";
                 for ($i = $page - 2; $i <= $page + 2; $i++) {
                     if ($i == $page) {
                         $string .= '<input onkeypress="if(event.keyCode == 13 && !isNaN(parseInt(this.value)))gotopage(parseInt(this.value))" type="text" value="' . $i . '" size="' . strlen((string) $i) . '" class="btn btn-mini" />';
                     } else {
                         $string .= "<a onclick='gotopage(" . $i . ");return false;' class='btn btn-primary btn-mini'>" . $i . "</a>";
                     }
                 }
                 $string .= "<a onclick='gotopage(" . $npages . ");return false;' class='btn btn-primary btn-mini' id='last'></a>";
             }
         }
         $string .= '<div style="display:none;"><div id="NEXT_PAGE"></div><div id="PREV_PAGE"></div></div>';
         $explain = "<div id=\"explainResults\" class=\"myexplain\">";
         $explain .= "<img src=\"/assets/common/images/icons/answers.gif\" /><span><b>";
         if ($result->getTotal() != $result->getAvailable()) {
             $explain .= $this->app->trans('reponses:: %available% Resultats rappatries sur un total de %total% trouves', ['available' => $result->getAvailable(), '%total%' => $result->getTotal()]);
         } else {
             $explain .= $this->app->trans('reponses:: %total% Resultats', ['%total%' => $result->getTotal()]);
         }
         $explain .= " </b></span>";
         $explain .= '<br><div>' . $result->getDuration() / 1000 . ' s</div>dans index ' . $result->getIndexes();
         $explain .= "</div>";
         $infoResult = '<div id="docInfo">' . $this->app->trans('%number% documents<br/>selectionnes', ['%number%' => '<span id="nbrecsel"></span>']) . '</div><a href="#" class="infoDialog" infos="' . str_replace('"', '&quot;', $explain) . '">' . $this->app->trans('%total% reponses', ['%total%' => '<span>' . $result->getTotal() . '</span>']) . '</a>';
         $json['infos'] = $infoResult;
         $json['navigation'] = $string;
         $prop = null;
         if ($firstPage) {
             $propals = $result->getSuggestions();
             if (count($propals) > 0) {
                 foreach ($propals as $prop_array) {
                     if ($prop_array->getSuggestion() !== $query && $prop_array->getHits() > $result->getTotal()) {
                         $prop = $prop_array->getSuggestion();
                         break;
                     }
                 }
             }
         }
         if ($result->getTotal() === 0) {
             $template = 'prod/results/help.html.twig';
         } else {
             $template = 'prod/results/records.html.twig';
         }
         $json['results'] = $this->render($template, ['results' => $result]);
         /** Debug */
         $json['parsed_query'] = $result->getQuery();
         /** End debug */
         $fieldLabels = ['Base_Name' => $this->app->trans('prod::facet:base_label'), 'Collection_Name' => $this->app->trans('prod::facet:collection_label'), 'Type_Name' => $this->app->trans('prod::facet:doctype_label')];
         foreach ($this->app->getDataboxes() as $databox) {
             foreach ($databox->get_meta_structure() as $field) {
                 if (!isset($fieldLabels[$field->get_name()])) {
                     $fieldLabels[$field->get_name()] = $field->get_label($this->app['locale']);
                 }
             }
         }
         $facets = [];
         foreach ($result->getFacets() as $facet) {
             $facetName = $facet['name'];
             $facet['label'] = isset($fieldLabels[$facetName]) ? $fieldLabels[$facetName] : $facetName;
             $facets[] = $facet;
         }
         $json['facets'] = $facets;
         $json['phrasea_props'] = $proposals;
         $json['total_answers'] = (int) $result->getAvailable();
         $json['next_page'] = $page < $npages && $result->getAvailable() > 0 ? $page + 1 : false;
         $json['prev_page'] = $page > 1 && $result->getAvailable() > 0 ? $page - 1 : false;
         $json['form'] = $form;
     } catch (\Exception $e) {
         // we'd like a message from the parser so get all the exceptions messages
         $msg = '';
         for (; $e; $e = $e->getPrevious()) {
             $msg .= ($msg ? "\n" : "") . $e->getMessage();
         }
         $template = 'prod/results/help.html.twig';
         $result = array('error' => $msg);
         $json['results'] = $this->render($template, ['results' => $result]);
     }
     return $this->app->json($json);
 }
Пример #3
0
 /**
  * @dataProvider provideStringsForCrLfNormalize
  * @covers Alchemy\Phrasea\Utilities\StringHelper::crlfNormalize
  */
 public function testCrLfNormalize($string, $expected)
 {
     $result = StringHelper::crlfNormalize($string);
     $this->assertEquals($expected, $result);
 }
Пример #4
0
    public function hydrateRecords(array &$records)
    {
        $sql = <<<SQL
            (SELECT record_id, ms.name AS `key`, m.value AS value, 'caption' AS type, ms.business AS private
            FROM metadatas AS m
            INNER JOIN metadatas_structure AS ms ON (ms.id = m.meta_struct_id)
            WHERE record_id IN (?))

            UNION

            (SELECT record_id, t.name AS `key`, t.value AS value, 'exif' AS type, 0 AS private
            FROM technical_datas AS t
            WHERE record_id IN (?))
SQL;
        $ids = array_keys($records);
        $statement = $this->connection->executeQuery($sql, array($ids, $ids), array(Connection::PARAM_INT_ARRAY, Connection::PARAM_INT_ARRAY));
        while ($metadata = $statement->fetch()) {
            // Store metadata value
            $key = $metadata['key'];
            $value = $metadata['value'];
            // Do not keep empty values
            if ($key === '' || $value === '') {
                continue;
            }
            $id = $metadata['record_id'];
            if (isset($records[$id])) {
                $record =& $records[$id];
            } else {
                throw new Exception('Received metadata from unexpected record');
            }
            switch ($metadata['type']) {
                case 'caption':
                    // Sanitize fields
                    $value = StringHelper::crlfNormalize($value);
                    $value = $this->sanitizeValue($value, $this->structure->typeOf($key));
                    // Private caption fields are kept apart
                    $type = $metadata['private'] ? 'private_caption' : 'caption';
                    // Caption are multi-valued
                    if (!isset($record[$type][$key])) {
                        $record[$type][$key] = array();
                    }
                    $record[$type][$key][] = $value;
                    // Collect value in the "all" field
                    $field = sprintf('%s_all', $type);
                    if (!isset($record[$field])) {
                        $record[$field] = array();
                    }
                    $record[$field][] = $value;
                    break;
                case 'exif':
                    if (GpsPosition::isSupportedTagName($key)) {
                        $this->handleGpsPosition($records, $id, $key, $value);
                        break;
                    }
                    $tag = $this->structure->getMetadataTagByName($key);
                    if ($tag) {
                        $value = $this->sanitizeValue($value, $tag->getType());
                    }
                    // EXIF data is single-valued
                    $record['metadata_tags'][$key] = $value;
                    break;
                default:
                    throw new Exception('Unexpected metadata type');
                    break;
            }
        }
        $this->clearGpsPositionBuffer();
    }