Редактируемые колонки в профиле пользователя

dimka3210

Легенда
Вообще разрабатывалось с целью вживления в движок, но как то я так подумал... давайте для начала его потестим.

ajax.php

#найти

PHP:
'manage_user'      => array('admin'),

#ниже добавить

PHP:
'del_column'      => array('admin'),

#найти

PHP:
function index_data()

    {

        require(AJAX_DIR .'index_data.php');

    }

#ниже добавить

PHP:
function del_column()

    {

        global $userdata;

        if($userdata['user_level'] == 1){

            $sql = "DELETE FROM `bb_users_column` WHERE `id`=".(int)$this->request['id'];

            DB()->query($sql);

            $this->response['sql'][0] = $sql;

            $sql = "DELETE FROM `bb_users_column_values` WHERE `key`='" . $this->request['key'] . "'";

            DB()->query($sql);

            $this->response['ok'] = "Готово!";

            $this->response['sql'][1] = $sql;

        }

        else{

            $this->response['error'] = 'No level!';

        }

    }

includes/function.php

#найти

PHP:
if ($userdata['user_id'] == ANONYMOUS)

    {

        CACHE('bb_cache')->set('anonymous_userdata', $userdata);

    }

#ниже добавить

PHP:
// на момент создания инсталла я не мог вспомнить зачем эти строки

// возможно их можно будет удалить

$sql = "SELECT `t1`.*, `t2`.`column_key`, `t2`.`text`, `t2`.`id` AS `column_id` FROM `bb_users_column_values` AS `t1`, `bb_users_column` AS `t2` WHERE `t1`.`user_id` = {$userdata['user_id']} AND `t2`.`column_key`=`t1`.`key` ";

    $userdata['user_columns'] = DB()->fetch_rowset($sql);

#найти строкой ниже

PHP:
return $userdata;

}

#ниже добавить

PHP:
function update_user_columns($userdata, $rows){

    if(is_array($rows)){

        foreach($rows as $key=>$val){

            $row_db = DB()->fetch_row("SELECT * FROM `bb_users_column_values` WHERE `user_id`={$userdata['user_id']} AND `key`='{$key}'");

            if($row_db){

                DB()->query("UPDATE `bb_users_column_values` SET `value`='{$val}' WHERE `user_id`={$userdata['user_id']} AND `key`='{$key}'");

            }else{

                DB()->query("INSERT INTO `bb_users_column_values` (`user_id`, `key`, `value`) VALUES ({$userdata['user_id']}, '{$key}', '{$val}')");

            }

        }

    }

}

upload/includes/ucp/usercp_register.php

#найти

PHP:
$tp_data = array(); // данные для tpl

#ниже добавить

PHP:
$update = false;

if (isset($_POST['user_column'])) {

    foreach ($_POST['user_column'] as $item) {

        if (!empty($item)) {

            $update = true;

            break;

        }

    }

}

#найти

PHP:
$profile_fields_sql = $profile_fields;

#заменить на

PHP:

#ниже добавить

PHP:
unset($profile_fields_to_sql['user_column']);

        $profile_fields_sql = join(', ', array_keys($profile_fields_to_sql));

#найти

PHP:
bb_die($lang['PROFILE_UPDATED']);

            }

#ниже добавить

PHP:
if ($bb_cfg['user_column_enable']) {

                update_user_columns($userdata, $_POST['user_column']);

            }

        elseif ($update && $bb_cfg['user_column_enable']) {

            update_user_columns($userdata, $_POST['user_column']);

            meta_refresh('index.php', 10);

            bb_die($lang['PROFILE_UPDATED']);

        }

#найти

PHP:
$template->assign_vars($tp_data)

#выше добавить

PHP:
if ($bb_cfg['user_column_enable']) {

    if ($mode != 'editprofile') {

        $sql = $sql = "SELECT * FROM `bb_users_column`";

    } else {

        $sql = "SELECT `bb_users_column`.*, `bb_users_column_values`.`value` FROM `bb_users_column` LEFT JOIN `bb_users_column_values` ON (`bb_users_column_values`.`key` = `bb_users_column`.`column_key`)";

    }

    $rows_column = DB()->fetch_rowset($sql);

    foreach ($rows_column as $row) {

        $template->assign_block_vars('COLUMNS', array(

            'TEXT' => $row['text'],

            'KEY' => $row['column_key'],

            'VALUE' => ($mode == 'editprofile') ? $row['value'] : ''

        ));

    }

}

upload/includes/ucp/usercp_viewprofile.php

#найти

PHP:
'TRAF_STATS'          => !(IS_AM || $profile_user_id),

));

#ниже добавить

PHP:
foreach($profiledata['user_columns'] as $user_column){

$template->assign_block_vars('USER_COLUMNS', array(

    'KEY'  => $user_column['text'],

    'VALUE'  => $user_column['value'],

));

}

upload/language/lang_russian/lang_admin.php

PHP:
$lang['USERS_COLUMN'] = 'Колонки в профиле';

upload/templates/default/usercp_register.tpl

#найти

PHP:
<tr>

    <td>{L_SKYPE}:</td>

    <td><input type="text" name="user_skype" size="30" maxlength="250" value="{USER_SKYPE}" /></td>

</tr>

#ниже добавить

PHP:
<!-- BEGIN COLUMNS -->

<tr>

    <td>{COLUMNS.TEXT}:</td>

    <td><input type="text" name="user_column[{COLUMNS.KEY}]" size="50" maxlength="100" value="{COLUMNS.VALUE}" /></td>

</tr>

