Как реализовать jqgrid v3.7 в моем веб-приложении, созданном с использованием cakephp 1.3 - PullRequest
0 голосов
/ 01 июля 2010

Я пытаюсь реализовать jqgrid v3.7 в моем веб-приложении, созданном с использованием cakephp v1.3.

Мой код контроллера выглядит следующим образом

function admin_index()
{
    // get how many rows we want to have into the grid - rowNum parameter in the grid
    $limit = $this->params['url']['rows'];

    // get index row - i.e. user click to sort. At first time sortname parameter -
    // after that the index from colModel
    $sidx = $this->params['url']['sidx'];

    // sorting order - at first time sortorder
    $sord = $this->params['url']['sord'];

    // if we not pass at first time index use the first column for the index or what you want
    if( !$sidx ) $sidx = 1;

    // calculate the number of rows for the query. We need this for paging the result
    $row = $this->Constituency->find('count');
    $count = $row;

    // calculate the total pages for the query
    if( $count > 0 )
    {
        $total_pages = ceil($count / $limit);
    }
    else
    {
        $total_pages = 0;
    }

    // if for some reasons the requested page is greater than the total
    // set the requested page to total page
    if( $page > $total_pages ) $page = $total_pages;

    // calculate the starting position of the rows
    $start = $limit * $page - $limit;

    // if for some reasons start position is negative set it to 0
    // typical case is that the user type 0 for the requested page
    if( $start < 0 ) $start = 0;

    // the actual query for the grid data
    $limit_range = $start . "," . $limit;
    $sort_range = $sidx . " " . $sord;
    //$result = $this->Constituency->findAll(null, "id,name", $sort_range, $limit_range, 1, null);
    $this->Constituency->recursive = -1;
    $result = $this->Constituency->find('all', array(
        'fields' => array('id', 'name'),
        'order' => $sidx,
        'limit' => $start .",". $limit_range
    ));

    $i=0;
    $response->page = $page;
    $response->total = $total_pages;
    $response->records = $count;

    foreach($result as $result)
    {
        $response->rows[$i]['id'] = $result['Constituency']['id'];
        $responce->rows[$i]['cell']=array($result['Constituency']['id'],$result['Constituency']['name']);
        $i++;
    }

    echo json_encode($response);
}

файл представления содержит следующий код

$this->Html->css('ui.jqgrid');
$this->Html->script('jquery.jqGrid.min');

<script type="text/javascript">
    $(document).ready(function(){
        $("#list").jqGrid(
        {
            url:'<?php echo $this->Html->url(array("controller" => "constituencies", "action" => "index")); ?>',
            datatype: "json",
            colNames:['Id','Name'],
            colModel:[
                {name:'id',index:'id', width:55},
                {name:'name',index:'name', width:90},
            ],
            rowNum:10,
            rowList:[10,20,30],
            pager: jQuery('#pager'),
            sortname: 'id',
            viewrecords: true,
            sortorder: "desc",
            caption:"Constituencies"
        });
        $("#list").navGrid("#pager",{edit:false,add:false,del:false});
    })
</script>

<div class="constituencies index">
    <h2><?php __('Constituencies'); ?></h2>
    <table id="list"  class="scroll"></table>
    <div id="pager"  class="scroll" ></div>
</div>

Теперь, когда я загружаю действие индекса, я получаю много ошибок

Неопределенный индекс: строки Неопределенный индекс:sidx Неопределенный индекс: sord и т. д. и т. д.

Кто-нибудь включил jqgrid в приложение на основе cakephp?

Как включить jqgrid в мое приложение?Пожалуйста, помогите мне сделать это.

Спасибо

Ответы [ 3 ]

1 голос
/ 01 июля 2010

Ошибки, которые вы получаете, выглядят как ошибки PHP.Попробуйте поместить оператор debug($this->params); в верхней части файла представления, чтобы увидеть, что выдает контроллер.

1 голос
/ 12 июля 2010

Были некоторые неверные значения, назначенные в функции поиска для модели избирательного округа.

Вот правильный полный рабочий код:


