2012-04-25 58 views
1

因此,我们有各种搜索页面,每个页面都有不同的搜索条件,所以我决定编写一个组件,它将从控制器获取传递给它的参数,收集必要的数据并返回然后我可以将其设置为在我的视图文件中使用的数组来填充下拉框以过滤条件。cakePHP自定义数组构建一个选择框

我已经设法让所有的东西写出来,我必须使用cakePHP帮助器来构建一个动态选择框。我深信,我做错了什么,如果有一个更简单的方法来做到这一点,仍然保持一定程度的动态请帮助,您可以:

// COMPONENT METHOD: 
public function filterQueries($parameters) { 

    // Get defaults from the user: 
    $criteria = $parameters["custom"]; 
    $defaults = $parameters["defaults"]; 

    // Validate the defaults the user may want and assign them to the return array: 
    if($defaults != "false") { 
     foreach($defaults as $key => $value) { 
      if(array_key_exists($value, $this->defaults)) { 
       $this->returnArray["defaults"][$value] = $this->defaults[$value]; 
      } 
     } 
    } 

    // Get all data for the custom requested form fields: 
    if($criteria != false) { 
     foreach($criteria as $model => $arguments) { 
      $fields = $arguments["fields"]; 
      $conditions = $arguments["conditions"]; 
      $recursive = $arguments["recursive"]; 
      if(!in_array($model,$this->uses)) { 
       $useModel = ClassRegistry::init($model); 
      } else { 
       $useModel = $this->$$model; 
      } 
      $array = $useModel->find("all",array("conditions" => $conditions, "fields" => $fields, "recursive" => $recursive)); 
      $this->returnArray["custom"][$model] = $array; 
     } 
    } 

    return $this->returnArray; 
} 

上述功能将得到其分解或者自定义数组搜索或默认值(以上未包括在内,但它的所有作品,它返回正是因为我本来期望它的阵列。

// The code within my action to get the content from above: 
// Load the Filters component to search data: 
     $search = $this->Components->load("Filter"); 

     // Tell search what you want: 
     $searchBoxes = array(
      "defaults" => array("statuses", "survey_type"), 
      "custom" => array(
       "User" => array(
        "fields" => array("User.id","User.first_name", "User.last_name"), 
        "conditions" => array("User.user_group_id" => "4f847c63-1840-446e-88be-3e4d29566cf0"), 
        "recursive" => -1 
      ) 
      ) 
     ); 

     $filterResults = $search->filterQueries($searchBoxes); 
     $this->set("filters",$filterResults); 

所以,现在我得到我的观点文件中这种多关联数组(都还是细)但我想现在基于上面创建的数组构建示例下拉列表中的用户,但结果与我预期的完全不同:

echo $this->Form->input('user_id', 
         array(
          "type" => "select", 
          "options" => $filters["custom"]["User"] 
         ) 
        ); 

HTML输出被打破,并显示如下:

<option value="last_name">Doe</option> 
<option value="first_name">Jihn</option> 
<optgroup label="User"> </optgroup> 
<optgroup label="1"> </optgroup> 
<option value="last_name">Marilyn</option> 
<option value="first_name">Monroe</option> 

我承认,我没有很多的蛋糕的经验,但不明白怎么刚才得到的结果:

<option value='USERID'>NAME</option> // Yes I know the names and surnames must be concatinated still 

关于如何做到这一点,做正确的方式提醒任何帮助或指导,将大大理解:)

VARDUMP ON $过滤器[“定制”] [“用户”]

array 
    0 => 
    array 
     'User' => 
     array 
      'id' => string '4f84840e-cda8-4704-8fdf-210729566cf0' (length=36) 
      'first_name' => string 'Name' (length=4) 
      'last_name' => string 'Surname' (length=11) 
    1 => 
     array 
     'User' => 
      array 
      'id' => string '4f8488cb-53e0-4f72-af73-3de229566cf0' (length=36) 
      'first_name' => string 'Name' (length=6) 
      'last_name' => string 'Surname' (length=6) 
