Расширение элемента пользовательского интерфейса Grid для ссылки на страницу

Я использую Agile Toolkit для некоторой разработки и хотел бы расширить существующий элемент управления сеткой, чтобы каждая строка содержала данные (как сейчас), а также ссылки на страницу со строкой запроса, которая содержит идентификатор. Я хочу иметь возможность сделать что-то вроде:

$this->add('Grid', 'short-name', 'template-tag', array('page?id=', 'id'))->setModel('mydatasource');

В настоящее время я могу использовать следующее:

$this->add('Grid', 'short-name', 'template-tag')->setModel('mydatasource');

Но я хотел бы иметь возможность указать страницу, на которую я ссылаюсь, как формат с полем, которое я хочу передать, чтобы щелкнуть в любом месте во второй строке:

1     Jack Johnson     Clerk
2     John Doe         Executive

Перенаправляет меня на: myapp.com/page?id=2

Как мне расширить элемент Grid для этого? Или мне нужно расширить весь путь от AbstractView или Lister?

Спасибо!

Полное рабочее решение:

precacheTemplate удалил ссылку из row_t для переменной, которую я определил в шаблоне html. Поэтому я следовал существующей практике, добавил еще один сброс переменной (т.е. где она устанавливает to ) to - таким образом, он остается в памяти в качестве ссылки для возврата к полю шаблона внутри общего formatRow, который перегружается из Basic Сетка.

Роман упоминал кое-что из этого раньше, но я наконец получил недостающую ссылку, где мне пришлось сбросить настройки.

Лучший способ понять это — сравнить построчно мою сетку и базовую сетку (да, я знаю, что я расширяюсь от расширенной).

Надеюсь, это поможет любому, у кого есть точно такой же вопрос.

На странице

$this->add('ExtendedUI_GridLinkedRow', array('dest_page'=>'home', 'name'=>'assessments'), 'assessments')
    ->setModel('GrantAssessment')
    ->addCondition('uid', 1);

GridLinkedRow.php

    <?php

class ExtendedUI_GridLinkedRow extends Grid_Advanced {

    function init(){
        parent::init();
    }

    function defaultTemplate(){
        return array('ExtendedUI/grid_linked_row');
    }

    function precacheTemplate(){
        // pre-cache our template for row
        // $full=false used for certain row init
        $row = $this->row_t;
        $col = $row->cloneRegion('col');

        // tbody -> column
        $row->setHTML('row_id','<?$id?>');
        $row->trySetHTML('odd_even','<?$odd_even?>');
        $col->setHTML('dest_link','<?$page_link?>');
        $row->del('cols');

        // thead -> column
        $header = $this->template->cloneRegion('header');
        $header_col = $header->cloneRegion('col');
        $header_sort = $header_col->cloneRegion('sort');

        // Totals -> column
        if($t_row = $this->totals_t){
            $t_col = $t_row->cloneRegion('col');
            $t_row->del('cols');
        }

        $header->del('cols');

        foreach($this->columns as $name=>$column){
            $col->del('content');
            $col->setHTML('content','<?$'.$name.'?>');

            if(isset($t_row)){
                $t_col->del('content');
                $t_col->setHTML('content','<?$'.$name.'?>');
                $t_col->trySetHTML('tdparam','<?tdparam_'.$name.'?>style="white-space: nowrap"<?/?>');
                $t_row->appendHTML('cols',$t_col->render());
            }

            // some types needs control over the td

            $col->setHTML('tdparam','<?tdparam_'.$name.'?>style="white-space: nowrap"<?/?>');

            $row->appendHTML('cols',$col->render());

            $header_col->set('descr',$column['descr']);
            $header_col->trySet('type',$column['type']);

            // TODO: rewrite this (and move into Advanced)
            if(isset($column['sortable'])){
                $s=$column['sortable'];
                // calculate sortlink
                $l = $this->api->getDestinationURL(null,array($this->name.'_sort'=>$s[1]));

                $header_sort->trySet('order',$column['sortable'][0]);
                $header_sort->trySet('sorticon',$this->sort_icons[$column['sortable'][0]]);
                $header_sort->set('sortlink',$l);
                $header_col->setHTML('sort',$header_sort->render());
            }else{
                $header_col->del('sort');
                $header_col->tryDel('sort_del');
            }

            if($column['thparam']){
                $header_col->trySetHTML('thparam',$column['thparam']);
            }else{
                $header_col->tryDel('thparam');
            }

            $header->appendHTML('cols',$header_col->render());

        }
        $this->row_t = $this->api->add('SMlite');
        $this->row_t->loadTemplateFromString($row->render());

        if(isset($t_row)){
            $this->totals_t = $this->api->add('SMlite');
            $this->totals_t->loadTemplateFromString($t_row->render());
        }

        $this->template->setHTML('header',$header->render());
    }

