Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 290
acp_reasons
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
3422.00
0.00% covered (danger)
0.00%
0 / 286
 main
0.00% covered (danger)
0.00%
0 / 1
3422.00
0.00% covered (danger)
0.00%
0 / 286
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
    exit;
}
class acp_reasons
{
    var $u_action;
    function main($id, $mode)
    {
        global $db, $user, $template;
        global $request, $phpbb_log;
        $user->add_lang(array('mcp', 'acp/posting'));
        // Set up general vars
        $action = $request->variable('action', '');
        $submit = (isset($_POST['submit'])) ? true : false;
        $reason_id = $request->variable('id', 0);
        $this->tpl_name = 'acp_reasons';
        $this->page_title = 'ACP_REASONS';
        $form_name = 'acp_reason';
        add_form_key('acp_reason');
        $error = array();
        switch ($action)
        {
            case 'add':
            case 'edit':
                $reason_row = array(
                    'reason_title'            => $request->variable('reason_title', '', true),
                    'reason_description'    => $request->variable('reason_description', '', true),
                );
                if ($submit)
                {
                    if (!check_form_key($form_name))
                    {
                        $error[] = $user->lang['FORM_INVALID'];
                    }
                    // Reason specified?
                    if (!$reason_row['reason_title'] || !$reason_row['reason_description'])
                    {
                        $error[] = $user->lang['NO_REASON_INFO'];
                    }
                    $check_double = ($action == 'add') ? true : false;
                    if ($action == 'edit')
                    {
                        $sql = 'SELECT reason_title
                            FROM ' . REPORTS_REASONS_TABLE . "
                            WHERE reason_id = $reason_id";
                        $result = $db->sql_query($sql);
                        $row = $db->sql_fetchrow($result);
                        $db->sql_freeresult($result);
                        if (strtolower($row['reason_title']) == 'other' || strtolower($reason_row['reason_title']) == 'other')
                        {
                            $reason_row['reason_title'] = 'other';
                        }
                        if ($row['reason_title'] != $reason_row['reason_title'])
                        {
                            $check_double = true;
                        }
                    }
                    // Check for same reason if adding it...
                    if ($check_double)
                    {
                        $sql = 'SELECT reason_id
                            FROM ' . REPORTS_REASONS_TABLE . "
                            WHERE reason_title = '" . $db->sql_escape($reason_row['reason_title']) . "'";
                        $result = $db->sql_query($sql);
                        $row = $db->sql_fetchrow($result);
                        $db->sql_freeresult($result);
                        if ($row || ($action == 'add' && strtolower($reason_row['reason_title']) == 'other'))
                        {
                            $error[] = $user->lang['REASON_ALREADY_EXIST'];
                        }
                    }
                    if (!count($error))
                    {
                        // New reason?
                        if ($action == 'add')
                        {
                            // Get new order...
                            $sql = 'SELECT MAX(reason_order) as max_reason_order
                                FROM ' . REPORTS_REASONS_TABLE;
                            $result = $db->sql_query($sql);
                            $max_order = (int) $db->sql_fetchfield('max_reason_order');
                            $db->sql_freeresult($result);
                            $sql_ary = array(
                                'reason_title'            => (string) $reason_row['reason_title'],
                                'reason_description'    => (string) $reason_row['reason_description'],
                                'reason_order'            => $max_order + 1
                            );
                            $db->sql_query('INSERT INTO ' . REPORTS_REASONS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
                            $log = 'ADDED';
                        }
                        else if ($reason_id)
                        {
                            $sql_ary = array(
                                'reason_title'            => (string) $reason_row['reason_title'],
                                'reason_description'    => (string) $reason_row['reason_description'],
                            );
                            $db->sql_query('UPDATE ' . REPORTS_REASONS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
                                WHERE reason_id = ' . $reason_id);
                            $log = 'UPDATED';
                        }
                        $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_REASON_' . $log, false, array($reason_row['reason_title']));
                        trigger_error($user->lang['REASON_' . $log] . adm_back_link($this->u_action));
                    }
                }
                else if ($reason_id)
                {
                    $sql = 'SELECT *
                        FROM ' . REPORTS_REASONS_TABLE . '
                        WHERE reason_id = ' . $reason_id;
                    $result = $db->sql_query($sql);
                    $reason_row = $db->sql_fetchrow($result);
                    $db->sql_freeresult($result);
                    if (!$reason_row)
                    {
                        trigger_error($user->lang['NO_REASON'] . adm_back_link($this->u_action), E_USER_WARNING);
                    }
                }
                $l_title = ($action == 'edit') ? 'EDIT' : 'ADD';
                $translated = false;
                // If the reason is defined within the language file, we will use the localized version, else just use the database entry...
                if (isset($user->lang['report_reasons']['TITLE'][strtoupper($reason_row['reason_title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($reason_row['reason_title'])]))
                {
                    $translated = true;
                }
                $template->assign_vars(array(
                    'L_TITLE'        => $user->lang['REASON_' . $l_title],
                    'U_ACTION'        => $this->u_action . "&amp;id=$reason_id&amp;action=$action",
                    'U_BACK'        => $this->u_action,
                    'ERROR_MSG'        => (count($error)) ? implode('<br />', $error) : '',
                    'REASON_TITLE'            => $reason_row['reason_title'],
                    'REASON_DESCRIPTION'    => $reason_row['reason_description'],
                    'TRANSLATED_TITLE'        => ($translated) ? $user->lang['report_reasons']['TITLE'][strtoupper($reason_row['reason_title'])] : '',
                    'TRANSLATED_DESCRIPTION'=> ($translated) ? $user->lang['report_reasons']['DESCRIPTION'][strtoupper($reason_row['reason_title'])] : '',
                    'S_AVAILABLE_TITLES'    => implode($user->lang['COMMA_SEPARATOR'], array_map('htmlspecialchars', array_keys($user->lang['report_reasons']['TITLE']))),
                    'S_EDIT_REASON'            => true,
                    'S_TRANSLATED'            => $translated,
                    'S_ERROR'                => (count($error)) ? true : false,
                    )
                );
                return;
            break;
            case 'delete':
                $sql = 'SELECT *
                    FROM ' . REPORTS_REASONS_TABLE . '
                    WHERE reason_id = ' . $reason_id;
                $result = $db->sql_query($sql);
                $reason_row = $db->sql_fetchrow($result);
                $db->sql_freeresult($result);
                if (!$reason_row)
                {
                    trigger_error($user->lang['NO_REASON'] . adm_back_link($this->u_action), E_USER_WARNING);
                }
                if (strtolower($reason_row['reason_title']) == 'other')
                {
                    trigger_error($user->lang['NO_REMOVE_DEFAULT_REASON'] . adm_back_link($this->u_action), E_USER_WARNING);
                }
                // Let the deletion be confirmed...
                if (confirm_box(true))
                {
                    $sql = 'SELECT reason_id
                        FROM ' . REPORTS_REASONS_TABLE . "
                        WHERE LOWER(reason_title) = 'other'";
                    $result = $db->sql_query($sql);
                    $other_reason_id = (int) $db->sql_fetchfield('reason_id');
                    $db->sql_freeresult($result);
                    switch ($db->get_sql_layer())
                    {
                        // The ugly one!
                        case 'mysqli':
                            // Change the reports using this reason to 'other'
                            $sql = 'UPDATE ' . REPORTS_TABLE . '
                                SET reason_id = ' . $other_reason_id . ", report_text = CONCAT('" . $db->sql_escape($reason_row['reason_description']) . "\n\n', report_text)
                                WHERE reason_id = $reason_id";
                        break;
                        // Standard? What's that?
                        case 'mssql_odbc':
                        case 'mssqlnative':
                            // Change the reports using this reason to 'other'
                            $sql = "DECLARE @ptrval binary(16)
                                    SELECT @ptrval = TEXTPTR(report_text)
                                        FROM " . REPORTS_TABLE . "
                                    WHERE reason_id = " . $reason_id . "
                                    UPDATETEXT " . REPORTS_TABLE . ".report_text @ptrval 0 0 '" . $db->sql_escape($reason_row['reason_description']) . "\n\n'
                                    UPDATE " . REPORTS_TABLE . '
                                        SET reason_id = ' . $other_reason_id . "
                                    WHERE reason_id = $reason_id";
                        break;
                        // Teh standard
                        case 'postgres':
                        case 'oracle':
                        case 'sqlite3':
                            // Change the reports using this reason to 'other'
                            $sql = 'UPDATE ' . REPORTS_TABLE . '
                                SET reason_id = ' . $other_reason_id . ", report_text = '" . $db->sql_escape($reason_row['reason_description']) . "\n\n' || report_text
                                WHERE reason_id = $reason_id";
                        break;
                    }
                    $db->sql_query($sql);
                    $db->sql_query('DELETE FROM ' . REPORTS_REASONS_TABLE . ' WHERE reason_id = ' . $reason_id);
                    $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_REASON_REMOVED', false, array($reason_row['reason_title']));
                    trigger_error($user->lang['REASON_REMOVED'] . adm_back_link($this->u_action));
                }
                else
                {
                    confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
                        'i'            => $id,
                        'mode'        => $mode,
                        'action'    => $action,
                        'id'        => $reason_id))
                    );
                }
            break;
            case 'move_up':
            case 'move_down':
                if (!check_link_hash($request->variable('hash', ''), 'acp_reasons'))
                {
                    trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
                }
                $sql = 'SELECT reason_order
                    FROM ' . REPORTS_REASONS_TABLE . "
                    WHERE reason_id = $reason_id";
                $result = $db->sql_query($sql);
                $order = $db->sql_fetchfield('reason_order');
                $db->sql_freeresult($result);
                if ($order === false || ($order == 0 && $action == 'move_up'))
                {
                    break;
                }
                $order = (int) $order;
                $order_total = $order * 2 + (($action == 'move_up') ? -1 : 1);
                $sql = 'UPDATE ' . REPORTS_REASONS_TABLE . '
                    SET reason_order = ' . $order_total . ' - reason_order
                    WHERE reason_order IN (' . $order . ', ' . (($action == 'move_up') ? $order - 1 : $order + 1) . ')';
                $db->sql_query($sql);
                if ($request->is_ajax())
                {
                    $json_response = new \phpbb\json_response;
                    $json_response->send(array(
                        'success'    => (bool) $db->sql_affectedrows(),
                    ));
                }
            break;
        }
        // By default, check that order is valid and fix it if necessary
        $sql = 'SELECT reason_id, reason_order
            FROM ' . REPORTS_REASONS_TABLE . '
            ORDER BY reason_order';
        $result = $db->sql_query($sql);
        if ($row = $db->sql_fetchrow($result))
        {
            $order = 0;
            do
            {
                ++$order;
                if ($row['reason_order'] != $order)
                {
                    $sql = 'UPDATE ' . REPORTS_REASONS_TABLE . "
                        SET reason_order = $order
                        WHERE reason_id = {$row['reason_id']}";
                    $db->sql_query($sql);
                }
            }
            while ($row = $db->sql_fetchrow($result));
        }
        $db->sql_freeresult($result);
        $template->assign_vars(array(
            'U_ACTION'            => $this->u_action,
            )
        );
        // Reason count
        $sql = 'SELECT reason_id, COUNT(reason_id) AS reason_count
            FROM ' . REPORTS_TABLE . '
            GROUP BY reason_id';
        $result = $db->sql_query($sql);
        $reason_count = array();
        while ($row = $db->sql_fetchrow($result))
        {
            $reason_count[$row['reason_id']] = $row['reason_count'];
        }
        $db->sql_freeresult($result);
        $sql = 'SELECT *
            FROM ' . REPORTS_REASONS_TABLE . '
            ORDER BY reason_order ASC';
        $result = $db->sql_query($sql);
        while ($row = $db->sql_fetchrow($result))
        {
            $translated = false;
            $other_reason = ($row['reason_title'] == 'other') ? true : false;
            // If the reason is defined within the language file, we will use the localized version, else just use the database entry...
            if (isset($user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]))
            {
                $row['reason_description'] = $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])];
                $row['reason_title'] = $user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])];
                $translated = true;
            }
            $template->assign_block_vars('reasons', array(
                'REASON_TITLE'            => $row['reason_title'],
                'REASON_DESCRIPTION'    => $row['reason_description'],
                'REASON_COUNT'            => (isset($reason_count[$row['reason_id']])) ? $reason_count[$row['reason_id']] : 0,
                'S_TRANSLATED'        => $translated,
                'S_OTHER_REASON'    => $other_reason,
                'U_EDIT'        => $this->u_action . '&amp;action=edit&amp;id=' . $row['reason_id'],
                'U_DELETE'        => (!$other_reason) ? $this->u_action . '&amp;action=delete&amp;id=' . $row['reason_id'] : '',
                'U_MOVE_UP'        => $this->u_action . '&amp;action=move_up&amp;id=' . $row['reason_id'] . '&amp;hash=' . generate_link_hash('acp_reasons'),
                'U_MOVE_DOWN'    => $this->u_action . '&amp;action=move_down&amp;id=' . $row['reason_id'] . '&amp;hash=' . generate_link_hash('acp_reasons'))
            );
        }
        $db->sql_freeresult($result);
    }
}