+0

什么事情'的var_dump($过滤器[“custom”] [“User”])'看起来像? – Jack 2012-04-25 09:21:00

+0

阵列 0 =>数组 '用户'=>数组 'ID'=>字符串 '4f84840e-cda8-4704-8fdf-210729566cf0'(长度= 36) '如first_name'=>字符串 'NAME'(长度= 4) '姓氏'=>字符串 'SURNAME'(长度= 11) 1 =>数组 '用户'=>数组 'ID'=>字符串“4f8488cb-53e0-4f72-af73-3de229566cf0 '(长度= 36) 'first_name'=>字符串'NAME'(长度= 6) 'last_name'=>字符串'SURNAME'(长度= 6).....它返回所有其他用户 – mauzilla 2012-04-25 09:24:29

+0

哦,你可以编辑你的问题吗?很难阅读没有格式的评论。 – Jack 2012-04-25 09:25:08

回答

5

您可以通过执行提升你的输出如下的表中,您可以在模型中使用"virtualfields",如下所示:例如,如果您有用户模型,则可以defi NE如下:

public $virtualFields = array(
    'full_name' => 'CONCAT(first_name, " ",last_name)' 
); 

所以现在只要你拨打的用户模型的find法“FULL_NAME”字段将被得到。

2)要从选择框的表中获取数据,可以使用find('list')方法。例如,对于用户模型,如果你需要的表id,full_name (last and first name combined using the virtual fields),这是可以做到如下:

$this->User->find('list',array('fields'=>array('id','full_name'),'conditions'=>$conditions)) 

我希望这有助于..

+0

这个问题的关键是'find'方法的'list'参数。这有助于表单助手找出应该显示的值和应显示的内容。 – Arno 2012-05-02 12:33:37

+0

非常感谢。 – 2017-04-20 23:52:31

1

嗯,我想你想要做的实际上是创建一个格式化选项另一个数组什么。

foreach ($filters["custom"]["User"] as $arr) 
{ 
    $options[$arr['id']] = $arr['first_name'] . ' ' . $arr['last_name']; 
} 

然后

echo $this->Form->select('user_id', $options); 
+0

嘿,杰克,我明白你要去哪里,我很乐意这样做,但你会建议我这样做,还是有一种更有效的方式来做我想要达到的目标? – mauzilla 2012-04-25 09:34:19

+0

我不相信有任何其他方式,因为您需要以特定方式对选项进行格式化。 CakePHP form-> select使用数组键作为'name =“值”''和数组值作为表单文本。 http://book.cakephp.org/1.3/view/1430/select,但find查询中的'$ results'数组返回一个多维数组数组。 – Jack 2012-04-25 09:37:54

0

我想你需要的东西是这样的:对于合并两个字段

1):

$result = Set::combine($filters["custom"]["User"], 

         '{n}.User.id', // this is the value of select box 

         array(
           '{0} {1}', 
           '{n}.User.first_name', 
           '{n}.User.last_name' 
          ) // this is the text of select box 
        ); 

pr($result); 
0

$这个 - >形式 - >输入('inputname ',array('label'=> false,'options'=> array('Select optionstype','a','b'),'class'=> array('form-a','b'), 'id'=>'bacid','style'=>'width:280px;','value'=> $ abc ['model'] ['array_attribute']));

0

介绍CakePHP 3,我不能用 “virtualFields”,但我可以用如下:

//In PostsController 
$users = $this->Posts->Users->find('list', 
['keyField' => 'id', 
'valueField' => 'full_name', //Don't forget to call concatened field here 
'conditions' => $conditions, 
'order'  => $orderBy 
]); 

//here the magic happens 
$concat = $users->func()->concat(
['Users.first_name' => 'identifier', 
' ', 
'Users.last_name' => 'identifier' 
]); 

//selecting fields 
$users->select(['id', 'full_name' => $concat]); 

//sending to view 
$this->set('users', $users->toArray()); 

我希望这有助于CakePHP的3个开发商