    function formatRow(){

        if(!$this->columns)throw $this->exception('No columns defined for grid');

        foreach($this->columns as $tmp=>$column){
            $this->current_row[$tmp.'_original']=@$this->current_row[$tmp];

            $formatters = explode(',',$column['type']);
            foreach($formatters as $formatter){
                if(!$formatter)continue;
                if(method_exists($this,$m="format_".$formatter)){
                    $this->$m($tmp,$column);
                }else throw new BaseException("Grid does not know how to format type: ".$formatter);
            }
            // setting cell parameters (tdparam)
            $this->applyTDParams($tmp);
            if($this->current_row[$tmp]=='')$this->current_row[$tmp]=' ';
        }
        $this->row_t->setHTML('page_link', $this->api->url($this->dest_page, array('id'=>$this->current_id)));
        return $this->current_row;
    }

}

Для шаблонов:

grid_linked_row.html

<?$Misc?>
<div id="<?$_name?>" class="atk-grid">
  <div class="atk-grid-panel">
    <?quick_search?><?/?>
    <div class="atk-buttons"><?grid_buttons?><?/?></div>
  </div>
  <table width="<?table_width?>100%<?/?>">
    <?header?>
    <thead class="ui-widget-header"><tr>
        <?cols?>
        <?col?>
        <th class="ui-widget-header" nowrap    <?$thparam?>><?sort?><i  style="float: left" class="ui-icon <?$sorticon?>"></i><a href="<?$sortlink?>"><?/sort?><?descr?>Customer<?/?><?sort_del?></a><?/?></th>
        <?/col?>
        <?/cols?>
    </tr></thead>
    <?/header?>

    <tbody class="grid_body">
      <?rows?>
      <?row?>
      <tr class="<?$odd_even?>" data-id="<?$row_id?>" rel="<?$row_id?>">
        <?cols?>
        <?col?>
        <td <?$tdparam?>><a href="<?$dest_link?>"><?$content?></a></td>
        <?/col?>
        <?/cols?>
      </tr>
      <?/row?>

      <?totals?>
      <tr class="atk-grid-totals">
        <?cols?>
        <?col?>
        <td <?$tdparam?>><?$content?></td>
        <?/col?>
        <?/cols?>
      </tr>
      <?/totals?>
      <?/rows?>


    </tbody>
    <?full_table?>
    <?/full_table?>
  </table>
  <?not_found?><div class="atk-grid-notfound ui-state-highlight ui-corner-all"><i class="ui-icon ui-icon-alert float-left"></i>No Records Found</div><?/not_found?>
  <div class="atk-paginator"><?paginator?><?/?></div>
  <?hidden_forms?><?/hidden_forms?>
</div>

person Omar Mir    schedule 04.09.2012    source источник


Ответы (1)


Если вы хотите обернуть все текстовые значения вашей сетки внутри ссылки, вы можете использовать следующее:

$this->add('MyGrid',array('dest_page'=>'page'), 'template-tag');


class MyGrid extends Grid {
    function format_text($field){
        parent::format_text($field);

        // Wrap the value inside a link
        $this->current_row_html[$field]='<a href="'.
            $this->api->url($this->dest_page, array('id'=>$this->current_id).'">'.
            ($this->current_row_html[$field]?:
             htmlspecialchars($this->current_row[$field],ENT_NOQUOTES,'UTF-8')).
            '</a>'
    }
}
person romaninsh    schedule 06.09.2012
comment
Привет @romaninsh, поле id становится пустым как в precachetemplate, так и в init - person Omar Mir; 08.09.2012
comment
Попробуйте this->current_id, если вы находитесь внутри formatRow или format_XXX - person romaninsh; 10.09.2012
comment
Пробовал @romaninsh $this-›setHTML('dest_link', $this-›api-›url($this-›dest_page, array('id'=›$this-›current_id))); внутри formatRow, но без кубиков - у него есть URL-адрес (и поле id), но я не знаю, какой объект шаблона мне нужно использовать. то есть $this-›template-›setHTML..... или $this-›setHTML.... - person Omar Mir; 10.09.2012
comment
Я обновил свой ответ. Он может содержать некоторые синтаксические ошибки, при необходимости исправьте его. Идея должна быть ясной. - person romaninsh; 11.09.2012
comment
Спасибо @romaninsh - я не использовал точное решение, которое вы опубликовали, но я, наконец, собрал рабочее решение из ваших советов, которое кажется чистым, т.е. я хотел остаться с целью вашей структуры - я не изменил напрямую какой-либо HTML напрямую. Я также опубликовал свое полное рабочее решение - пожалуйста, дайте мне знать, если вы думаете, что все в порядке :) - person Omar Mir; 11.09.2012
comment
Все в порядке, я бы не стал заморачиваться с изменением всего шаблона сетки и имел бы ссылку в PHP, поэтому этот вопрос и ответ предоставляют два альтернативных решения, и читатели смогут выбрать то, которое они сочтут более подходящим. . Спасибо за публикацию вашего решения. - person romaninsh; 14.09.2012
comment
Привет @romaninsh - я попробовал ваше решение, и оно работает, но это означает переопределение каждой отдельной функции формата, которую я не хотел делать. Я имитирую tr onClick с помощью: table .grid_body tr td a { display: block; ширина: 100%; высота: 100%; набивка: 0,67 см; текстовое оформление: нет; черный цвет; } Чтобы это работало, каждый столбец и формат должны быть оболочкой со ссылками, в том числе логическими и т. д. и т. д. - person Omar Mir; 14.09.2012