Проблем(въпрос) за готов чат

CosaNostra

Registered
Здравейте! Преди време съм си изтеглил от интернет готов чат и реших да го вградя в сайта си. Сблъсках се обаче със следния проблем - чата си има собствена логин форма, която мен не ме удовлетворява. Искам като се влезе в страницата на чата автоматично да се "логва" с името, с което е логнат потребителя ( малко стана объркано ). Ето 3 скрипта, от които мисля, че е възможно да се реши проблема ( ако те не свършат работа ще кача всички файлове в директория и ще ги дам за сваляне ).

От тук се записва потребителя в БД
<?php

class ChatUser extends ChatBase{

protected $name = '', $gravatar = '';

public function save(){

DB::query("
INSERT INTO webchat_users (name, gravatar)
VALUES (
'".DB::esc($this->name)."',
'".DB::esc($this->gravatar)."'
)");

return DB::getMySQLiObject();
}

public function update(){
DB::query("
INSERT INTO webchat_users (name, gravatar)
VALUES (
'".DB::esc($this->name)."',
'".DB::esc($this->gravatar)."'
) ON DUPLICATE KEY UPDATE last_activity = NOW()");
}
}

?>


$(document).ready(function(){

// Run the init method on document ready:
chat.init();

});

var chat = {

// data holds variables for use in the class:

data : {
lastID : 0,
noActivity : 0
},

// Init binds event listeners and sets up timers:

init : function(){

// Using the defaultText jQuery plugin, included at the bottom:
$('#name').defaultText('Nickname');
$('#email').defaultText('Email (Gravatars are Enabled)');

// Converting the #chatLineHolder div into a jScrollPane,
// and saving the plugin's API in chat.data:

chat.data.jspAPI = $('#chatLineHolder').jScrollPane({
verticalDragMinHeight: 12,
verticalDragMaxHeight: 12
}).data('jsp');

// We use the working variable to prevent
// multiple form submissions:

var working = false;

// Logging a person in the chat:

$('#loginForm').submit(function(){

if(working) return false;
working = true;

// Using our tzPOST wrapper function
// (defined in the bottom):

$.tzPOST('login',$(this).serialize(),function(r){
working = false;

if(r.error){
chat.displayError(r.error);
}
else chat.login(r.name,r.gravatar);
});

return false;
});

// Submitting a new chat entry:

$('#submitForm').submit(function(){

var text = $('#chatText').val();

if(text.length == 0){
return false;
}

if(working) return false;
working = true;

// Assigning a temporary ID to the chat:
var tempID = 't'+Math.round(Math.random()*1000000),
params = {
id : tempID,
author : chat.data.name,
gravatar : chat.data.gravatar,
text : text.replace(/</g,'<').replace(/>/g,'>')
};

// Using our addChatLine method to add the chat
// to the screen immediately, without waiting for
// the AJAX request to complete:

chat.addChatLine($.extend({},params));

// Using our tzPOST wrapper method to send the chat
// via a POST AJAX request:

$.tzPOST('submitChat',$(this).serialize(),function(r){
working = false;

$('#chatText').val('');
$('div.chat-'+tempID).remove();

params['id'] = r.insertID;
chat.addChatLine($.extend({},params));
});

return false;
});

// Logging the user out:

$('a.logoutButton').live('click',function(){

$('#chatTopBar > span').fadeOut(function(){
$(this).remove();
});

$('#submitForm').fadeOut(function(){
$('#loginForm').fadeIn();
});

$.tzPOST('logout');

return false;
});

// Checking whether the user is already logged (browser refresh)

$.tzGET('checkLogged',function(r){
if(r.logged){
chat.login(r.loggedAs.name,r.loggedAs.gravatar);
}
});

// Self executing timeout functions

(function getChatsTimeoutFunction(){
chat.getChats(getChatsTimeoutFunction);
})();

(function getUsersTimeoutFunction(){
chat.getUsers(getUsersTimeoutFunction);
})();

},

// The login method hides displays the
// user's login data and shows the submit form

login : function(name,gravatar){

chat.data.name = name;
chat.data.gravatar = gravatar;
$('#chatTopBar').html(chat.render('loginTopBar',chat.data));

$('#loginForm').fadeOut(function(){
$('#submitForm').fadeIn();
$('#chatText').focus();
});

},

// The render method generates the HTML markup
// that is needed by the other methods:

render : function(template,params){

var arr = [];
switch(template){
case 'loginTopBar':
arr = [
'<span><img src="',params.gravatar,'" width="23" height="23" />',
'<span class="name">',params.name,
'</span><a href="" class="logoutButton rounded">Logout</a></span>'];
break;

case 'chatLine':
arr = [
'<div class="chat chat-',params.id,' rounded"><span class="gravatar"><img src="',params.gravatar,
'" width="23" height="23" onload="this.style.visibility=\'visible\'" />','</span><span class="author">',params.author,
':</span><span class="text">',params.text,'</span><span class="time">',params.time,'</span></div>'];
break;

case 'user':
arr = [
'<div class="user" title="',params.name,'"><img src="',
params.gravatar,'" width="30" height="30" onload="this.style.visibility=\'visible\'" /></div>'
];
break;
}

// A single array join is faster than
// multiple concatenations

return arr.join('');

},

// The addChatLine method ads a chat entry to the page

addChatLine : function(params){

// All times are displayed in the user's timezone

var d = new Date();
if(params.time) {

// PHP returns the time in UTC (GMT). We use it to feed the date
// object and later output it in the user's timezone. JavaScript
// internally converts it for us.

d.setUTCHours(params.time.hours,params.time.minutes);
}

params.time = (d.getHours() < 10 ? '0' : '' ) + d.getHours()+':'+
(d.getMinutes() < 10 ? '0':'') + d.getMinutes();

var markup = chat.render('chatLine',params),
exists = $('#chatLineHolder .chat-'+params.id);

if(exists.length){
exists.remove();
}

if(!chat.data.lastID){
// If this is the first chat, remove the
// paragraph saying there aren't any:

$('#chatLineHolder p').remove();
}

// If this isn't a temporary chat:
if(params.id.toString().charAt(0) != 't'){
var previous = $('#chatLineHolder .chat-'+(+params.id - 1));
if(previous.length){
previous.after(markup);
}
else chat.data.jspAPI.getContentPane().append(markup);
}
else chat.data.jspAPI.getContentPane().append(markup);

// As we added new content, we need to
// reinitialise the jScrollPane plugin:

chat.data.jspAPI.reinitialise();
chat.data.jspAPI.scrollToBottom(true);

},

// This method requests the latest chats
// (since lastID), and adds them to the page.

getChats : function(callback){
$.tzGET('getChats',{lastID: chat.data.lastID},function(r){

for(var i=0;i<r.chats.length;i++){
chat.addChatLine(r.chats);
}

if(r.chats.length){
chat.data.noActivity = 0;
chat.data.lastID = r.chats[i-1].id;
}
else{
// If no chats were received, increment
// the noActivity counter.

chat.data.noActivity++;
}

if(!chat.data.lastID){
chat.data.jspAPI.getContentPane().html('<p class="noChats">No chats yet</p>');
}

// Setting a timeout for the next request,
// depending on the chat activity:

var nextRequest = 1000;

// 2 seconds
if(chat.data.noActivity > 3){
nextRequest = 2000;
}

if(chat.data.noActivity > 10){
nextRequest = 5000;
}

// 15 seconds
if(chat.data.noActivity > 20){
nextRequest = 15000;
}

setTimeout(callback,nextRequest);
});
},

// Requesting a list with all the users.

getUsers : function(callback){
$.tzGET('getUsers',function(r){

var users = [];

for(var i=0; i< r.users.length;i++){
if(r.users){
users.push(chat.render('user',r.users));
}
}

var message = '';

if(r.total<1){
message = 'No one is online';
}
else {
message = r.total+' '+(r.total == 1 ? 'person':'people')+' online';
}

users.push('<p class="count">'+message+'</p>');

$('#chatUsers').html(users.join(''));

setTimeout(callback,15000);
});
},

// This method displays an error message on the top of the page:

displayError : function(msg){
var elem = $('<div>',{
id : 'chatErrorMessage',
html : msg
});

elem.click(function(){
$(this).fadeOut(function(){
$(this).remove();
});
});

setTimeout(function(){
elem.click();
},5000);

elem.hide().appendTo('body').slideDown();
}
};

// Custom GET & POST wrappers:

$.tzPOST = function(action,data,callback){
$.post('php/ajax.php?action='+action,data,callback,'json');
}

$.tzGET = function(action,data,callback){
$.get('php/ajax.php?action='+action,data,callback,'json');
}

// A custom jQuery method for placeholder text:

$.fn.defaultText = function(value){

var element = this.eq(0);
element.data('defaultText',value);

element.focus(function(){
if(element.val() == value){
element.val('').removeClass('defaultText');
}
}).blur(function(){
if(element.val() == '' || element.val() == value){
element.addClass('defaultText').val(value);
}
});

return element.blur();
}




А ето и кода за визуализацията на чата:
<div id="chatContainer">

<div id="chatLineHolder"></div>

<div id="chatUsers" class="rounded"></div>
<div id="chatBottomBar" class="rounded">
<div class="tip"></div>

<form id="loginForm" method="post" action="">
<input id="name" name="name" class="rounded" maxlength="16" />
<input id="email" name="email" class="rounded" />
<input type="submit" class="blueButton" value="Login" />
</form>

<form id="submitForm" method="post" action="">
<input id="chatText" name="chatText" class="rounded" maxlength="255" />
<input type="submit" class="blueButton" value="Submit" />
</form>

</div>

</div>



Благодаря за помощта предварително! :?:
 
Значи имаш две форми:
1.На сайта
2.На чата си.
И искаш тази на чата дая няма , да се ползва тази от сайта.
Мисля че трябва да редактираш този код:

Код:
<?php

class ChatUser extends ChatBase{

protected $name = '', $gravatar = '';

public function save(){

DB::query("
INSERT INTO webchat_users (name, gravatar)
VALUES (
'".DB::esc($this->name)."',
'".DB::esc($this->gravatar)."'
)");

return DB::getMySQLiObject();
}

public function update(){
DB::query("
INSERT INTO webchat_users (name, gravatar)
VALUES (
'".DB::esc($this->name)."',
'".DB::esc($this->gravatar)."'
) ON DUPLICATE KEY UPDATE last_activity = NOW()");
}
}

?>

със твойте записи за логин формата на сайта си.
Не съм сигурен какво искаш точно , дано някой друг даде по добре мнение от моето :)
 
Това ще замести промелниливата "name" с user_name на потребителя, който го взимаме от $_SESSION, това означава, че при логин на потребителя трябва да запазваш username в сесията.

Тъй като не си дал целият код има някои неясни работи, но би трябвало да работи.

TIP: $this->name е добре да работи с userID(предадено отново по сесията и кастнато в (int)), при селекта на чата само един JOIN с юзерската таблица ти трябва, не съм го направил така, за да не се услужняват излишно нещата.

PHP:
<?php

class ChatUser extends ChatBase{

protected $name = '', $gravatar = '';

public function __construct() {
      parent::__construct();
      $this->name = $_SESSION['username'];
}

public function save(){

DB::query("
INSERT INTO webchat_users (name, gravatar)
VALUES (
'".DB::esc($this->name)."',
'".DB::esc($this->gravatar)."'
)");

return DB::getMySQLiObject();
}

public function update(){
DB::query("
INSERT INTO webchat_users (name, gravatar)
VALUES (
'".DB::esc($this->name)."',
'".DB::esc($this->gravatar)."'
) ON DUPLICATE KEY UPDATE last_activity = NOW()");
}
}

?>
 

Back
Горе