From 1fe11eabb675fa876bdbcd5884231ffd6fa278ff Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 23 Sep 2009 17:07:20 -0400 Subject: [PATCH] Do realtime popup with PHP instead of Javascript Move the realtime detection code to PHP extension rather than JavaScript. --- plugins/Realtime/RealtimePlugin.php | 110 ++++++++++--- plugins/Realtime/realtimeupdate.js | 236 ++++++++++++---------------- 2 files changed, 184 insertions(+), 162 deletions(-) diff --git a/plugins/Realtime/RealtimePlugin.php b/plugins/Realtime/RealtimePlugin.php index 4548822610..22851a6c14 100644 --- a/plugins/Realtime/RealtimePlugin.php +++ b/plugins/Realtime/RealtimePlugin.php @@ -50,6 +50,11 @@ class RealtimePlugin extends Plugin protected $favorurl = null; protected $deleteurl = null; + /** + * When it's time to initialize the plugin, calculate and + * pass the URLs we need. + */ + function onInitializePlugin() { $this->replyurl = common_local_url('newnotice'); @@ -57,30 +62,20 @@ class RealtimePlugin extends Plugin // FIXME: need to find a better way to pass this pattern in $this->deleteurl = common_local_url('deletenotice', array('notice' => '0000000000')); + return true; } function onEndShowScripts($action) { - $path = null; + $timeline = $this->_getTimeline($action); - switch ($action->trimmed('action')) { - case 'public': - $path = array('public'); - break; - case 'tag': - $tag = $action->trimmed('tag'); - if (!empty($tag)) { - $path = array('tag', $tag); - } else { - return true; - } - break; - default: + // If there's not a timeline on this page, + // just return true + + if (empty($timeline)) { return true; } - $timeline = $this->_pathToChannel($path); - $scripts = $this->_getScripts(); foreach ($scripts as $script) { @@ -95,16 +90,14 @@ class RealtimePlugin extends Plugin $user_id = 0; } - $action->script('plugins/Realtime/jquery.getUrlParam.js'); - $action->elementStart('script', array('type' => 'text/javascript')); - $action->raw(' - - '); + + $script = ' $(document).ready(function() { '. + $this->_updateInitialize($timeline, $user_id). + '}); '; + + $action->raw($script); + $action->elementEnd('script'); return true; @@ -146,6 +139,47 @@ class RealtimePlugin extends Plugin return true; } + function onStartShowPageNotice($action) + { + $timeline = $this->_getTimeline($action); + if (!empty($timeline)) { + $base = $action->selfUrl(); + if (mb_strstr($url, '?')) { + $url = $base . '&realtime=1'; + } else { + $url = $base . '?realtime=1'; + } + $title = $action->title(); + $code = "window.open('$url', '$title', 'toolbar=no,resizable=yes,scrollbars=yes,status=yes,height=640,width=575');"; + $action->element('a', array('href' => $base, + 'onclick' => $code, + 'id' => 'realtime_timeline', + 'title' => _('Pop up')), + 'Pop up'); + + } + return true; + } + + function onStartShowBody($action) + { + $realtime = $action->boolean('realtime'); + if (!$realtime) { + return true; + } + + $action->elementStart('body', + (common_current_user()) ? array('id' => $action->trimmed('action'), + 'class' => 'user_in') + : array('id' => $action->trimmed('action'))); + if (common_logged_in()) { + $action->showNoticeForm(); + } + $action->showContent(); + $action->elementEnd('body'); + return false; // No default processing + } + function noticeAsJson($notice) { // FIXME: this code should be abstracted to a neutral third @@ -230,4 +264,30 @@ class RealtimePlugin extends Plugin { return ''; } + + function _getTimeline($action) + { + $path = null; + $timeline = null; + + switch ($action->trimmed('action')) { + case 'public': + $path = array('public'); + break; + case 'tag': + $tag = $action->trimmed('tag'); + if (!empty($tag)) { + $path = array('tag', $tag); + } + break; + default: + break; + } + + if (!is_null($path)) { + $timeline = $this->_pathToChannel($path); + } + + return $timeline; + } } diff --git a/plugins/Realtime/realtimeupdate.js b/plugins/Realtime/realtimeupdate.js index da2f9ed3aa..3293ef6e9f 100644 --- a/plugins/Realtime/realtimeupdate.js +++ b/plugins/Realtime/realtimeupdate.js @@ -1,152 +1,114 @@ -$(document).ready(function() { - if (!$(document).getUrlParam('realtime')) { - $('#site_nav_local_views .current a').append(''); - - $('#realtime_timeline').css({ - 'margin':'2px 0 0 11px', - 'background':'transparent url('+$('address .url')[0].href+'/plugins/Realtime/icon_external.gif) no-repeat 45% 45%', - 'text-indent':'-9999px', - 'width':'16px', - 'height':'16px', - 'padding':'0', - 'display':'block', - 'float':'right', - 'border':'none', - 'cursor':'pointer' - }); - - $('#realtime_timeline').click(function() { - window.open($(this).parent('a').attr('href')+'?realtime=1', - $(this).parent('a').attr('title'), - 'toolbar=no,resizable=yes,scrollbars=yes,status=yes'); - - return false; - }); - } - else { - window.resizeTo(575, 640); - address = $('address'); - content = $('#content'); - $('body').html(address); - $('address').hide(); - $('body').append(content); - $('#content').css({'width':'92%'}); - } - - - // add a notice encoded as JSON into the current timeline - // - // TODO: i18n - - RealtimeUpdate = { - _userid: 0, - _replyurl: '', - _favorurl: '', - _deleteurl: '', - - init: function(userid, replyurl, favorurl, deleteurl) - { - RealtimeUpdate._userid = userid; - RealtimeUpdate._replyurl = replyurl; - RealtimeUpdate._favorurl = favorurl; - RealtimeUpdate._deleteurl = deleteurl; - }, - - receive: function(data) - { - id = data.id; - - // Don't add it if it already exists - - if ($("#notice-"+id).length > 0) { - return; - } - - var noticeItem = RealtimeUpdate.makeNoticeItem(data); - $("#notices_primary .notices").prepend(noticeItem, true); - $("#notices_primary .notice:first").css({display:"none"}); - $("#notices_primary .notice:first").fadeIn(1000); - NoticeReply(); - }, - - makeNoticeItem: function(data) - { - user = data['user']; - html = data['html'].replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"'); - source = data['source'].replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"'); - - ni = "
  • "+ - "
    "+ - ""+ - ""+ - "\""+user['screen_name']+"\"/"+ - ""+user['screen_name']+""+ - ""+ - ""+ - "

    "+html+"

    "+ - "
    "+ - "
    "+ - ""+ - "a few seconds ago"+ - " "+ - ""+ - "from "+ +// add a notice encoded as JSON into the current timeline +// +// TODO: i18n + +RealtimeUpdate = { + _userid: 0, + _replyurl: '', + _favorurl: '', + _deleteurl: '', + + init: function(userid, replyurl, favorurl, deleteurl) + { + RealtimeUpdate._userid = userid; + RealtimeUpdate._replyurl = replyurl; + RealtimeUpdate._favorurl = favorurl; + RealtimeUpdate._deleteurl = deleteurl; + }, + + receive: function(data) + { + id = data.id; + + // Don't add it if it already exists + // + if ($("#notice-"+id).length > 0) { + return; + } + + var noticeItem = RealtimeUpdate.makeNoticeItem(data); + $("#notices_primary .notices").prepend(noticeItem, true); + $("#notices_primary .notice:first").css({display:"none"}); + $("#notices_primary .notice:first").fadeIn(1000); + NoticeReply(); + }, + + makeNoticeItem: function(data) + { + user = data['user']; + html = data['html'].replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"'); + source = data['source'].replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"'); + + ni = "
  • "+ + "
    "+ + ""+ + ""+ + "\""+user['screen_name']+"\"/"+ + ""+user['screen_name']+""+ + ""+ + ""+ + "

    "+html+"

    "+ + "
    "+ + "
    "+ + ""+ + "a few seconds ago"+ + " "+ + ""+ + "from "+ ""+source+""+ // may have a link - ""; - if (data['in_reply_to_status_id']) { - ni = ni+" in context"; - } + ""; + if (data['in_reply_to_status_id']) { + ni = ni+" in context"; + } - ni = ni+"
    "+ + ni = ni+""+ "
    "; - if (RealtimeUpdate._userid != 0) { - var input = $("form#form_notice fieldset input#token"); - var session_key = input.val(); - ni = ni+RealtimeUpdate.makeFavoriteForm(data['id'], session_key); - ni = ni+RealtimeUpdate.makeReplyLink(data['id'], data['user']['screen_name']); - if (RealtimeUpdate._userid == data['user']['id']) { + if (RealtimeUpdate._userid != 0) { + var input = $("form#form_notice fieldset input#token"); + var session_key = input.val(); + ni = ni+RealtimeUpdate.makeFavoriteForm(data['id'], session_key); + ni = ni+RealtimeUpdate.makeReplyLink(data['id'], data['user']['screen_name']); + if (RealtimeUpdate._userid == data['user']['id']) { ni = ni+RealtimeUpdate.makeDeleteLink(data['id']); - } - } + } + } - ni = ni+"
    "+ - "
  • "; - return ni; - }, + ni = ni+""+ + ""; + return ni; + }, - makeFavoriteForm: function(id, session_key) - { - var ff; + makeFavoriteForm: function(id, session_key) + { + var ff; - ff = "
    "+ + ff = ""+ "
    "+ - "Favor this notice"+ - ""+ - ""+ - ""+ + "Favor this notice"+ + ""+ + ""+ + ""+ "
    "+ - "
    "; - return ff; + ""; + return ff; + }, + + makeReplyLink: function(id, nickname) + { + var rl; + rl = "Reply "+id+""; + return rl; }, - makeReplyLink: function(id, nickname) - { - var rl; - rl = "Reply "+id+""; - return rl; - }, - - makeDeleteLink: function(id) - { - var dl, delurl; - delurl = RealtimeUpdate._deleteurl.replace("0000000000", id); - - dl = "Delete"; + makeDeleteLink: function(id) + { + var dl, delurl; + delurl = RealtimeUpdate._deleteurl.replace("0000000000", id); - return dl; - } - } + dl = "Delete"; -}); + return dl; + } +} -- 2.39.5