<!-- END COLUMNS -->

upload/templates/default/usercp_viewprofile.tpl

#найти

PHP:
            <!-- IF LOCATION -->

            <tr>

                <th class="vBottom">{L_LOCATION}:</th>

                <td id="user_from"><b class="editable">{LOCATION}</b></td>

            </tr>

            <!-- ENDIF -->

#ниже добавить

PHP:
<!-- BEGIN USER_COLUMNS -->

                    <!-- IF USER_COLUMNS.VALUE -->

                        <tr>

                            <th>{USER_COLUMNS.KEY}:</th>

                            <td>{USER_COLUMNS.VALUE}</td>

                        </tr>

                    <!-- ENDIF / USER_COLUMNS.VALUE -->

                <!-- END USER_COLUMNS -->

upload/templates/default/viewtopic.tpl

#найти

PHP:
<!-- IF postrow.POSTER_JOINED --><p class="joined" title="{postrow.POSTER_JOINED_DATE}"><em>{L_LONGEVITY}:</em> {postrow.POSTER_JOINED}</p><!-- ENDIF -->

#ниже добавить

PHP:
<!-- IF postrow.USER_COLUMNS -->{postrow.USER_COLUMNS}<!-- ENDIF -->

#найти

PHP:

#ниже добавить

PHP:

viewtopic.php

#найти

PHP:
$page_cfg['load_tpl_vars'] = array(

    'post_buttons',

    'post_icons',

    'topic_icons',

);

#ниже добавить

PHP:
function compileLayout($array){

    $s = '';

    if(!is_array($array))

        return $s;

    foreach($array as $a){

        $s .= "<p class=\"joined\" title=\"{$a['key']}\"><em>{$a['text']}:</em> {$a['value']}</p>\n";

    }

    return $s;

}

#найти

PHP:
LIMIT

      $start, $posts_per_page

";

#ниже добавить

PHP:
/* Users columns */

$array_in = array();

$i = 1;

$sql_c = "SELECT poster_id FROM " . BB_POSTS . " WHERE `topic_id`=" . $topic_id;

$result_c = DB()->fetch_rowset($sql_c);

$array_count = count($result_c);

foreach ($result_c as $item) {
    $array_in[] = $item['poster_id'];
}

$array_in = implode(',' , $array_in);


//$sql_c = "SELECT `t`.`key`, `t`.`value`, `t1`.`text` FROM `bb_users_column_values` `t` LEFT JOIN `bb_users_column` `t1` ON(`t1.`key`=`t`.`column_key`) WHERE `user_id` IN (" . $array_in . ")";

$sql_c = "SELECT `t`.`key`, `t`.`value`, `t`.`user_id`, `t1`.`text` FROM `bb_users_column_values` `t` LEFT JOIN `bb_users_column` `t1` ON(`t`.`key`=`t1`.`column_key`) WHERE `t`.`user_id` IN (" . $array_in . ") AND `t1`.`viewtopic_show`=1";

$rows_c = DB()->fetch_rowset($sql_c);

//foreach()

/* Users columns {END} */

#найти

PHP:
for ($i = 0; $i < $total_posts; $i++) {

#ниже добавить

PHP:
$j = 0;

#найти строкой ниже

PHP:
$poster_id = $postrow[$i]['user_id'];

#ниже добавить

PHP:
foreach ($rows_c as $r){

        if($r['user_id'] == $poster_id){

            $postrow[$i]['user_columns'][$j] = $r;

        }

        $j++;

    }

    $poster = ($poster_id == ANONYMOUS) ? $lang['GUEST'] : $postrow[$i]['username'];

#найти

PHP:
'POSTER_JOINED' => ($bb_cfg['show_poster_joined']) ? $poster_longevity : '',

#ниже добавить

PHP:
'USER_COLUMNS'  => (!empty($postrow[$i]['user_columns'])) ? compileLayout($postrow[$i]['user_columns']) : "",

SQL

PHP:
INSERT INTO `bb_config` (`config_name`, `config_value`) VALUES ('user_column_enable', '1');

CREATE TABLE `bb_users_column` (

    `id` INT(3) UNSIGNED NOT NULL AUTO_INCREMENT,

    `column_key` VARCHAR(32) NOT NULL,

    `text` VARCHAR(64) NOT NULL,

    `max_length` VARCHAR(3) NOT NULL,

    `viewtopic_show` INT(1) UNSIGNED NOT NULL DEFAULT '0',

    PRIMARY KEY (`id`)

)

COLLATE='utf8_general_ci'

ENGINE=MyISAM;

CREATE TABLE `bb_users_column_values` (

    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,

    `user_id` MEDIUMINT(8) UNSIGNED NOT NULL,

    `key` VARCHAR(32) NOT NULL,

    `value` VARCHAR(64) NOT NULL,

    PRIMARY KEY (`id`)

)

COLLATE='utf8_general_ci'

ENGINE=MyISAM;
 

Вложения

  • admin_user_columns.zip
    2.4 KB · Просмотры: 19

dimka3210

Легенда
Как работает можно посмотреть на

Please Login or Register to view hidden text.


Из нагрузок.
Админку не считаю в нагрузки :)
В профиле 1 запрос.
В viewtopic 1 запрос.
Не спрашивайте какими силами :D

Работает довольно быстро, кешировать тут нечего да и не получится.
Если станет всё отлично и без багов, то впилим в движок.
 
G

Gemini_13

Гость
в usercp_register.php нету такой строки, мож удалить с инструкции :)
PHP:
$profile_fields_sql = $profile_fields;
 
Сверху