2011-09-17 18 views
1

我有一個頁面被定義爲一個下拉列表中選擇的值重新加載頁面如下在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"); 

,但它並不穿上平變化引號之間的,而是會將其作爲一個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做到這一點。任何援助讚賞。

謝謝

回答

1

好的,所以我自己工作。

我需要創建一個單獨的.js文件在/模板/ JS所謂my_univ.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); 

最後一行告訴它何時列表發生變化,要調用我的上面的函數將列表的名稱傳遞給它,以便當用戶更改下拉列表時,它會創建一個包含所選列表的vaue的新URL並重新加載頁面使用URL http://localhost/test1/scrumwall?member=N其中N是列表中選擇的成員 - 太棒了。

+0

這是手動的方式做到這一點。退房http://api.jquery.com/jQuery.param – romaninsh

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())); 

這是通過啓動atk4.js文件中定義的$ .atk4.addArgument功能實現。還有一個包裝univ()。addArgument()。您也許可以使用它來重定向也嘗試

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

我試圖做這樣的重定向,但我作爲$ memberobj使用什麼? - 我試過使用$ l1這是表單的簡稱,但是這個添加成員= test1_scrumwall_form_member.val()到URL,它沒有得到下拉列表的值? –

+0

是的,這是$ l1,雖然它不是形式,但它是一個領域。需要更多的測試/文檔。我認爲你自己的解決方案在這裏是正確的。 – romaninsh

相關問題