1

そのため、それぞれ異なる検索条件を持つさまざまな検索ページがあるので、コントローラーからパラメーターを渡し、必要なデータを収集して配列を返すコンポーネントを作成することにしました。この配列は、自分の中で使用するように設定できます。ファイルを表示してドロップダウンボックスにデータを入力し、条件をフィルタリングします。

私は、動的な選択ボックスを構築するために、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 $ filters ['custom'] ['users']

  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)
4

5 に答える 5

5

次のようにして、出力を強化できます。

1) テーブルの 2 つのフィールドを結合する"virtualfields" には、次のようにモデルで使用できます。たとえば、ユーザー モデルがある場合は、次のように定義できます。

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

findしたがって、User モデルのメソッドを呼び出すたびに「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))

これが役立つことを願っています..

于 2012-04-25T11:17:14.417 に答える
1

あなたがやりたいことは、実際にはフォーマットされたオプションで別の配列を作成することだと思います。

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

それから

echo $this->Form->select('user_id', $options);
于 2012-04-25T09:31:27.070 に答える
0

次のようなものが必要だと思います:

$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);
于 2012-04-25T10:56:10.130 に答える