diff --git a/assets/order_entries.publish.js b/assets/order_entries.publish.js index 2933606..1cac9d6 100644 --- a/assets/order_entries.publish.js +++ b/assets/order_entries.publish.js @@ -39,7 +39,11 @@ // Process sort order oldSorting = getState(); - startValue = parseInt(table.find('.order-entries-item').eq(0).text(),10); + if (table.find('.order-entries-item').length > 0){ + startValue = parseInt(table.find('.order-entries-item').eq(0).text(),10); + } else { + startValue = parseInt(table.find('tbody tr').eq(0).data('order'),10); + } var assumedStartValue = Symphony.Context.get('env').pagination['max-rows'] * (Symphony.Context.get('env').pagination['current'] - 1) + 1; if (startValue == 0 || direction == 'asc' && startValue < assumedStartValue) { startValue = assumedStartValue; @@ -68,15 +72,17 @@ oldSorting = newSorting; // Update indexes - var items = table.find('.order-entries-item'); + var items = table.find('tbody tr'); items.each(function(index) { if(direction == 'asc') { - $(this).text(index + startValue); + $(this).data('order',index + startValue); + $(this).find('.order-entries-item').text(index + startValue); } else { var largest = startValue; if ( items.length > largest ) largest = items.length; - $(this).text(largest - index); + $(this).data('order',largest - index); + $(this).find('.order-entries-item').text(largest - index); } }); }, diff --git a/extension.driver.php b/extension.driver.php index f282882..906e0dc 100644 --- a/extension.driver.php +++ b/extension.driver.php @@ -140,6 +140,23 @@ public function adjustTable($context) { if($this->force_sort == 'yes') { $table->setAttribute('data-order-entries-force', 'true'); } + + $field = FieldManager::fetch($this->field_id); + + if ($field && $field->get('show_column') == 'no'){ + + // sort order is not provided by field, so add manually + $tbody = $table->getChildByName('tbody',0); + + //not looping as only the first row is required for sorting and is far more efficient + $tr = $tbody->getChildByName('tr',0); + + $entry_id = str_replace('id-', '', $tr->getAttribute('id')); + $entry = current(EntryManager::fetch($entry_id)); + $data = $entry->getData($this->field_id); + $order = $field->getParameterPoolValue($data); + $tr->setAttribute('data-order',$order); + } break; } diff --git a/extension.meta.xml b/extension.meta.xml index 9d1c22e..0a68860 100644 --- a/extension.meta.xml +++ b/extension.meta.xml @@ -18,10 +18,14 @@ - + + - Added filtered ordering + - Bug fixes + + - Fix entry selection - + - Add contextual Ordering using backend/frontend filters - Add Disable Pagination Option diff --git a/fields/field.order_entries.php b/fields/field.order_entries.php index 91a331d..83f5314 100644 --- a/fields/field.order_entries.php +++ b/fields/field.order_entries.php @@ -41,26 +41,15 @@ function processRawFieldData($data, &$status, &$message = null, $simulate = fals $status = self::__OK__; $increment_subsequent_order = false; - $filters = Symphony::Database()->fetchCol('Field',"SHOW COLUMNS FROM tbl_entries_data_{$this->get('id')} WHERE Field like 'field_%';"); - // for now if there are any filters completely ignore any override. - if (!empty($filters)){ - $filterString = implode(',', $filters); - $current_values = Symphony::Database()->fetch(" - SELECT value, {$filterString} - FROM tbl_entries_data_{$this->get('id')} - WHERE entry_id=".$entry_id." - "); - $result= array(); - foreach ($current_values as $key => $row) { - foreach ($row as $col => $value) { - $result[$col][$key] = $value; - } - } - return $result; + $filters = Symphony::Database()->fetchCol('Field', + "SHOW COLUMNS FROM tbl_entries_data_{$this->get('id')} WHERE Field like 'field_%';" + ); + + if ($entry_id != null) { + $entry_id = General::intval($entry_id); } if($entry_id) { - $new_value = $data; $current_value = Symphony::Database()->fetchVar("value", 0, " SELECT value @@ -218,11 +207,16 @@ private function updateFilterTable(){ //change the value format to match the filtered fields stored foreach ($currentFilters as $key => $value) { - $currentFilters[$key] = substr($value, 6); + $currentFilter = substr($value, 6); + if (!empty($currentFilter)) { + $currentFilters[$key] = $currentFilter; + } else { + unset($currentFilters[$key]); + } } - $newFilters = array_diff($filteredFields, $currentFilters); - $removedFilters = array_diff($currentFilters, $filteredFields); + $newFilters = array_filter(array_diff($filteredFields, $currentFilters)); + $removedFilters = array_filter(array_diff($currentFilters, $filteredFields)); foreach ($removedFilters as $key => $field_id) { Symphony::Database()->query("ALTER TABLE `tbl_entries_data_{$orderFieldId}` DROP COLUMN `field_{$field_id}`"); @@ -231,7 +225,6 @@ private function updateFilterTable(){ foreach ($newFilters as $key => $field_id) { //maybe in the future fields can give supported filters until then using a varchar for flexibility $fieldtype = "varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL"; - Symphony::Database()->query("ALTER TABLE `tbl_entries_data_{$orderFieldId}` ADD COLUMN `field_{$field_id}`{$fieldtype}"); } @@ -409,7 +402,9 @@ private function getOrderValue($data){ $filterableFields = $this->get('filtered_fields'); //there are no filters to apply so should just be a single value - if (empty($filterableFields)) return $data['value']; + if (empty($filterableFields)) { + return $data['value']; + } $filterableFields = explode(',', $filterableFields); $section_id = $this->get('parent_section'); @@ -417,6 +412,10 @@ private function getOrderValue($data){ $orderEntriesExtension = ExtensionManager::create('order_entries'); $filters = $orderEntriesExtension->getFilters($filterableFields,$section_id); + // if there are no filter, bail out + if (empty($filters)) { + return $data['value']; + } if (!is_array($data['value'])){ foreach ($data as $key => $value) { @@ -448,7 +447,7 @@ private function getOrderValue($data){ if ( empty($keys) ){ //this view is not sorted - return 0; + return current($data['value']); } else { return $data['value'][current($keys)]; }