Пример
здесь (смотреть лучше под FF, потому что tinyMCE какой-то попался кривой и под IE не пашет, а возиться с ним я не буду, потому что это просто пример...) UPD: ok-ok, это мои кривые руки, все работает! (Aналогично под CI, можно посмотреть
здесь)
Bugs: в Манифесто в core/classes/StateSet.php возникли небольшие затруднения, пришлось закомментить пару строк.
Вообще, аякс чувствителен к предупреждениям, которые вылезают в движке (а их, увы, много).
Библиотеки (xajax и tinyMCE) лежат в папке lib/
Настройки модуля лежат в /npj_config.php, а обратиться к ним можно из любого места как к
$this->rh->modules["имя_модуля"]["что-то_там"]
Tips & Tricks
- Если xajax вдруг ни с того ни с сего молча умер (например, при нажатии на submit запрос-таки действительно ушел через GET/POST), возможно, ошибка в js-функции на стороне браузера (фигнюшка вроде пропущенной запятой...)
- Крайне полезно вызвать когда нужно $this->xajax->setCharEncoding('cp1251'); (xajax 0.5) Но при некоторых условиях IE может взбрыкнуть. (UPD: Нужно установить кодировку для $objResponse с помощью $objResponse->setCharacterEncoding('cp_1251');, тогда в IE все будет ок. Названия этих двух методов в версии 0.5 не совпадают для $xajax и $objResponse).
- После вызова xajax-функции не забыть добавить return false;
- tinyMCE крайне капризный и его надо настраивать долгими бессонными ночами с любовью и терпением. В частности, вопреки всем руководствам у меня он стал более-менее корректно работать только после явного указания debug: false.
- CSS для tinyMCE можно подкрутить через настройки или просто указать, какой файл ему использовать.
- В версии 3.0b? надо писать save_onsavecallback: myFunction, а в более ранних – save_on_save_callback или как-то так.
Вот это лежит в отдельном каталоге модуля:
classes/UploadSubspace.php
Называться может, в принципе, как угодно, имя файла указывается в npj_config.php – файле конфигурации модуля, лежащего в верхней папке модуля.
UPD: Конструктор должен выглядеть вот так. Но движок все равно нужно дебажить.
<?
function UploadModule ( &$rh, $base_href, $module_config, &$object ) {
NpjModule::NpjModule( &$rh, $base_href, $module_config, &$object );
// $this->config["upload"] = array(); // override config
}
?>
<?php
/*
UploadSubspace
---------- за основу взят:
Демо "модуль субпространства"
ModuleDemoSubspace( &$rh, $base_href, $message_set, $section_id=0, $handlers_dir="", $messageset_dir="" )
- $message_set -- какой присоединить набор с сообщениями для вывода?
- $section_id -- идентификатор гигантского раздела сайта (не группы внутри модуля)
- $handlers_dir, $messageset_dir -- в замену стандартным из $rh->..
---------
========================================= v.1 (kuso@npj)
*/
define ('DEBUG', false); // дебаггер xajax
class UploadSubspace extends NpjModule
{
var $module_name = "UploadSubspace"; // for use in debug
var $xajax;
function _initXajax() {
// AJAX
define ('AJAXPATH', $_SERVER['DOCUMENT_ROOT'].'/lib/xajax');
require_once(AJAXPATH."/xajax_core/xajax.inc.php");
$this->xajax =& new xajax();
$this->xajax->configure('javascript URI', '/lib/xajax');
if (DEBUG) $this->xajax->configure('debug', true);
// здесь регистрируем функции, которые работают асинхронно
$this->xajax->registerFunction(array("process_form_data", &$this, "process_form_data"));
$this->xajax->processRequest();
}
// эта функция через аякс. В js ей должна соответствовать функция xajax_process_form_data, т.е. должно начинаться с xajax_
// и так для всех, если их много
function process_form_data($form_data) {
$objResponse = new xajaxResponse();
$result = $form_data['content_area'];
if ($result==='') $result='nothing...';
$objResponse->assign("div_result", "innerHTML", $result);
return $objResponse;
}
// тут происходит выбор хэндлера на основе введенного урла
function Init( $rel_url )
{
$this->method = "default";
$this->params = array();
$parts = explode("/", trim($rel_url,"/"));
if ($rel_url == "xajax")
{
$this->_initXajax();
$this->method = "xajax";
$this->params = $parts;
array_shift($this->params);
}
}
// EOC { UploadSubspace }
}
?>
templates/xajax.html
{{TEMPLATE:Xajax}}
<!-- xajax JavaScript-->
{{_xajax}}
<!-- tinyMCE -->
<script type="text/javascript" src="{{_tinymce}}"></script>
<script type="text/javascript">
tinyMCE.init({
mode : "exact",
theme : "advanced",
elements : "content_area",
convert_urls : false,
relative_urls : false,
});
</script>
<!-- /tinyMCE -->
<script language="javascript" type="text/javascript">
function do_submit() {
tinyMCE.triggerSave(false, false);
xajax_process_form_data(xajax.getFormValues('form_tinymce', false, 'content'));
}
</script>
<div id="form_tinymce" name="form_tinymce" align="center">
<form method="post" action="#" onsubmit="do_submit(); return false;">
<textarea id="content_area" name="content_area" rows="20" cols="60"></textarea>
<br>
<input type="submit" name="save" value="Submit" />
<input type="reset" name="reset" value="Reset" />
</form>
</div>
<hr>
<div id="div_result" class="center"><i>Your text...</i></div>
{{/TEMPLATE:Xajax}}
handlers/xajax.php
Самый обычный, следует только обратить внимание, что переменные, передаваемые в шаблон, должны
передаваться через объект движка шаблонов, создаваемого в самом хэндлере (а не через $tpl, который парсит шаблоны общих для всего НПЖ шкур).
<?php
$TE = &$this->GenerateTemplateEngine( $this->config["template_engine"] );
$TE->Assign("_xajax", $this->xajax->getJavascript() );
$TE->Assign("_tinymce", "/lib/tiny_mce/tiny_mce_src.js");
$tpl->Assign("Html:TITLE", $this->module_name.": ".$tpl->GetValue("Preparsed:TITLE") );
$tpl->Assign("Preparsed:TITLE", "" );
$tpl->Assign("Preparsed:CONTENT", $TE->Parse("xajax.html") );
$tpl->Assign("Preparsed:TIGHT", 1);
$tpl->Assign("Preparsed:TIGHT_COMMENTS", 1);
return GRANTED;
?>