diff --git a/ee1/language/english/lang.vz_members.php b/ee1/language/english/lang.vz_members.php index 8b85d74..470edbc 100755 --- a/ee1/language/english/lang.vz_members.php +++ b/ee1/language/english/lang.vz_members.php @@ -4,8 +4,8 @@ 'mode_label' => 'Selection mode:', 'mode_label_cell' => 'Mode', -'mode_single' => 'Allow only one member at a time', -'mode_multiple' => 'Allow multiple members to be selected', +'mode_single' => 'Allow only one member', +'mode_multiple' => 'Allow multiple members', 'member_groups_label' => 'Allow members from these groups:', 'member_groups_label_cell' => 'Allowed groups', diff --git a/ee2/thirdparty/vz_members/ft.vz_members.php b/ee2/thirdparty/vz_members/ft.vz_members.php index e4816ff..cfd3c58 100644 --- a/ee2/thirdparty/vz_members/ft.vz_members.php +++ b/ee2/thirdparty/vz_members/ft.vz_members.php @@ -1,95 +1,127 @@ - * @copyright Copyright (c) 2009-2010 Eli Van Zoeren * @license http://creativecommons.org/licenses/by-sa/3.0/ Attribution-Share Alike 3.0 Unported - * Some small bits of code here and there were borrowed from the - * Checkbox Group fieldtype included with FieldFrame. */ -class Vz_members extends Fieldframe_Fieldtype { +class Vz_members_ft extends EE_Fieldtype { - /** - * Fieldtype Info - * @var array - */ - var $info = array( + public $info = array( 'name' => 'VZ Members', 'version' => '0.99', - 'desc' => 'Select members from one or more member groups', - 'docs_url' => 'http://elivz.com/blog/single/vz_members/', - 'versions_xml_url' => 'http://elivz.com/files/versions.xml' - ); - - var $requires = array( - 'ff' => '1.3.4', - 'cp_jquery' => '1.1.1', - ); - - var $default_site_settings = array(); - - var $default_field_settings = array( - 'member_groups' => array(), - 'mode' => 'multiple' ); - var $default_cell_settings = array( + /** + * Fieldtype Constructor + * + */ + function Vz_members_ft() + { + parent::EE_Fieldtype(); + + // Initialize the cache + if (!isset($this->EE->session->cache['vz_members'])) + { + $this->EE->session->cache['vz_members'] = array(); + } + $this->cache =& $this->EE->session->cache['vz_members']; + } + + + /** + * Install Fieldtype + * + */ + function install() + { + // Default field settings + return array( + 'member_groups' => array(), + 'mode' => 'multiple' + ); + } + + public $default_cell_settings = array( 'member_groups' => array(), 'mode' => 'single' ); - var $modes = array( - 'single' => 'mode_single', - 'multiple' => 'mode_multiple' - ); + protected function modes() + { + $this->EE->lang->loadfile('vz_members'); + + return array( + 'single' => $this->EE->lang->line('mode_single'), + 'multiple' => $this->EE->lang->line('mode_multiple') + ); + } + - /** * Member Groups Select */ - function _member_groups_select($selected_groups) + private function _get_member_groups() { - global $DB, $DSP; - // Get the available member groups - $member_groups = $DB->query("SELECT group_title, group_id FROM exp_member_groups WHERE site_id = 1"); - - // Construct the select list of member groups - $r = $DSP->input_select_header('member_groups[]', 'y', ($member_groups->num_rows < 10 ? $member_groups->num_rows : 10)); - foreach($member_groups->result as $member_group) + if (!isset( $this->cache['groups']['all'] )) { - $selected = in_array($member_group['group_id'], $selected_groups) ? 1 : 0; - $r .= $DSP->input_select_option($member_group['group_id'], $member_group['group_title'], $selected); + $member_groups = array(); + $result = $this->EE->db->query(" + SELECT group_title, group_id + FROM exp_member_groups + WHERE site_id = 1 + ")->result_array(); + + // We need it in key-value form for the select helper functions + foreach ($result as $item) + { + $member_groups[array_pop($item)] = array_pop($item); + } + $this->cache['groups']['all'] = $member_groups; } - $r .= $DSP->input_select_footer(); - return $r; + return $this->cache['groups']['all']; } - - /** - * Display Field Settings - */ - function display_field_settings($field_settings) - { - // Initialize a new instance of SettingsDisplay - $SD = new Fieldframe_SettingsDisplay(); + + /** + * Create the settings ui + */ + private function _get_settings($settings) + { + $this->EE->lang->loadfile('vz_members'); + $this->EE->load->helper('form'); - $cell1 = $SD->label('mode_label') - . $SD->select('mode', $field_settings['mode'], $this->modes); + $mode = isset($settings['mode']) ? $settings['mode'] : 0; + $row1 = array( + $this->EE->lang->line('mode_label_cell'), + form_dropdown('mode', $this->modes(), $mode) + ); + + $member_groups = isset($settings['member_groups']) ? $settings['member_groups'] : 0; + $row2 = array( + $this->EE->lang->line('member_groups_label_cell'), + form_multiselect('member_groups[]', $this->_get_member_groups(), $member_groups) + ); + + return array( $row1, $row2 ); + } - $cell2 = $r = $SD->label('member_groups_label') - . $this->_member_groups_select($field_settings['member_groups']); - - return array('cell1' => $cell1, 'cell2' => $cell2); - } + + /** + * Display Field Settings + */ + function display_settings($field_settings) + { + $settings_array = $this->_get_settings($field_settings); + + $this->EE->table->add_row($settings_array[0]); + $this->EE->table->add_row($settings_array[1]); + } /** @@ -97,17 +129,7 @@ function display_field_settings($field_settings) */ function display_cell_settings($cell_settings) { - global $DSP, $LANG; - $SD = new Fieldframe_SettingsDisplay(); - - return '' - . ''; + return $this->_get_settings($cell_settings); } @@ -116,41 +138,43 @@ function display_cell_settings($cell_settings) */ function _create_user_list($field_name, $selected_members, $member_groups, $mode) { - global $DB, $DSP, $LANG; + $this->EE->load->helper('form'); // If there are no member groups selected, don't bother - if (!$member_groups) + if (empty($member_groups)) { - return $DSP->qdiv('highlight_alt', $LANG->line('no_member_groups')); + $this->EE->lang->loadfile('vz_members'); + return '
' . $this->EE->lang->line('no_member_groups') . '
'; } - // Flatten the list of members to csv + // Flatten the list of member groups csv if (is_array($member_groups)) { $member_groups = implode(',', $member_groups); } - - // Initialize a new instance of SettingsDisplay - $SD = new Fieldframe_SettingsDisplay(); // Get the members in the selected member groups - $query = $DB->query(" - SELECT - exp_members.member_id AS member_id, - exp_members.screen_name AS screen_name, - exp_member_groups.group_title AS group_title, - exp_member_groups.group_id AS group_id - FROM - exp_members - INNER JOIN - exp_member_groups - ON - exp_members.group_id = exp_member_groups.group_id - WHERE - exp_member_groups.group_id IN ($member_groups) AND exp_member_groups.site_id = 1 - ORDER BY - exp_member_groups.group_id ASC, exp_members.screen_name ASC - "); + if ( !isset($this->cache['in_groups'][$member_groups]) ) + { + $this->cache['in_groups'][$member_groups] = $this->EE->db->query(" + SELECT + exp_members.member_id AS member_id, + exp_members.screen_name AS screen_name, + exp_member_groups.group_title AS group_title, + exp_member_groups.group_id AS group_id + FROM + exp_members + INNER JOIN + exp_member_groups + ON + exp_members.group_id = exp_member_groups.group_id + WHERE + exp_member_groups.group_id IN ($member_groups) AND exp_member_groups.site_id = 1 + ORDER BY + exp_member_groups.group_id ASC, exp_members.screen_name ASC + ")->result_array(); + } + $members = $this->cache['in_groups'][$member_groups]; $r = ''; $current_group = 0; @@ -158,34 +182,38 @@ function _create_user_list($field_name, $selected_members, $member_groups, $mode if ($mode == 'single') { // Get the first selected member if there are more than one - if (is_array($selected_members)) $selected_members = array_shift($selected_members); + if (is_array($selected_members)) + { + $selected_members = array_shift($selected_members); + } - $r = $DSP->input_select_header($field_name); - $selected = (!$selected_members) ? 1 : 0; - $r .= $DSP->input_select_option('', '—', $selected) . NL; - foreach($query->result AS $member) + // Construct the select box markup + $r = ''; } - else + else // Multi-select mode { - foreach($query->result AS $member) + foreach ($members as $member) { // If we are moving on to a new group if ($current_group != $member['group_id']) @@ -195,7 +223,7 @@ function _create_user_list($field_name, $selected_members, $member_groups, $mode // Output the group header $r .= '
'; - $r .= $SD->label(''.$member['group_title'].':'); + $r .= '
'.$member['group_title'].':
'; } // Is it selected? @@ -209,14 +237,30 @@ function _create_user_list($field_name, $selected_members, $member_groups, $mode } // Output the checkbox - $r .= ' '; + $r .= ''; } // Fool the form into working - $r .= $DSP->input_hidden($field_name.'[]', 'temp'); + $r .= form_hidden($field_name.'[]', 'temp'); + + // Make it pretty + $this->EE->cp->add_to_head(''); + $this->EE->cp->add_to_foot(''); // Clear the floats $r .= '
'; @@ -269,23 +313,25 @@ function save_cell($cell_data, $cell_settings) */ function _get_member_names($members, $orderby, $sort) { - global $DB; - // Prepare parameters for SQL query $member_list = (is_array($members)) ? implode(',', $members) : $members; if (!$member_list) $member_list = -1; $sort = (strtolower($sort) == 'desc') ? 'DESC' : 'ASC'; $orderby = ($orderby == 'username' || $orderby == 'screen_name' || $orderby == 'group_id') ? $orderby : 'member_id'; - // Get the names of the members - $query = $DB->query(" - SELECT member_id, group_id, username, screen_name - FROM exp_members - WHERE member_id IN ($member_list) - ORDER BY $orderby $sort - "); + // Only hit the database once per pageload + if ( !isset($this->cache['members'][$member_list][$orderby][$sort]) ) + { + // Get the names of the members + $this->cache['members'][$member_list][$orderby][$sort] = $this->EE->db->query(" + SELECT member_id, group_id, username, screen_name + FROM exp_members + WHERE member_id IN ($member_list) + ORDER BY $orderby $sort + ")->result_array(); + } - return $query->result; + return $this->cache['members'][$member_list][$orderby][$sort]; } /** @@ -298,7 +344,7 @@ function display_tag($params, $tagdata, $field_data, $field_settings) if (is_array($field_data)) { // Multiple members are selected - $separator = ($params['separator']) ? $params['separator'] : '|'; + $separator = isset($params['separator']) ? $params['separator'] : '|'; return implode($separator, $field_data); } else @@ -338,7 +384,7 @@ function display_tag($params, $tagdata, $field_data, $field_settings) } // Backsapce parameter - if ($params['backspace']) + if (isset($params['backspace'])) { $r = substr($r, 0, -$params['backspace']); } @@ -363,17 +409,18 @@ function names($params, $tagdata, $field_data, $field_settings) } // Output the list - $separator = ($params['separator']) ? $params['separator'] : ', '; + $separator = isset($params['separator']) ? $params['separator'] : ', '; return implode($separator, $member_names); } /** - * is_allowed + * Checks the intersection between the selected members and a + * member or list of members */ function is_allowed($params, $tagdata, $field_data, $field_settings) { - global $DB; + global $DB, $SESS; $allowed = is_array($field_data) ? $field_data : array($field_data); $candidates = explode('|', $params['members']); @@ -381,21 +428,22 @@ function is_allowed($params, $tagdata, $field_data, $field_settings) if ( isset($params['groups']) ) { // Get all the users in those groups - $supers = $DB->query(" - SELECT member_id, group_id - FROM exp_members - WHERE group_id IN (".$params['groups'].") - "); + if ( !isset($this->cache['groups'][$params['groups']]) ) + { + $this->cache['groups'][$params['groups']] = $this->EE->db->query(" + SELECT member_id + FROM exp_members + WHERE group_id IN (".$params['groups'].") + ")->result_array(); + } + $supers = $this->cache['groups'][$params['groups']]; // Separate out the member_ids - foreach ($supers->result as $super) + foreach ($supers as $super) { $candidates[] = $super['member_id']; } } - - // Remove duplicates - $candidates = array_unique($candidates); // Are there any matches between the two? $isAllowed = count(array_intersect($candidates, $allowed)); @@ -412,5 +460,4 @@ function is_allowed($params, $tagdata, $field_data, $field_settings) } - /* End of file ft.vz_members.php */ \ No newline at end of file diff --git a/ee2/thirdparty/vz_members/language/english/lang.vz_members.php b/ee2/thirdparty/vz_members/language/english/lang.vz_members.php index 66b1c49..989b0c1 100755 --- a/ee2/thirdparty/vz_members/language/english/lang.vz_members.php +++ b/ee2/thirdparty/vz_members/language/english/lang.vz_members.php @@ -1,12 +1,14 @@ 'Selection mode:', -'mode_single' => 'Allow only one member at a time', -'mode_multiple' => 'Allow multiple members to be selected', +'mode_label_cell' => 'Mode', +'mode_single' => 'Allow only one member', +'mode_multiple' => 'Allow multiple members', -'member_groups_label' => 'Show members from these groups:', +'member_groups_label' => 'Allow members from these groups:', +'member_groups_label_cell' => 'Allowed groups', 'no_member_groups' => 'There are no member groups selected',