是否可以重新加载一行ATK4 Grid?

时间:2012-12-05 13:18:54

标签: atk4 php

是否可以仅重新加载一行ATK4 Grid?

例如,在Form中进行更改后,大部分时间都在CRUD中,您只需要重新加载一个网格行而不是所有Grid对象。

修改

我很抱歉没有明确表示我对ATK4(敏捷工具包)框架专门针对此功能感兴趣。我在这个问题上添加了atk4标签,但在主题和问题正文中没有提到“ATK4”。对不起。

我或多或少知道如何用jQuery以标准方式做到这一点,但我感兴趣的是,在ATK4框架中如何更容易地做到这一点。比如$ grid-> row(ID) - > reload()或类似的东西。

3 个答案:

答案 0 :(得分:1)

Agile Toolkit不为此提供开箱即用的功能。它曾经是ui.atk4_grid.js的一部分,仍然可以找到它会向Grid视图发送一个自定义请求,但是这些表并不总能很好地用于此,然后有时您还需要重新加载多行

您拥有为此构建附加组件的所有工具。您需要调用grid :: formatRow()一次并返回HTML,然后使用JS将其插入到网格中。

以下是旧的(删除)方法:

function getRowContent($id,$datatype='jquery'){

    // if DB source set
    if(isset($this->dq)){
        // *** Getting required record from DB ***
        $idfield=$this->dq->args['fields'][0];
        if($idfield=='*'||strpos($idfield,',')!==false)$idfield='id';
        $this->dq->where($idfield,$id);
        //we should switch off the limit or we won't get any value
        $this->dq->limit(1);
        #zak: This fix is if grid is not using the $this->api->db database but some else it hsould be depending only on $this->>
        $row_data=$this->dq->do_getHash(); //$this->api->db->getHash($this->dq->select());
    }
    // if static source set
    elseif(isset($this->data)){
        $found=false;
        foreach($this->data as $index=>$row){
            if($row['id']==$id){
                $row_data=$row;
                $found=true;
                break;
            }
        }
        // no data found, returning empty string
        if(!$found)return "";
    }
    else return "";
    // *** Initializing template ***
    $this->precacheTemplate(false);

    // *** Rendering row ***
    $this->current_row=$row_data;
    $this->formatRow();

    // *** Combining result string ***
    $func='formatRowContent_'.$datatype;
    return $this->$func($id);
}
protected function formatRowContent_html($id){
    $this->row_t->set($this->current_row);
    return $this->rowRender($this->current_row);
}
protected function formatRowContent_ajax($id){
    $result="";
    foreach($this->columns as $name=>$column){
        $result.=$this->current_row[$name]."<t>".$this->current_row[$name.'_original'].
            // appending styles as structured string
            "<t>".$this->getFieldStyle($name,$id).
            "<row_end>";
    }
    return $result;
}
protected function formatRowContent_jquery($id){
    $result=array();
    $i=1;
    foreach($this->columns as $name=>$column){
        $result[$i]['data']=array('actual'=>$this->current_row[$name],
            'original'=>$this->current_row[$name.'_original']);
        $result[$i]['params']=$this->tdparam[$this->getCurrentIndex()][$name];
        $i++;
    }
    $result=json_encode($result);
    return $result;
}

希望这会对你有帮助。

答案 1 :(得分:1)

在atk4中使用js() - &gt; univ() - &gt; reloadRow($ id),它处理jquery客户端部分以刷新一行。现在,当此reload_row请求到达时,网格(服务器部分)还需要输出一行而不是整个网格。这可以通过以下网格扩展(基于网格/内联的运行方式)来完成:

Class TestGrid extends Grid {

  function init() {
    parent::init();
    if($row_id=$_GET[$this->name.'_reload_row']){
      $g=$this;
      $this->api->addHook('pre-render',function() use($g,$row_id){
        $g->precacheTemplate();
        foreach($g->getIterator() as $g->current_id=>$g->current_row){
          if($row_id == $g->current_id) {
            $g->formatRow();
            $result=$g->rowRender($g->row_t);
            if($g->api->jquery)$g->api->jquery->getJS($g);
            break;
          }
        }
        throw new \Exception_StopRender($result);
      });
    }
  }
}

为了在页面上使用CRUD进行测试(它也应该仅适用于Grid):

$g=$this->add('CRUD', array('grid_class' => 'TestGrid'));
$g->setModel('User');
if($g->grid) {
  $g->grid->addColumn('button', 'rerow');
  if($row_id = $_GET['rerow']){
    $g->grid->js()->univ()->reloadRow($row_id)->execute();
  }
}

这会产生带有额外按钮'Rerow'的CRUD,点击时会重新加载特定行。

答案 2 :(得分:0)

在谈到CRUD时,您可能有一些包含数据行的概述。 我点击具体行上的Edit后你可能会打开一个包含表单的弹出窗口,允许用户更改该行的数据。正如您要求刷新一个具体的行,我也猜测您正在使用AJAX调用发送和存储数据。

好吧,在这里你可以利用AJAX的onSuccess部分(当使用jQuery $.ajax时)。您必须存储行ID才能在提交数据后正确地对其进行寻址。成功执行AJAX调用后,将调用onSuccess句柄,您应该使用先前存储的行ID实现将对该行进行寻址的代码,并使用当前已提交和存储的数据重置单元格中的数据