RadPHP XEのListViewにAjaxで項目を追加する。

RadPHP XEのListViewにAjaxで項目を追加する方法を試行錯誤した結果をまとめます。

なお、rpclは現時点での最新版を使用しています。

フォームにListViewとButtonを配置します。

Button1をクリックすると、ListViewに項目を追加します。

class Unit1 extends Page
{
   public $Button1 = null;
   public $ListView1 = null;
   function Button1Click($sender, $params)
   {
     //新しい項目を追加する
      $caption = 'New Item';
      $subitems = array('Sub Item 1', 'Sub Item 2');
      $item = $this->ListView1->addItem($caption, $subitems);
   }
   function Button1JSClick($sender, $params)
   {
      echo $this->Button1->ajaxCall('Button1Click');
      ?>
        //begin js
      return false;
        //end
      <?php
   }
}

Button1のJavascriptのOnClickイベントでButton1JSClickを実行します。
Button1JSClickではAjaxでButton1Clickを実行します。

さて、Button1をクリックするとListViewに項目が追加されます。
しかし、何度Button1をクリックしても、ListViewには項目が一つしか登録されません。

どうやら、AjaxではListViewに登録されている項目の情報が送信されていないため、
そのため毎回ListViewの項目がリセットされているようです。

そこで、ListViewの項目をパラメータで送信するようにしました。

function Button1JSClick($sender, $params)
{
   ?>
   //リストビューの項目をparamsに登録する
   params = ListView1.getTableModel().getData();
   <?php
   echo $this->Button1->ajaxCall('Button1Click');
   ?>
     //begin js
   return false;
     //end
   <?php
}

PHP側では、受け取ったListViewの項目の値を、ListViewに登録し直します。
引数$paramsにはリストビューの項目の値が入っています。

function Button1Click($sender, $params)
{
   //ListViewの項目を登録し直す
   foreach ($params as $row)
   {
     $caption = array_shift($row);
     $this->ListView1->addItem($caption, $row);
   }
   //新しい項目を追加する
   $caption = 'New Item';
   $subitems = array('Sub Item 1', 'Sub Item 2');
   $item = $this->ListView1->addItem($caption, $subitems);
}

これでAjaxでListViewに項目を追加できるようになりました。

まだ問題があって、ListItemのDataプロパティに登録した値が消えてしまいます。

function Button1Click($sender, $params)
{
   //ListViewの項目を登録し直す
   foreach ($params as $row)
   {
     $caption = array_shift($row);
     $this->ListView1->addItem($caption, $row);
   }
   //新しい項目を追加する
   $caption = 'New Item';
   $subitems = array('Sub Item 1', 'Sub Item 2');
   $item = $this->ListView1->addItem($caption, $subitems);

   //ListItemのDataプロパティにデータを登録する
   $item->Data = array('time' => date('G:H:i:s')); //記録されない
}

何かいい方法はないでしょうか。

追記:
コメント欄で教えたいただいた方法でAjaxでListViewの項目を編集することができました。
実際の方法は「RadPHPのListViewの項目をAjaxで編集する方法」をご覧ください。

コメント

  1. 高橋智宏さま
    教えていただいたブログを拝見しました。
    この方法を使うとうまくできそうですね。
    試してみます。

  2. Pingback: RadPHPのListViewの項目をAjaxで編集する « 山本隆の開発日誌

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください