Merge pull request #2636 from Dragooon/ticket/12759

[ticket/12759] Resolve query flooding while displaying large number of custom profile fields

* Dragooon/ticket/12759:
  [ticket/12759] Fix type_bool and type_dropdown's UCP fields
  [ticket/12759] Remove lang_helper from profilefields_manager
  [ticket/12759] Cache all lang_options in lang_helper instead
  [ticket/12759] Extra line in profilefields_manager
  [ticket/12759] Cache lang_options for pm_viewmessage
  [ticket/12759] Cache lang_options on memberlist
  [ticket/12759] Add phpDoc comments to explain get_option_lang
  [ticket/12759] Little code cleanup
  [ticket/12759] Make sure $field_id has unique elements
  [ticket/12759] Cache the lang options earlier
  [ticket/12759] Cache lang options for all fields while displaying
  [ticket/12759] Allow multiple fields to be loaded via get_option_lang
This commit is contained in:
Joas Schilling 2014-06-27 15:20:21 +02:00
commit b0286bf854
3 changed files with 55 additions and 34 deletions

View file

@ -49,43 +49,50 @@ class lang_helper
} }
/** /**
* Get language entries for options and store them here for later use * Loads preview options into language entries for options
*
* @param int $field_id
* @param int $lang_id
* @param mixed $preview_options
*/ */
public function get_option_lang($field_id, $lang_id, $field_type, $preview_options) public function load_preview_options($field_id, $lang_id, $preview_options)
{ {
if ($preview_options !== false) $lang_options = (!is_array($preview_options)) ? explode("\n", $preview_options) : $preview_options;
{
$lang_options = (!is_array($preview_options)) ? explode("\n", $preview_options) : $preview_options;
foreach ($lang_options as $num => $var) foreach ($lang_options as $num => $var)
{
if (!isset($this->options_lang[$field_id]))
{
$this->options_lang[$field_id] = array();
}
if (!isset($this->options_lang[$field_id][$lang_id]))
{
$this->options_lang[$field_id][$lang_id] = array();
}
$this->options_lang[$field_id][$lang_id][($num + 1)] = $var;
}
}
else
{ {
$sql = 'SELECT option_id, lang_value if (!isset($this->options_lang[$field_id]))
{
$this->options_lang[$field_id] = array();
}
if (!isset($this->options_lang[$field_id][$lang_id]))
{
$this->options_lang[$field_id][$lang_id] = array();
}
$this->options_lang[$field_id][$lang_id][($num + 1)] = $var;
}
}
/**
* Fetches language entries for options from DB
*
* @param int $lang_id
*/
public function load_option_lang($lang_id)
{
$sql = 'SELECT field_id, option_id, lang_value
FROM ' . $this->language_table . ' FROM ' . $this->language_table . '
WHERE field_id = ' . (int) $field_id . ' WHERE lang_id = ' . (int) $lang_id . "
AND lang_id = ' . (int) $lang_id . "
AND field_type = '" . $this->db->sql_escape($field_type) . "'
ORDER BY option_id"; ORDER BY option_id";
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result)) $result = $this->db->sql_query($sql);
{
$this->options_lang[$field_id][$lang_id][($row['option_id'] + 1)] = $row['lang_value']; while ($row = $this->db->sql_fetchrow($result))
} {
$this->db->sql_freeresult($result); $this->options_lang[$row['field_id']][$lang_id][($row['option_id'] + 1)] = $row['lang_value'];
} }
$this->db->sql_freeresult($result);
} }
/** /**

View file

@ -155,7 +155,7 @@ class type_bool extends type_base
if (!$this->lang_helper->is_set($field_id, $lang_id)) if (!$this->lang_helper->is_set($field_id, $lang_id))
{ {
$this->lang_helper->get_option_lang($field_id, $lang_id, FIELD_BOOL, false); $this->lang_helper->load_option_lang($lang_id);
} }
if (!$field_value && $field_data['field_show_novalue']) if (!$field_value && $field_data['field_show_novalue'])
@ -203,7 +203,14 @@ class type_bool extends type_base
{ {
if (!$this->lang_helper->is_set($profile_row['field_id'], $profile_row['lang_id'], 1)) if (!$this->lang_helper->is_set($profile_row['field_id'], $profile_row['lang_id'], 1))
{ {
$this->lang_helper->get_option_lang($profile_row['field_id'], $profile_row['lang_id'], $this->get_service_name(), $preview_options); if ($preview_options)
{
$this->lang_helper->load_preview_options($profile_row['field_id'], $profile_row['lang_id'], $preview_options);
}
else
{
$this->lang_helper->load_option_lang($profile_row['lang_id']);
}
} }
$options = $this->lang_helper->get($profile_row['field_id'], $profile_row['lang_id']); $options = $this->lang_helper->get($profile_row['field_id'], $profile_row['lang_id']);

View file

@ -135,7 +135,7 @@ class type_dropdown extends type_base
// retrieve option lang data if necessary // retrieve option lang data if necessary
if (!$this->lang_helper->is_set($field_data['field_id'], $field_data['lang_id'], 1)) if (!$this->lang_helper->is_set($field_data['field_id'], $field_data['lang_id'], 1))
{ {
$this->lang_helper->get_option_lang($field_data['field_id'], $field_data['lang_id'], $this->get_service_name(), false); $this->lang_helper->load_option_lang($field_data['lang_id']);
} }
if (!$this->lang_helper->is_set($field_data['field_id'], $field_data['lang_id'], $field_value)) if (!$this->lang_helper->is_set($field_data['field_id'], $field_data['lang_id'], $field_value))
@ -160,7 +160,7 @@ class type_dropdown extends type_base
$lang_id = $field_data['lang_id']; $lang_id = $field_data['lang_id'];
if (!$this->lang_helper->is_set($field_id, $lang_id)) if (!$this->lang_helper->is_set($field_id, $lang_id))
{ {
$this->lang_helper->get_option_lang($field_id, $lang_id, $this->get_service_name(), false); $this->lang_helper->load_option_lang($lang_id);
} }
if ($field_value == $field_data['field_novalue'] && !$field_data['field_show_novalue']) if ($field_value == $field_data['field_novalue'] && !$field_data['field_show_novalue'])
@ -199,7 +199,14 @@ class type_dropdown extends type_base
if (!$this->lang_helper->is_set($profile_row['field_id'], $profile_row['lang_id'], 1)) if (!$this->lang_helper->is_set($profile_row['field_id'], $profile_row['lang_id'], 1))
{ {
$this->lang_helper->get_option_lang($profile_row['field_id'], $profile_row['lang_id'], $this->get_service_name(), $preview_options); if ($preview_options)
{
$this->lang_helper->load_preview_options($profile_row['field_id'], $profile_row['lang_id'], $preview_options);
}
else
{
$this->lang_helper->load_option_lang($profile_row['lang_id']);
}
} }
$profile_row['field_value'] = (int) $value; $profile_row['field_value'] = (int) $value;