/** * Get Set details from Cache or DB * * @access private * @param int set id * @return array */ private function _get_set($set_id) { // -------------------------------------- // We're search by either ID or name // -------------------------------------- $attr = is_numeric($set_id) ? 'set_id' : 'set_name'; // -------------------------------------- // Get sets from cache, init set to return // -------------------------------------- $sets = array_filter((array) low_get_cache(LOW_REORDER_PACKAGE, 'sets')); $set = array(); // -------------------------------------- // Loop thru cache and search for attr // -------------------------------------- foreach ($sets as $row) { if ($row[$attr] == $set_id) { $this->_log('Retrieving set from cache'); $set = $row; break; } } // -------------------------------------- // If no set was found, query DB // -------------------------------------- if (empty($set)) { $this->_log('Retrieving set from database'); // Get set and its orders for each category $query = ee()->db->select(array('s.set_id', 's.set_name', 's.channels', 's.cat_option', 's.cat_groups', 's.parameters', 'o.cat_id', 'o.sort_order'))->from(ee()->low_reorder_set_model->table() . ' s')->join(ee()->low_reorder_order_model->table() . ' o', 's.set_id = o.set_id')->where('s.' . $attr, $set_id)->where_in('s.site_id', ee()->TMPL->site_ids)->get(); // Get the first row to initiate the set if ($set = $query->row_array()) { // Decode some attributes $set['channels'] = low_delinearize($set['channels']); $set['cat_groups'] = low_delinearize($set['cat_groups']); $set['parameters'] = ee()->low_reorder_set_model->get_params($set['parameters']); // Uncategorized entries if ($set['cat_option'] == 'none') { $set['parameters']['uncategorized_entries'] = 'yes'; } // Clean up what we don't need now unset($set['cat_id'], $set['sort_order']); // Instead, add all orders to the set per category id foreach ($query->result() as $row) { $set[$row->cat_id] = low_delinearize($row->sort_order); } // Add the set to all the sets $sets[] = $set; } // Register new sets array to cache low_set_cache(LOW_REORDER_PACKAGE, 'sets', $sets); } // -------------------------------------- // Set the current set ID // -------------------------------------- $this->set_id = (int) @$set['set_id']; // Return the requested set return $set; }
/** * List entries for single channel/field combo * * @access public * @return string */ public function reorder() { // -------------------------------------- // Get Set id // -------------------------------------- if (!($set_id = ee()->input->get('set_id'))) { return $this->_show_error('invalid_request'); } if (!($set = ee()->low_reorder_set_model->get_one($set_id))) { show_error('Reorder set not found'); } // -------------------------------------- // Get settings // -------------------------------------- $params = ee()->low_reorder_set_model->get_params($set['parameters']); $perm = ee()->low_reorder_set_model->get_permissions($set['permissions']); // -------------------------------------- // Change channels to array // -------------------------------------- $set['channels'] = low_delinearize($set['channels']); $set['cat_groups'] = low_delinearize($set['cat_groups']); // -------------------------------------- // Pre-define some variables for the view // -------------------------------------- $this->data['show_entries'] = TRUE; $this->data['select_category'] = FALSE; // -------------------------------------- // Get selected category, if there is one // -------------------------------------- if (($set['cat_id'] = ee()->input->get('category')) === FALSE) { $set['cat_id'] = 0; } // -------------------------------------- // If cat_option == 'one', a category must be selected first // And we need to get a list of categories to put in the // category selection drop down // -------------------------------------- if ($set['cat_option'] == 'one' && !empty($set['cat_groups'])) { // Showing entries depends on selected category $this->data['show_entries'] = $set['cat_id'] > 0; $this->data['select_category'] = TRUE; $this->data['selected_category'] = $set['cat_id']; // Limit query to selected category $params['category'] = $set['cat_id']; // Load categories API ee()->load->library('api'); ee()->api->instantiate('channel_categories'); // get group details from DB $query = ee()->db->select('group_id, group_name, sort_order')->from('category_groups')->where_in('group_id', $set['cat_groups'])->order_by('group_name', 'asc')->get(); $this->data['category_groups'] = $query->result_array(); $this->data['total_groups'] = $query->num_rows(); // Loop through groups and get the category group from API foreach ($this->data['category_groups'] as &$row) { ee()->api_channel_categories->categories = array(); ee()->api_channel_categories->category_tree($row['group_id'], '', $row['sort_order']); $row['categories'] = ee()->api_channel_categories->categories; } $this->data['url'] = $this->base_url . AMP . 'method=reorder' . AMP . 'set_id=' . $set_id . AMP . 'category='; } elseif ($set['cat_option'] == 'none') { // Make sure only uncategorized entries will be fetched $params['uncategorized_entries'] = 'yes'; } // -------------------------------------- // If we're showing entries, get them first // -------------------------------------- if ($this->data['show_entries']) { // Get the current order from the DB ee()->db->where('cat_id', $set['cat_id']); $order = ee()->low_reorder_order_model->get_one($set_id, 'set_id'); $set_order = empty($order) ? array() : low_delinearize($order['sort_order']); // Add channel_id as parameter $params['channel_id'] = implode('|', $set['channels']); // Get 'em, sonny boy $entries = $this->get_entries($params, $set_order); // Edit entry url $edit_tmpl = '<a href="' . BASE . '&C=content_publish&M=entry_form&channel_id=%s&entry_id=%s">%s</a>'; // Loop through row, add stuff foreach ($entries as &$row) { // Escape title $row['title'] = htmlspecialchars($row['title']); // Add default hidden divs $row['hidden'] = array(sprintf($edit_tmpl, $row['channel_id'], $row['entry_id'], lang('edit')), ucfirst($row['status']), '#' . $row['entry_id']); } // ------------------------------------- // 'low_reorder_show_entries' hook. // - Change the output of entries displayed in the CP reorder list // ------------------------------------- if (ee()->extensions->active_hook('low_reorder_show_entries') === TRUE) { $entries = ee()->extensions->call('low_reorder_show_entries', $entries, $set); } $this->data['entries'] = $entries; } // Add settings to data as well $this->data['set'] = $set; $this->data['params'] = $params; // -------------------------------------- // Add extra nav item if permitted // -------------------------------------- if ($set_id && $perm['can_edit']) { $this->extra_nav['edit_set'] = $this->base_url . AMP . 'method=edit&set_id=' . $set_id; } // -------------------------------------- // Set title and breadcrumb // -------------------------------------- $this->_set_cp_var('cp_page_title', $set['set_label']); ee()->cp->set_breadcrumb($this->base_url, lang('low_reorder_module_name')); // Return settings form return $this->view('mcp_reorder'); }
/** * Update routines for version 2.0b1 * * @access private * @return void */ private function _v20b1() { // -------------------------------------- // Install new tables // -------------------------------------- ee()->low_reorder_set_model->install(); ee()->low_reorder_order_model->install(); // -------------------------------------- // Get all current records from settings // -------------------------------------- $query = ee()->db->get('low_reorder_settings'); $rows = $query->result_array(); // Return if no settings exist if (!empty($rows)) { // Upgrading from EE1 if (!isset($rows[0]['channel_id'])) { foreach ($rows as &$r) { $r['channel_id'] = $r['weblog_id']; } } // -------------------------------------- // Get Field, Channel and Status details // -------------------------------------- // Fields $query = ee()->db->select('field_id, site_id, field_name, field_label, field_instructions')->from('channel_fields')->where_in('field_id', low_flatten_results($rows, 'field_id'))->get(); $fields = low_associate_results($query->result_array(), 'field_id'); // Channels $query = ee()->db->select('channel_id, channel_name, channel_title, cat_group')->from('channels')->where_in('channel_id', low_flatten_results($rows, 'channel_id'))->get(); $channels = low_associate_results($query->result_array(), 'channel_id'); // Statuses $query = ee()->db->select('status_id, status')->from('statuses')->get(); $statuses = low_flatten_results($query->result_array(), 'status', 'status_id'); // -------------------------------------- // Loop through rows and populate new table // -------------------------------------- foreach ($rows as $row) { // Skip non-existent channels or fields if (!(isset($channels[$row['channel_id']]) && isset($fields[$row['field_id']]))) { continue; } // Shortcut to related channel and field $channel = $channels[$row['channel_id']]; $field = $fields[$row['field_id']]; // Decode the settings $settings = decode_reorder_settings($row['settings']); // Initiate parameter array $params = array(); // -------------------------------------- // Set Channel parameter // -------------------------------------- $params['channel'] = $channels[$row['channel_id']]['channel_name']; // -------------------------------------- // Set Category parameter // -------------------------------------- if (!empty($settings['categories'])) { $params['category'] = implode('|', array_filter($settings['categories'])); } // -------------------------------------- // Set Status parameter // -------------------------------------- if (!empty($settings['statuses'])) { $tmp = array(); foreach ($settings['statuses'] as $status_id) { $tmp[] = $statuses[$status_id]; } $params['status'] = implode('|', array_unique($tmp)); unset($tmp); } // -------------------------------------- // Set Show Expired parameter // -------------------------------------- if (!empty($settings['show_expired']) && ($settings['show_expired'] == 'y' or $settings['show_expired'] === TRUE)) { $params['show_expired'] = 'yes'; } // -------------------------------------- // Set Show Future Entries parameter // -------------------------------------- if (!empty($settings['show_future']) && ($settings['show_future'] == 'y' or $settings['show_future'] === TRUE)) { $params['show_future_entries'] = 'yes'; } // -------------------------------------- // Get permissions from settings // -------------------------------------- $permissions = !empty($settings['permissions']) ? low_array_encode($settings['permissions']) : ''; // -------------------------------------- // Set Category Option value // -------------------------------------- $cat_option = $settings['category_options']; // -------------------------------------- // Set Category Groups value, if option is 'one' // -------------------------------------- if ($cat_option == 'one' && $channel['cat_group']) { $cat_groups = low_linearize(explode('|', $channel['cat_group'])); } else { $cat_groups = ''; } // -------------------------------------- // Set clear_cache value // -------------------------------------- $clear_cache = !empty($settings['clear_cache']) && $settings['clear_cache'] == 'n' ? 'n' : 'y'; // -------------------------------------- // Sort order setting // -------------------------------------- $reverse = @$settings['sort_order'] == 'desc'; // -------------------------------------- // Insert new row // -------------------------------------- $set_id = ee()->low_reorder_set_model->insert(array('site_id' => $field['site_id'], 'set_label' => $channel['channel_title'] . ', ' . $field['field_label'], 'set_notes' => $field['field_instructions'], 'new_entries' => $reverse ? 'prepend' : 'append', 'clear_cache' => $clear_cache, 'channels' => low_linearize(array($row['channel_id'])), 'cat_option' => $cat_option, 'cat_groups' => $cat_groups, 'parameters' => low_array_encode($params), 'permissions' => $permissions)); // -------------------------------------- // Get current values // -------------------------------------- ee()->db->select("GROUP_CONCAT(DISTINCT d.entry_id ORDER BY d.field_id_{$field['field_id']} ASC SEPARATOR '|') AS entries", FALSE)->from('channel_data d')->where('d.channel_id', $channel['channel_id'])->where("d.field_id_{$field['field_id']} !=", ''); if ($cat_option != 'one') { ee()->db->select("'0' AS cat_id", FALSE); } else { ee()->db->select('cp.cat_id')->from('category_posts cp')->where('d.entry_id = cp.entry_id')->group_by('cat_id'); } $query = ee()->db->get(); foreach ($query->result() as $row) { $entries = low_delinearize($row->entries); if ($reverse) { $entries = array_reverse($entries); } ee()->low_reorder_order_model->insert(array('set_id' => $set_id, 'cat_id' => $row->cat_id, 'sort_order' => low_linearize($entries))); } } } // end if $rows // -------------------------------------- // Change low_reorder fieldtype to text // -------------------------------------- ee()->db->where('field_type', $this->package); ee()->db->update('channel_fields', array('field_type' => 'text', 'field_settings' => low_array_encode(array('field_content_type' => 'text')))); // -------------------------------------- // Remove low_reorder fieldtype // -------------------------------------- ee()->db->where('name', $this->package); ee()->db->delete('fieldtypes'); // -------------------------------------- // Drop old table // -------------------------------------- ee()->db->query("DROP TABLE IF EXISTS `exp_low_reorder_settings`"); // -------------------------------------- // Enable extension // -------------------------------------- foreach ($this->hooks as $hook) { $this->_add_hook($hook); } }