在ATK4中,如何使用选择框中选择的值重新加载页面

时间:2011-09-17 14:54:01

标签: drop-down-menu selectedindex atk4

我有一个页面,下拉列表定义如下

$memb=$this->api->db->dsql()->table('vscrum_member m')
     ->field('m.id')
     ->field('m.name')
     ->where('m.team_id',$p->api->auth->get('team_id'))
     ->order('m.xlastname, m.xfirstname')
     ->do_getAssoc();

    $f=$p->add('Form');
    $l1=$f->addField('dropdown','member')->setValueList($memb);

我需要重新加载页面,并在用户更改时通过下拉列表的当前值(GET或POST很好)。

在ATK4中,我可以使用此

重定向页面
$l1->js('change')->univ()->redirect($this->api->getDestinationURL(null));

理论上,您可以添加一个值数组作为第二个参数,它们将成为GET变量

$l1->js('change')->univ()
   ->redirect($this->api->getDestinationURL(null, array('member'=>123);

但由于我不知道在客户端选择的值,这没有帮助。 在javascript中,您可以使用

选择选择框的当前值
 this.options[this.selectedIndex].value

在jquery中你可以使用

  $('#name').val();

但到目前为止,我最接近的是使用

$l1->js('change')->univ()->redirect($this->api->getDestinationURL(null, 
          array('member'=>$l1->js(true)->val())));

这是重定向到

http://localhost/test1/scrumwall?
      member=%24%28%27%23test1_scrumwall_form_member%27%29.val%28%29

那么任何想法是正确的语法是什么,以便它评估所选选项的id,而不是将下拉列表的名称作为参数值?

$ l1-> js('change')位在下拉列表中添加onchange =“” - 也许有一些方法可以 在引号之间直接插入javascript但无法看到任何示例。

我试过这种方式

 $l1->js('change')->univ()->js(null, 
    "window.location='http://localhost/test1/scrumwall?member='+this.options[this.selectedIndex].value");

但它并没有将它放在onchange上的引号之间,而是将它添加为绑定到下拉列表的jquery函数(请参阅下面的浏览器视图源中的结果),但这也不起作用。

$('#test1_scrumwall_form_member').bind('change',function(ev){    
   ev.preventDefault();ev.stopPropagation(); 
   $('#test1_scrumwall_form_member').univ().js(null,'window.location=\x27
      http://localhost/test1/scrumwall?member=\x27+this.options[this.selectedIndex].value')
 });

所以我无法弄清楚如何用ATK4做到这一点。任何帮助表示赞赏。

由于

2 个答案:

答案 0 :(得分:1)

好的,所以我自己解决了。

我需要在/ templates / js中创建一个名为 my_univ.js 的单独的.js文件,其中包含以下内容

$.each({
viewMember: function(url, name){              
          document.location.href=url+'?member='+$(name).val();
}
},$.univ._import);

在我想要下拉列表的页面中,我添加了一行来加载新的.js         $这 - > JS() - > _load( 'my_univ');

从URL或登录用户获取值(如果没有给出

    if ($_GET['member']){
      $member=$_GET['member'];
    } else {
      $member=$p->api->auth->get('id');
    }

添加行以从数据库表填充下拉列表(包括将当前列表值设置为登录用户或GET参数

$memb=$this->api->db->dsql()->table('vscrum_member m')
     ->field('m.id')
     ->field('m.name')
     ->where('m.team_id',$p->api->auth->get('team_id'))
     ->order('m.xlastname, m.xfirstname')
     ->do_getAssoc();

    $f=$p->add('Form');
    $l1=$f->addField('dropdown','member')->setValueList($memb)->set($member);

    $l1->js('change')->univ()->viewMember($p->api->getDestinationURL(null),$l1);

最后,在用于填充页面的主模型中,添加条件

    $st = $p->add('Model_Story');
    $st->addCondition('team_id', $p->api->auth->get('team_id'));
    $st->addCondition('responsible', $member);

最后一行告诉它列表更改时,调用我的上面函数传递列表名称,这样当用户更改下拉列表时,它会创建一个带有所选列表的vaue的新URL并重新加载页面使用URL http://localhost/test1/scrumwall?member=N,其中N是列表中选择的成员 - 太棒了。

答案 1 :(得分:0)

Agile Toolkit URL处理中有一个机制,允许将其作为数组传递,格式如下:

{
    0:url,
    arg: val,
    arg2: val
}

atk4_loader支持指定为数组的URL,如下所示:

$(element).atk4_load({0:url, member:val});

现在,在PHP中,您可以使用它来加载或重载参数。 http://demo.atk4.com/demo.html?t=5。在你的情况下:

$area2=$this->add('HtmlElement')->set('Data is '.(int)$_GET['member'])`
$l1->js('change', $area2->reload('member'=>$l1->js()->val()));

或者您也可以致电:

$myview->js(true)->atk4_load(array($url,'member'=>$otherview->js()->val()));

这是通过start-atk4.js文件中定义的$ .atk4.addArgument函数实现的。还有一个包装器univ()。addArgument()。您也可以将它用于重定向,尝试

$this->js()->univ()->redirect(
    array(
        $this->getDestinationURL('my page'),
        'member'=>$memberobj->js()->val()
    )
);