====== RemoteScript Plugin ======
---- plugin ----
description: Implements an Ajax Remote Scripting controller
author : Ilya Lebedev
email : ilya@lebedev.net
type : syntax
lastupdate : 2007-04-09
compatible :
depends :
conflicts :
similar :
tags : ajax, javascript
downloadurl: https://trello.com/1/cards/5b5cd79dc480cfee4787aaf5/attachments/5b5ce3b87590a69303eb8349/download/remotescript.zip
bugtracker :
sourcerepo :
donationurl:
screenshot_img:
----
This plugin implements Ajax (or - better say - Remote Scripting) controller. It is built on top of the excellent [[http://en.dklab.ru/lib/JsHttpRequest/|JsHttpRequest]] library. It's extremely easy to use: on client side you pass simple JavaScript variables, on server-side you receive PHP array of the same variables, and vise-versa. It does encoding conversion, implements browser-independent data transport layer, allowing to work even if browser does not support XmlHttp at all (fe. IE with disabled ActiveX).
Browser compatibility: IE5+, FF0.9+, Mozilla, Opera 7.2+, Safari/Konqueror and others.
===== Notes =====
* You can try it at
* [[http://cms.debugger.ru/en/start|English]] and [[http://cms.debugger.ru/ru/start|Russian]] pages of The Complete Menu Solution project, in the "Index" menu.
* [[http://cms.debugger.ru/en/start|English]] and [[http://cms.debugger.ru/ru/start|Russian]] pages of The Complete Menu Solution project, [[plugin:livepreview]] action for local URL's.
* [[http://en.dklab.ru/lib/JsHttpRequest/demo/test/JsHttpRequest/t/test.php|JsHttpRequest demo page]].
* Tested with [[http://www.splitbrain.org/_media/projects/dokuwiki/dokuwiki-2006-03-09e.tgz?id=projects%3Adokuwiki&cache=cache|2006-03-09e]] , [[http://www.splitbrain.org/_media/projects/dokuwiki/dokuwiki-rc2006-10-08.tgz?id=projects%3Adokuwiki&cache=cache|rc2006-10-08]] DokuWiki versions and 2006-12-01 devel snapshot.
* Code is licensed under LGPL 2.
===== Example =====
JsHttpRequest/RemoteScript library has the interface nearly the same, as implemented in XmlHttpRequest/XMLHTTP.
How to use it.
Client-side example, taken from [[plugin:indexmenu2]].
function fetcher (s, callback) {
if ('undefined' == typeof RemoteScript) {
callback ({'state' : false,
'response' : 'Plugin RemoteScript is not available'});
return;
}
RemoteScript.query( ['indexmenu','getsubmenu']
,{ 'src' : s
,'sort' : '{$opts['sort']}'}
,function(js, txt) {
callback({'state' : !!js,
'response' : js||txt});
}
,true);
}
Server-side code:
require_once (DOKU_PLUGIN.'/indexmenu/syntax/indexmenu.php');
/*
* Returns submenu tree for specified namespace
*
* @param string $ns namespace title
* @param string $sort sorting mode
* @return {String} html markup for the submenu
* @access public
*/
function indexmenu_getsubmenu ($ns,$s) {
global $conf;
$opts = array($ns, array('level' => 1, // get only 1st level
'ajax' => true,
'js' => false,
'navigation' => false,
'sort' => $s
));
$im = & new syntax_plugin_indexmenu_indexmenu();
return preg_replace(array("#^$#i"),"",$im->_indexmenu($opts));
}
Yes, that's all i need to write to have complete ajax-driven menu on the page.
Detailed description and use examples you can find at [[http://en.dklab.ru/lib/JsHttpRequest/|JsHttpRequest home]].
===== Configuration =====
Actually, no configuration is needed.
===== How to install =====
Search and install the plugin using the [[plugin:extension|Extension Manager]]. Refer to [[:Plugins]] on how to install plugins manually.
* [[https://trello.com/1/cards/5b5cd79dc480cfee4787aaf5/attachments/5b5ce3b87590a69303eb8349/download/remotescript.zip|remotescript.zip]]
===== Changelog =====
* **2007-04-09 Version 0.8.3**:
* JsHttpRequest switched to 5.01 release
* **2007-02-13 Version 0.8.3**:
* special Safari update
* added UTF decoding routines, due to Safari's bugs in UTF-8 delivery
* **2007-02-13 Version 0.8.2**:
* removed calculation of DOKU_BASE constant, fixed issue FS#10
* **2007-02-10 Version 0.8.1**:
* fixed possible issue with str_replace, replaced with preg_replace
* fixed missing semicolons (thanks to the weird DokuWiki's script compressor)
* **2007-02-10 Version 0.8**:
* added simple 'query' method, similar to JsHttpRequest
* fixed bug FS#10 - plugin set wrong DOKU_BASE constant, when wiki is linked to the site with [[http://httpd.apache.org/docs/1.3/mod/mod_alias.html|Alias directive]]
* **2006-12-22 Version 0.7**:
* forced to use UTF-8 output, due to incorrect charset autodetection in the different cases
* backend updated to v4.17
* **2006-12-05 Version 0.5**:
* Added compatibility to develsnap 2006-12-01.
* **2006-10-25 Version 0.4**:
* Fixed issue with incorrect BASE_URL calculation under PHP/Win
* **2006-10-15 Version 0.3**:
* Fixed issue with incorrect DokuWiki installation detection in PHP part (derived from DokuWiki's core files).
* JsHttpRequest controller is updated to v4.10
* **2006-09-13 Version 0.2**:
* Fixed issue with incorrect DokuWiki installation detection.
* **2006-08-24 Version 0.1**:
* Released.
===== Todo =====
===== Bugs =====
==== 2007-11-15 ====
>>>>>>Two byte language encoded by UTF-8 is not correctly displayed.
>>>>>>I use RemoteScript with [[plugin:indexmenu2]].
>>>>>>I test in Korean(UTF-8) -- Alex K ( http://wiki.alexk.name )
>>>>>What should be displayed and what is actually displayed?
>>>>>Could you, please, make a test page somewhere in the wiki?
>>>>> --- //[[ilya@lebedev.net|Ilya Lebedev]] 2007-11-15 15:11//
>>>>The error sample link is http://ukira.cafe24.com/wiki/doku.php?id=wiki:navigation
>>>>There is some broken strings like '~~/a>'.
>>>>I found a clue.
>>>>At the line 311 of source $DOKU_PLUGINS/remotescript/lib/JsHttpRequest/JsHttpRequest.php file, there is '$v = iconv($fromEnc, 'UTF-8', $v);'.
>>>>I changed it to '$v = iconv('IOS-8859-1', 'UTF-8', $v);'. Then it works well. Apache 2.x and php 5.x.
>>>>But I tested in Apache 1.x and php 4.x. It works fail again.
>>>>Becuase of this I study AJAX now. :)
>>>I solved the problem. But I don't know what I did. :(
>>>Finally I modified JsHttpRequest.php file.
>>>I added 3 line ( 272,275,279 line).
>>>
244 /**
245 * Called in case of error too!
246 */
247 function _obHandler($text)
248 {
249 // Check for error.
250 if (preg_match('{'.$this->_uniqHash.'(.*?)'.$this->_uniqHash.'}sx', $text)) {
251 $text = str_replace($this->_uniqHash, '', $text);
252 }
253
254 // Make a resulting hash.
255 if (!isset($this->RESULT)) {
256 $this->RESULT = isset($GLOBALS['_RESULT'])? $GLOBALS['_RESULT'] : null;
257 }
258 $encoding = $this->SCRIPT_ENCODING;
259 $result = array(
260 'id' => $this->ID,
261 'js' => $this->RESULT,
262 'text' => $text,
263 );
264 if (function_exists('array_walk_recursive') && function_exists('iconv') && function_exists('json_encode')) {
265 $encoding = "UTF-8";
266 $this->_nonAsciiChars = join("", array_map('chr', range(128, 255)));
267 $this->_toUtfFailed = false;
268 array_walk_recursive($result, array(&$this, '_toUtf8_callback'), $this->SCRIPT_ENCODING);
269 if (!$this->_toUtfFailed) {
270 // If some key contains non-ASCII character, convert everything manually.
271 $text = json_encode($result);
272 $text = iconv('ISO-8859-1','UTF-8',$text);// I added this line
273 } else {
274 $text = $this->php2js($result);
275 $text = iconv('ISO-8859-1','UTF-8',$text); // I added this line
276 }
277 } else {
278 $text = $this->php2js($result);
279 $text = iconv('ISO-8859-1','UTF-8',$text); // I added this line
280 }
281
>>Try to rollback the changes and use the following line in 'rs.php'
>>
$JsHttpRequest =& new JsHttpRequest('UTF-8');
>>Maybe, your server does not recognize lowercase encoding name. --- //[[ilya@lebedev.net|Ilya Lebedev]] 2007-11-17 21:54//
>I did it today that you said.
>But, it's not a problem my server's recognition.
>I add the 3 lines code again. Thank you.
Please, try to replace line in //remotescript/script.js//
onready(_from_utf8(req.responseJS), _from_utf8(req.responseText));
with
onready(req.responseJS, req.responseText);
This conversion was made to fix Safari UTF-8 issues, maybe it breaks multibyte strings. --- //[[ilya@lebedev.net|Ilya Lebedev]] 2007-11-18 16:03//
===== Discussion =====
===== Feature request =====
===== Possible features =====