【问题标题】:Codeigniter: Submit parameters to controller, need correct URICodeigniter:向控制器提交参数,需要正确的 URI
【发布时间】:2012-11-20 16:16:11
【问题描述】:

我有一个带有 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,并生成了一个包含所有 带有“/”分隔符的参数,并更改了 .attr('href') on 提交。但那是一场噩梦,因为一些 $model 可以 例如。 'CE1000C-T / XEE'

  2. 我尝试在类别中创建一个“代理”方法 控制器获取所有输入->帖子并将它们附加到 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(); ?>

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

【问题讨论】:

    标签: php forms codeigniter url uri


    【解决方案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 事件来触发。

    【讨论】:

    • 感谢您的输入,我之前无法回答您。
    【解决方案2】:

    @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' OR '77773+ -/ 23IK'

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2013-10-06
      相关资源
      最近更新 更多