我有一个页面,下拉列表定义如下
$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做到这一点。任何帮助表示赞赏。
由于
答案 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()
)
);