Hallo Miriam,
ganz so Einfach ist es nicht, die Empfänger ID zu bekommen, denn
$address_list
ist ein verschachteltes Array, da wird für jeden Eintrag (Benutzer) ein Array angelegt, welches weiteres Arrays enthält, siehe hier:
ucp_pm_compose.php
Code: Alles auswählen
// Build address list for display
// array('u' => array($author_id => 'to'));
if (sizeof($address_list))
{
// Get Usernames and Group Names
$result = array();
if (!empty($address_list['u']))
{
$sql = 'SELECT user_id as id, username as name, user_colour as colour
FROM ' . USERS_TABLE . '
WHERE ' . $db->sql_in_set('user_id', array_map('intval', array_keys($address_list['u']))) . '
ORDER BY username_clean ASC';
$result['u'] = $db->sql_query($sql);
}
if (!empty($address_list['g']))
{
$sql = 'SELECT g.group_id AS id, g.group_name AS name, g.group_colour AS colour, g.group_type
FROM ' . GROUPS_TABLE . ' g';
if (!$auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel'))
{
$sql .= ' LEFT JOIN ' . USER_GROUP_TABLE . ' ug
ON (
g.group_id = ug.group_id
AND ug.user_id = ' . $user->data['user_id'] . '
AND ug.user_pending = 0
)
WHERE (g.group_type <> ' . GROUP_HIDDEN . ' OR ug.user_id = ' . $user->data['user_id'] . ')';
}
$sql .= ($auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel')) ? ' WHERE ' : ' AND ';
$sql .= 'g.group_receive_pm = 1
AND ' . $db->sql_in_set('g.group_id', array_map('intval', array_keys($address_list['g']))) . '
ORDER BY g.group_name ASC';
$result['g'] = $db->sql_query($sql);
}
$u = $g = array();
$_types = array('u', 'g');
foreach ($_types as $type)
{
if (isset($result[$type]) && $result[$type])
{
while ($row = $db->sql_fetchrow($result[$type]))
{
if ($type == 'g')
{
$row['name'] = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['name']] : $row['name'];
}
${$type}[$row['id']] = array('name' => $row['name'], 'colour' => $row['colour']);
}
$db->sql_freeresult($result[$type]);
}
}
// Now Build the address list
$plain_address_field = '';
foreach ($address_list as $type => $adr_ary)
{
foreach ($adr_ary as $id => $field)
{
if (!isset(${$type}[$id]))
{
unset($address_list[$type][$id]);
continue;
}
$field = ($field == 'to') ? 'to' : 'bcc';
$type = ($type == 'u') ? 'u' : 'g';
$id = (int) $id;
$tpl_ary = array(
'IS_GROUP' => ($type == 'g') ? true : false,
'IS_USER' => ($type == 'u') ? true : false,
'UG_ID' => $id,
'NAME' => ${$type}[$id]['name'],
'COLOUR' => (${$type}[$id]['colour']) ? '#' . ${$type}[$id]['colour'] : '',
'TYPE' => $type,
);
if ($type == 'u')
{
$tpl_ary = array_merge($tpl_ary, array(
'U_VIEW' => get_username_string('profile', $id, ${$type}[$id]['name'], ${$type}[$id]['colour']),
'NAME_FULL' => get_username_string('full', $id, ${$type}[$id]['name'], ${$type}[$id]['colour']),
));
}
else
{
$tpl_ary = array_merge($tpl_ary, array(
'U_VIEW' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=group&g=' . $id),
));
}
$template->assign_block_vars($field . '_recipient', $tpl_ary);
}
}
}
Den Code habe ich in meine functions_pm_limit_hour.php genommen, das geht auch schon teilweise.
Stimmt die Überlegung hatte ich auch schon, was passiert mit den Empfängern, die das Limit noch nicht überschritten haben. Deine Möglichkeit ist mir auch schon in den Sinn gekommen, aber in Anbetracht des verschachtelten Arrays scheint es mir schon etwas Aufwendig zu sein. Da stellt sich auch die Frage, die betreffenden Empfänger raus nehmen und trotzdem dann versenden, oder nicht versenden und die betreffenden Empfänger nur anzeigen und dem User überlassen ob er diese dann raus nimmt.
Ich habe da noch eine andere Idee, vielleicht könnte es gehen, gleich an der Stelle zu prüfen wo der Benutzer ins Array geschrieben werden soll, ist vermutlich die Funktion
handle_message_list_actions
. Ich muss mir auch noch die
$to_user_id
anschauen, könnte auch interessant sein. Vermutlich muss ich irgendwo hier angreifen:
Code: Alles auswählen
{
$message_attachment = 0;
$message_text = $message_subject = '';
if ($to_user_id && $to_user_id != ANONYMOUS && $action == 'post')
{
$address_list['u'][$to_user_id] = 'to';
}
else if ($to_group_id && $action == 'post')
{
$address_list['g'][$to_group_id] = 'to';
}
$check_value = 0;
}
aber wenn auf eine Mail geantwortet wird, dann steht die Empfänger ID vermutlich schon in
$address_list
drinnen, habe ich aber noch nicht geprüft. Wenn dem so ist, dann kommt vermutlich doch wieder die erste Lösung in Betracht, also nicht ganz einfach.
Den in meinem letzten Post genannten Code (
// Begin : PM Limit Per Hour
) habe ich zur Zeit mal bei
if ($submit)
im Fehlerteil drinnen, damit die Meldung noch vor dem versenden kommt.
Insgesamt erweist sich die vermeintlich einfache Lösung doch als sehr anspruchsvoll in der Umsetzung.
Gruß Helmut
Ich bin nicht ganz dicht.... na und.