私は解決策を打ちのめしました。あまりエレガントではありませんが、機能します。
ビューの下部:
echo $this->Html->scriptBlock(
'function sendAjaxRequest(){
$.ajax({
type: "POST",
url: "' . $this->Html->url(array('controller' => 'clients', 'action' => 'add_external')) . '",
data: "name="+$(\'#JobNewClientName\').val(),
success: function(msg){
//parse and sort the entries alphabetically
msg = $.parseJSON(msg);
var values = [];
for(var i in msg) {
values.push({ key: i, value: msg[i] });
}
values.sort(function(a, b) {return a.value.toLowerCase().localeCompare(b.value.toLowerCase())});
var str = values.map(function (kvp) { return kvp.value; }).join(\'\n\');
//remake the selectbox options
var options = \'<option value=""></option>\';
$.each(values, function(i){
options += \'<option value="\'+values[i].key+\'">\'+values[i].value+\'</option>\';
});
$(\'#JobClientId\').html(options);
}
});
}');
コントローラ:
function add_external() {
$this->autoRender = false;
$this->Client->create();
$this->Client->set('name', $_POST['name']);
$this->Client->save();
echo json_encode($this->Client->find('list', array('order' => array('Client.name' => 'ASC'))));
}
基本的に、このadd_external()
関数はajaxから投稿された名前を取得し、それをデータベースに追加します。次に、それはjson_encode
すべてのクライアントです。
次に、このJSONオブジェクトが解析され、javascript successステートメントで並べ替えられます。この並べ替えでは、コントローラーによって定義された順序、つまりキーではなく値のアルファベット順が保持されます。
options
次に、選択ボックスに必要なのと同じマークアップを含む新しい変数を作成できます。その後、私がする必要があるのはそれらを切り替えることです。
誰かがもっとエレガントな解決策を考えることができれば、私は彼らに受け入れを与えたいと思います。