0

我有一个带有 4 个下拉菜单和一个提交按钮的表单。当用户单击提交按钮时,我想转到我的控制器处理输入/输出,为用户提供选择,但使用正确的 URI。

下拉列表是根据用户的选择从 Ajax 动态生成的,第一个下拉列表除外。他们工作得很好。

处理用户输入的方法位于这个控制器中:/app/controllers/shop/kategorier索引方法如下所示:

public function index($fabrikat, $type, $model, $produktnr = '0')
{
    // get all the data from the model
    $data['all'] = $this->fetch->get_kategorier($fabrikat, $type, $model, $produktnr);

    print_r($data['all']);      
}

我的目标是:当用户点击提交按钮时,我不希望他们查看包含参数的确切 URL 的页面,例如。http://app.com/shop/kategorier/index/LG/WASH/FL9834X/0/这就是我真正想要的。

注意:手动访问此 URL 可以正常工作,并且控制器/模型会按应有的方式处理参数。

该如何做到这一点?我尝试了两件事,他们都失败了。有点。

  1. 我尝试使用 jQuery,并生成了一个带有“/”分隔符的所有参数的编码 URL 字符串,并在提交时更改了 .attr('href')。但那是一场噩梦,因为某些 $model 可以是例如。'CE1000C-T / XEE'等等

  2. 我试图在类别控制器中创建一个“代理”方法,获取所有输入->帖子并将它们附加到 a redirect('kategorier/'.$fabrikat.'/'.$etc),但这很愚蠢。

我宁愿不使用查询字符串/kategorier?fabrikat=LG&type=WASH

我的表格如下所示:

<?php echo form_open('shop/kategorier/'); ?>

<select id="fabrikat" name="fabrikat">
    <option name="0">Vælg Fabrikat</option>
    <?php foreach ($fabrikater as $f) : ?>
        <option value="<?php echo $f->Fabrikat; ?>" name="<?php echo $f->Fabrikat; ?>"><?php echo $f->Fabrikat; ?></option>
    <?php endforeach; ?>
</select>

<select id="type" name="type">
</select>

<select id="model" name="model">  
</select>

<div id="produktnummer-wrap" style="display:none">
    <select id="produktnummer" name="produktnummer">
        <option name="0" value="">Vælg Produktnummer</option>
    </select>
</div>

<?php echo form_submit('findparts', 'Find Reservedele'); ?>
<?php echo form_close(); ?>

我相信我在某种程度上把事情复杂化了,但现在我无法思考。我将非常乐意详细说明任何事情。我真的希望有人能够帮助我,在此先感谢。

4

2 回答 2

1

如果不使用一些 JavaScript,您将无法真正实现这一点:

<script type="text/javascript">

function update_selections()
{

  var base_url = '<?php echo site_url('shop/kategorier/index'); ?>/' + $('#fabrikat').val() + '/' + $('#type').val() + '/' + $('#model').val();
  if( $('#produktnummer').val() != "" )
  {
    base_url = base_url + '/' + $('#produktnummer').val();
  }

  document.location.href = base_url;
}

</script>

删除当前表单并使用 onclick 事件来触发它。

于 2012-11-20T22:55:55.773 回答
0

@Repox我昨晚确实想出了一种方法,实际上与您的解决方案非常相似。这是我所做的:

$("#find-btn").on("click", function() {
    var fab = $("select#fabrikat").val();
    var type = $("select#type").val();
    var model = $("select#model").val();
    var produktnummer = $("select#produktnummer").val();

    // we have to replace spaces in models and types
    model = model.replace(/\s+/g, '-');
    type = type.replace(/\s+/g, '-');

    // produktnummer can be empty
    produktnummer = (produktnummer === '') ? "0" : produktnummer;

    // we also have to URI encode the model and prodnr since it
    // can be horror strings like 'xy762 / ø23'
    model = encodeURIComponent(model);
    produktnummer = encodeURIComponent(produktnummer);

    // our url string to update the href
    var url = fab + '/' + type + '/'  + model + '/'  + produktnummer;

    // update the href with the specific parameters
    $(this).attr("href", "http://app.dev/kategorier/index/"+url);
});

虽然我在处理控制器和模型中的参数时需要非常小心,但之后需要对它们进行正确编码和解码。模型字符串的一小部分可能类似于:

'EX+ 340-34 / Ø14''77773+ -/ 23IK'

这对于我的控制器中的解码并不理想,str_replace('-', ' ', $str);因此我需要在选择替换字符之前检查大量数据。

但是,如果希望在 Codeigniter 中不必使用查询字符串就可以做到这一点,这可能是最好的解决方案。

于 2012-11-21T12:14:23.280 回答