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; }
public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('email', 'email', ['label' => 'E-mail', 'required' => true, 'constraints' => [new Assert\NotBlank(), new Assert\Email(), NewEmail::create($this->app)]]); $builder->add('password', 'repeated', ['type' => 'password', 'required' => true, 'invalid_message' => 'Please provide the same passwords.', 'first_name' => 'password', 'second_name' => 'confirm', 'first_options' => ['label' => 'Password'], 'second_options' => ['label' => 'Password (confirmation)'], 'constraints' => [new Assert\NotBlank(), new Assert\Length(['min' => 5])]]); if ($this->app->hasTermsOfUse()) { $builder->add('accept-tou', 'checkbox', ['label' => 'Terms of Use', 'mapped' => false, "constraints" => [new Assert\True(["message" => "Please accept the Terms and conditions in order to register."])]]); } $builder->add('provider-id', 'hidden'); $choices = $baseIds = []; foreach ($this->app['registration.manager']->getRegistrationSummary() as $baseInfo) { $dbName = $baseInfo['config']['db-name']; foreach ($baseInfo['config']['collections'] as $baseId => $collInfo) { if (false === $collInfo['can-register']) { continue; } $choices[$dbName][$baseId] = $collInfo['coll-name']; $baseIds[] = $baseId; } } if (!$this->app['conf']->get(['registry', 'registration', 'auto-select-collections'])) { $builder->add('collections', 'choice', ['choices' => $choices, 'multiple' => true, 'expanded' => false, 'constraints' => [new Assert\Choice(['choices' => $baseIds, 'minMessage' => 'You must select at least %s collection.', 'multiple' => true, 'min' => 1])]]); } foreach ($this->params as $param) { $name = $param['name']; if (!preg_match('/[a-zA-Z]+/', $name)) { throw new InvalidArgumentException(sprintf('%s is not a valid fieldname')); } if (isset($this->available[$name])) { $options = array_merge($this->available[$name], ['required' => $param['required']]); if (!$param['required']) { unset($options['constraints']); } unset($options['type']); $builder->add(StringHelper::camelize($name, '-'), $this->getType($name), $options); } } }
/** * 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('"', '"', $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); }
public function toCamelCase($str, $separator = '-', $pascalCase = false) { return StringHelper::camelize($str, $separator, $pascalCase); }
/** * @dataProvider provideStringsForCrLfNormalize * @covers Alchemy\Phrasea\Utilities\StringHelper::crlfNormalize */ public function testCrLfNormalize($string, $expected) { $result = StringHelper::crlfNormalize($string); $this->assertEquals($expected, $result); }
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(); }