/**
  * Internal function to return a search form element object from a row.
  * @param $row array
  * @return Archive
  */
 function &_returnSearchFormElementFromRow(&$row)
 {
     $searchFormElement = new SearchFormElement();
     $searchFormElement->setSearchFormElementId($row['search_form_element_id']);
     $searchFormElement->setType($row['element_type']);
     $searchFormElement->setRangeStart($row['range_start']);
     $searchFormElement->setRangeEnd($row['range_end']);
     $searchFormElement->setSymbolic($row['symbolic']);
     $searchFormElement->setIsClean($row['is_clean']);
     $this->getDataObjectSettings('search_form_element_settings', 'search_form_element_id', $row['search_form_element_id'], $searchFormElement);
     HookRegistry::call('SearchFormElementDAO::_returnSearchFormElementFromRow', array(&$searchFormElement, &$row));
     return $searchFormElement;
 }
 /**
  * Save sort order. 
  */
 function execute()
 {
     if (isset($this->searchFormElementId)) {
         $searchFormElement =& $this->searchFormElementDao->getSearchFormElement($this->searchFormElementId);
     }
     if (!isset($searchFormElement)) {
         $searchFormElement = new SearchFormElement();
     }
     $searchFormElement->setTitle($this->getData('title'), null);
     // Localized
     $searchFormElement->setSymbolic($this->getData('symbolic'), null);
     $searchFormElement->setType($this->getData('type'));
     // Update or insert
     if ($searchFormElement->getSearchFormElementId() != null) {
         $this->searchFormElementDao->updateSearchFormElement($searchFormElement);
     } else {
         $this->searchFormElementDao->insertSearchFormElement($searchFormElement);
     }
     // Store the field IDs for the search form element
     $fieldNames = (array) $this->getData('fieldNames');
     $fieldIds = array();
     $fields = array();
     $schemaPlugins =& PluginRegistry::loadCategory('schemas');
     foreach ($schemaPlugins as $schemaPlugin) {
         $schema =& $schemaPlugin->getSchema();
         $schemaId = $schema->getSchemaId();
         foreach ($schemaPlugin->getFieldList() as $fieldName) {
             if (isset($fieldNames[$schemaId]) && in_array($fieldName, (array) $fieldNames[$schemaId])) {
                 $field =& $this->fieldDao->buildField($fieldName, $schemaPlugin->getName());
                 $fieldIds[] = $field->getFieldId();
                 $fields[$schemaPlugin->getName()][] = $fieldName;
                 unset($field);
             }
         }
         unset($schema);
     }
     // Check whether the field list has changed
     $oldFields =& $this->searchFormElementDao->getFieldsBySearchFormElement($this->searchFormElementId);
     $oldFieldIds = array();
     while ($oldField =& $oldFields->next()) {
         $oldFieldIds[] = $oldField->getFieldId();
         unset($oldField);
     }
     $fieldsChanged = count(array_diff($oldFieldIds, $fieldIds)) != 0 || count(array_diff($fieldIds, $oldFieldIds)) != 0;
     // If the fields changed, save them and mark the element unclean
     if ($fieldsChanged) {
         $this->searchFormElementDao->setSearchFormElementFields($searchFormElement->getSearchFormElementId(), $fieldIds);
         $searchFormElement->setIsClean(false);
         $this->searchFormElementDao->updateSearchFormElement($searchFormElement);
     }
     // Recalculate the range if necessary
     $rangeStart = null;
     $rangeEnd = null;
     if ($searchFormElement->getType() == SEARCH_FORM_ELEMENT_TYPE_DATE && $this->getData('recalculateRange')) {
         $archiveDao =& DAORegistry::getDAO('ArchiveDAO');
         $recordDao =& DAORegistry::getDAO('RecordDAO');
         $archives =& $archiveDao->getArchives();
         while ($archive =& $archives->next()) {
             import('classes.sortOrder.SortOrderDAO');
             $schemaPluginName = $archive->getSchemaPluginName();
             if (isset($fields[$schemaPluginName])) {
                 $schemaFields =& $fields[$schemaPluginName];
                 $schemaPlugin =& $archive->getSchemaPlugin();
                 $records =& $recordDao->getRecords($archive->getArchiveId());
                 while ($record =& $records->next()) {
                     foreach ($schemaFields as $fieldName) {
                         $fieldValue = $schemaPlugin->getFieldValue($record, $fieldName, SORT_ORDER_TYPE_STRING);
                         if ($rangeStart === null || strcmp($rangeStart, $fieldValue) > 0) {
                             $rangeStart = $fieldValue;
                         }
                         if ($rangeEnd === null || strcmp($rangeEnd, $fieldValue) < 0) {
                             $rangeEnd = $fieldValue;
                         }
                     }
                     unset($record);
                 }
                 unset($records, $schemaFields, $schemaPlugin);
             }
             unset($archive, $schemaPlugin);
         }
         $searchFormElement->setRangeStart($rangeStart);
         $searchFormElement->setRangeEnd($rangeEnd);
         $this->searchFormElementDao->updateSearchFormElement($searchFormElement);
     } elseif ($searchFormElement->getType() == SEARCH_FORM_ELEMENT_TYPE_SELECT && $this->getData('recalculateOptions')) {
         $archiveDao =& DAORegistry::getDAO('ArchiveDAO');
         $recordDao =& DAORegistry::getDAO('RecordDAO');
         $archives =& $archiveDao->getArchives();
         while ($archive =& $archives->next()) {
             import('classes.sortOrder.SortOrderDAO');
             $schemaPluginName = $archive->getSchemaPluginName();
             if (isset($fields[$schemaPluginName])) {
                 $schemaFields =& $fields[$schemaPluginName];
                 $schemaPlugin =& $archive->getSchemaPlugin();
                 $records =& $recordDao->getRecords($archive->getArchiveId());
                 while ($record =& $records->next()) {
                     foreach ($schemaFields as $fieldName) {
                         $fieldValue = $schemaPlugin->getFieldValue($record, $fieldName, SORT_ORDER_TYPE_STRING);
                         if (!$this->searchFormElementDao->searchFormElementOptionExists($this->searchFormElementId, $fieldValue)) {
                             $this->searchFormElementDao->insertSearchFormElementOption($this->searchFormElementId, $fieldValue);
                         }
                     }
                     unset($record);
                 }
                 unset($records, $schemaFields, $schemaPlugin);
             }
             unset($archive, $schemaPlugin);
         }
     }
 }