【问题标题】:Laravel dropdown without optgroup没有 optgroup 的 Laravel 下拉菜单
【发布时间】:2015-04-03 22:34:07
【问题描述】:

我决定尝试 Laravel,并想为我的表单创建下拉菜单。我在 BaseController 中创建了一个方便的方法,用于从数据库中获取数据。下面是函数列表:

protected function getList( $model, array $fields, $empty = 'Select option  below' )
{
    $options = array();

    $owner = strtolower( $model ) . 's';

    $records = $model::lists($fields[1], $fields[0]);

    if( !empty( $records ) ){

        foreach( $records as $key => $value ){

            $options[$owner][$value] = $key;
        }
    }


    $options[$owner][''] = $empty;

    return $options;
}

然后在控制器中你可以像这样使用它:

//Get groups
$groups = $this->getList( 'Group', array(
    'name', 'id'
  ));

//Get Project Managers  
$project_managers = $this->getList( 'ProjectManager', array(
  'name', 'id'
 ));

选择表单控件的输出有一个 optgroup,它引用列表的所有者或模型的所有者。如何删除 optgroup 使其不属于下拉列表内容的一部分?

下面是表单的输出:

<div class="input select">
  <label for="project_manager">Project Manager</label>
  <select name="project_manager_id">
    <optgroup label="projectmanagers">
      <option value="1">Riyaadh</option>
      <option value="2">Luyanda</option>
      <option selected="selected" value="">Select option below</option>
    </optgroup>
  </select>
</div>

【问题讨论】:

  • 您在选择下拉列表中获得 optgroups 的原因是您在 getLists 方法中添加它们,在线 $options[$owner][$value] = $key; 当数据中有多维数组时,选择会为每个添加 optgroups传递到 Form::select() ,关联键是组的标签,删除这些并且不会有任何 optgroups。简而言之,只需返回您的 $records 变量,所有的 optgroup 都将消失。
  • 嗨,马特!在我的可重用 BaseController 函数中仅返回 $records 变量只会用记录 ID 填充下拉列表。
  • 好吧,解决此问题的另一种方法是将$options[$owner][$value] = $key; 更改为$options[$value] = $key;,正如您所说,您正在向数组中添加另一个级别,从而添加 optgroup。
  • 谢谢马特。这解决了我的问题。我知道应该有办法做到这一点。这个想法是不要让我的控制器用两行代码来获取模型列表,因此想要创建一些可重用的东西。你拯救了我的一天.... :-)
  • 作为答案添加@LuyandaSiko

标签: php html laravel laravel-4


【解决方案1】:

您可以使用JQuery 删除,方法是添加 ID 来选择

 $(function () {
     $("#mySelect").children().remove("optgroup");
 });

【讨论】:

  • 嗨,卡姆莱什!你的 hack 让我的下拉菜单只剩下空字符串“Select blah blah blah”...
  • 刚刚检查过,它可以工作。我只是想知道它是否删除了我身边的所有东西。我会尝试复制它,看看我是否做错了什么,但我遇到的问题已经解决了。
  • 解决后端代码行为的方法永远不是前端代码。
【解决方案2】:

试试这个...

 $SchoolDetails = GeneralSettingModel::lists('SchoolName', 'id');

or

$SchoolDetails = DB::table('tablename')->lists('SchoolName', 'id');


    {{ Form::select('SchoolName',array(''=>'Select School')+$SchoolDetails,null, array('id'=> 'SchoolName'))}}

输出:

    <select id="SchoolName" name="SchoolName">
<option value="" selected="selected">Select School</option>
<option value="1">test</option>
<option value="2">test355wrew</option>
<option value="3">GOVT</option>
<option value="4">Kumaraguru</option>
<option value="5">valavan</option>
</select>

【讨论】:

  • 明确一点... GeneralSettingModel 是 Laravel 提供的对象吗?
  • 不,我们需要创建自定义模型
【解决方案3】:

您正在使用此行在 getLists 方法中添加另一个级别; $options[$owner][$value] = $key;,这是添加您的 optgroup 的内容,要摆脱这种情况,请将行更改为 $options[$value] = $key;

您可以选择将getLists 函数的代码缩减为以下内容;

protected function getList( $model, array $fields, $empty = 'Select option  below' )
{
    $options = array();

    $owner = strtolower( $model ) . 's';

    $records = $model::lists($fields[1], $fields[0]);

    if( !empty( $records ) ){

        $options = array_flip($records);
    }


    $options[''] = $empty;

    return $options;
}

这使用了array_flip方法,它将键作为值,将值作为键。

【讨论】:

    【解决方案4】:

    正如 Matt Burrow 所建议的那样,事实证明我正在创建一个多维数组,该数组被转换为带有 optgroup 的列表。

    我修改了我的函数以排除记录所属的所有者。以下是我完美的工作功能(摘录):

     ...
     if( !empty( $records ) ){
    
        foreach( $records as $key => $value ){
    
           $options[$value] = $key;
        }
     }
    
     $options[''] = $empty;
     ...
    

    【讨论】:

      猜你喜欢
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      相关资源
      最近更新 更多