В ATK4, как перезагрузить страницу со значением, выбранным в поле выбора - PullRequest
1 голос
/ 17 сентября 2011

У меня есть страница с раскрывающимся списком, определенным следующим образом

$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

Итак, есть ли идеи о том, какой будет правильный синтаксис, чтобы он оценивал идентификатор выбранной опции, а не помещал имя выпадающего списка в качестве значения параметра?

Бит $ 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 ]

1 голос
/ 18 сентября 2011

ОК, так что я решил сам.

Мне нужно было создать отдельный файл .js в / templates / 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 *)1013 *

$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 с vaue выбранного списка и перезагружал страницу, используя URL http://localhost/test1/scrumwall?member=N, где N - член, выбранный в списке- фантастика.

0 голосов
/ 18 сентября 2011

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

Это реализуется с помощью функции $ .atk4.addArgument, определенной в start-atk4.JS файл.Существует также обёртка univ (). AddArgument ().Вы также можете использовать его для перенаправления, попробуйте

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