2012-04-25 12 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 

それを行うと、それを正しい方法を行う方法上の任意のアドバイスのヘルプやガイダンスは、いただければ幸いです:)

$フィルタON VARDUMP [「カスタム」] [「ユーザー」]

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

を役に立てば幸い["custom"] ["User"]) 'のように見えますか? – Jack

+0

アレイ 0 => アレイ 'ユーザ' => アレイ 'ID' =>文字列 '4f84840e-cda8-4704-8fdf-210729566cf0'(長さ= 36) 'FIRST_NAME' =>文字列 'NAME'(長さ= 4) 'LAST_NAME' =>文字列 'SURNAME'(長さ= 11) 1 => アレイ 'ユーザ' => 'ID' =>文字列「4f8488cb-53e0-4f72-af73-3de229566cf0アレイ'length = 36) ' first_name '=>文字列' NAME '(長さ= 6) ' last_name '=>文字列' SURNAME '(長さ= 6).....他のすべてのユーザーも返します – mauzilla

+0

ああ、そこに投稿する質問を編集できますか?コメントが書式なしで読みにくい。 – Jack

答えて

5

1)二つのフィールドを組み合わせるための

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

はその後

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

これの要点は 'find'メソッドの' list'パラメータです。これは、フォームヘルパーが値が何であり、何が表示されるべきかを把握するのに役立ちます。 – Arno

+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

こんにちはジャック、私はあなたがこれで行くところを見ています。私はこのようにして喜んでいますが、あなたは私にこのようにするよう助言しますか、上で達成しようとしていることをするより効率的な方法がありますか? ? – mauzilla

+0

オプションが特定の方法でフォーマットされる必要があるので、他の方法はないと私は信じています。 CakePHPのform-> selectは配列キーを 'name =" value "'として使い、配列の値をフォームテキストとして使います。 http://book.cakephp.org/1.3/view/1430/selectでもfindクエリの '$ results'配列は配列の多次元配列を返します。 – Jack

0

は、私はあなたがこのようなものが必要だと思いますテーブルの場合、"virtualfields"を次のようにモデル内で使用できます。たとえば、ユーザーモデルがある場合、defi NEは次のように:あなたはUserモデルのfindメソッドを呼び出すたび

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

はだから今、「FULL_NAME」フィールドが得たことになります。

2)選択ボックスのテーブルからデータを取得するには、find('list')メソッドを使用できます。あなたがテーブルのid,full_name (last and first name combined using the virtual fields)を必要とする場合、例えば以下のようにUserモデルのために、それは行うことができます。

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

私はこれが役に立てば幸い..

0

ます$ this->フォーム - >入力( 'inputname ( 'form-a'、 'b')、 'class' => array( 'label' => false、 'options' => array( 'オプションの種類を選択'、 'a'、 'b' 'id' => 'bacid'、 'style' => 'width:280px;'、 'value' => $ abc ['model'] ['array_attribute'])); CakePHPの3オン

0

、私は "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()); 

私は `のvar_dump($フィルターを何これはCakePHPの3人の開発者

関連する問題