В 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

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

Бит $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. Любая помощь приветствуется.

Спасибо


person Trevor North    schedule 17.09.2011    source источник


Ответы (2)


Хорошо, так что я разработал это сам.

Мне нужно было создать отдельный файл .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

$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 — участник, выбранный в список - фантастика.

person Trevor North    schedule 18.09.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()
    )
);
person romaninsh    schedule 18.09.2011
comment
Я пытался сделать такое перенаправление, но что мне использовать как $memberobj? - я попробовал это, используя $l1, который является коротким именем для формы, но это добавило member=test1_scrumwall_form_member.val() к URL-адресу, он не получил значение выпадающего списка? - person Trevor North; 18.09.2011
comment
да, это $l1, хотя это не форма, а поле. Нужно больше тестов/документации. Я думаю, что ваше собственное решение является правильным здесь. - person romaninsh; 18.09.2011