ЭТО КОД КОНТРОЛЛЕРА:


1.) Оставьте функцию, в которой сетка отображается пустым, как это

function index()
{

}


2.) Затем создайте новую функцию для отображенияСетка с данными, подобными этим:

function admin_showGrid()
{
    $this->autoRender = false;

    // get how many rows we want to have into the grid - rowNum parameter in the grid
    $limit = $this->params['url']['rows'];

    // get index row - i.e. user click to sort. At first time sortname parameter -
    // after that the index from colModel
    $sidx = $this->params['url']['sidx'];

    // sorting order - at first time sortorder
    $sord = $this->params['url']['sord'];

    $page = $this->params['url']['page'];

    // if we not pass at first time index use the first column for the index or what you want
    if( !$sidx ) $sidx = 1;

    // calculate the number of rows for the query. We need this for paging the result
    $row = $this->{Model_Name}->find('count');
    $count = $row;

    // calculate the total pages for the query
    if( $count > 0 )
    {
        $total_pages = ceil($count / $limit);
    }
    else
    {
        $total_pages = 0;
    }

    // if for some reasons the requested page is greater than the total
    // set the requested page to total page
    if( $page > $total_pages ) $page = $total_pages;

    // calculate the starting position of the rows
    $start = $limit * $page - $limit;

    // if for some reasons start position is negative set it to 0
    // typical case is that the user type 0 for the requested page
    if( $start < 0 ) $start = 0;

    // the actual query for the grid data
    $limit_range = $start . "," . $limit;
    $sort_range = $sidx . " " . $sord;
    //$result = $this->{Model_Name}->findAll(null, "id,name", $sort_range, $limit_range, 1, null);
    $this->{Model_Name}->recursive = -1;
    $result = $this->{Model_Name}->find('all', array(
        'fields' => array('id', 'name'),
        'order' => $sort_range,
        'limit' => $limit_range
    ));

    $i = 0;
    $response->page = $page;
    $response->total = $total_pages;
    $response->records = $count;

    foreach($result as $result)
    {
        $response->rows[$i]['id'] = $result['{Model_Name}']['id'];
        $response->rows[$i]['cell'] = array($result['{Model_Name}']['id'], $result['{Model_Name}']['name']);
        $i++;
    }

    echo json_encode($response);

    //writing exit() is necessary.
    exit();
}




ЭТО КОД ОБЗОРА:


1.) включаетнеобходимые файлы

echo $this->Html->css('ui.jqgrid');

echo $this->Html->script('grid.locale-en');
echo $this->Html->script('jquery.jqGrid.min');


2.) добавьте следующий код javascript в ваш файл VIEW

<script type="text/javascript">
jQuery(document).ready(function(){
    jQuery("#list").jqGrid(
    /* '#list' is the ID of the table in which you want populated results */
    {
        url:'<?php echo $this->Html->url(array("controller" => "{Controller_Name}", "action" => "{Action_Name}")); ?>',
        datatype: "json",
        mtype: "GET",
        colNames:['Id','Name'],
        colModel:[
            {name:'id',index:'id', width:55},
            {name:'name',index:'name', width:90},
        ],
        rowNum:10,
        rowList:[10,20,30],
        pager: jQuery('#pager'), /* id of the pagination element */
        sortname: 'id',
        viewrecords: true,
        sortorder: "asc",
        caption:"Enter table Heading or the name you want to show for the table",
        height:"auto",
        autowidth: true
    });
    jQuery("#list").navGrid("#pager",{edit:false,add:false,del:false});
})
</script>


3.) И, наконец, HTML в том же файле представления

<table id="list" style="height:auto;"></table>
<div id="pager"></div>


Если у вас все еще есть проблемы с кодом выше, сообщите мне.

1 голос
/ 01 июля 2010

Я сам не использую CakePHP, но, вероятно, две ссылки http://www.trirand.com/blog/?page_id=393/help/integration-of-cakephp-and-jqgrid-tutorial/ а также http://www.trirand.com/blog/?page_id=393/help/how-to-integrate-jqgrid-with-cakephp/ может быть полезным для вас.

...