NPJ next: xAJAX

Пример

здесь (смотреть лучше под FF, потому что tinyMCE какой-то попался кривой и под IE не пашет, а возиться с ним я не буду, потому что это просто пример...) UPD: ok-ok, это мои кривые руки, все работает! (Aналогично под CI, можно посмотреть здесь)

Bugs: в Манифесто в core/classes/StateSet.php возникли небольшие затруднения, пришлось закомментить пару строк.

Вообще, аякс чувствителен к предупреждениям, которые вылезают в движке (а их, увы, много).

Библиотеки (xajax и tinyMCE) лежат в папке lib/

Настройки модуля лежат в /npj_config.php, а обратиться к ним можно из любого места как к 

$this->rh->modules["имя_модуля"]["что-то_там"]

Tips & Tricks

Вот это лежит в отдельном каталоге модуля:

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;

?>