1

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

$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 做到这一点。任何帮助表示赞赏。

谢谢

4

2 回答 2

1

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

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

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

在我想要下拉列表的页面中,我添加了一行来加载新的 .js $this->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);

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

于 2011-09-18T00:19:33.070 回答
0

敏捷工具包 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()
    )
);
于 2011-09-18T00:24:25.750 回答