2017-08-08 11 views
0

cakephp 3でマルチ選択ドロップダウンのカスタムデータ型を作成しようとしています。私は自分のフォームでmultiple => trueコントロールを持っている:Cakephp 3:カスタムデータ型が正しく動作しない

- PHP 
- HTML 
- CSS 

私はこのフォームを送信すると、私は配列(0 => PHP, 1 => HTML)としてそのコントロールの値を取得し、それは結構です、今、私は文字列形式でこれらの値を保存したいですこのPHP,HTMLのようにして、再び配列として取り戻します。

この入力の保存は正常ですが、データはstringの形式でのみ取得されます。このために私はこのanswerを踏襲し、カスタムデータ型を作成しました:

class MultiSelectType extends Type 
{ 
    public function toPHP($value, Driver $driver) 
    { 
     if (!$value) { 
      return null; 
     } 
     return explode(',', $value); 
    } 

    public function marshal($value) 
    { 
     return explode(',', $value); 
    } 

    public function toDatabase($value, Driver $driver) 
    { 
     return implode(',', $value); 
    } 

    public function toStatement($value, Driver $driver) 
    { 
     if ($value === null) { 
      return PDO::PARAM_NULL; 
     } 
     return PDO::PARAM_STR; 
    } 
} 

どのように私は自分のフォームが自動的にみとめ選択ボックスから値を選択するように戻ってarrayを取得するには、このコードに

  1. を変更します。

  2. を取得して、その値を文字列として表示したいときはいつでも戻ってください。

+1

まず...なぜ?適切な '1:n'、あるいはおそらくもっと良い' n:m'関連の関連付けを使うのはどうですか? – ndm

+0

@ndmそのデータは、表示モードで文字列として表示するだけでは意味がありません。そのため、私は正規化しませんでした –

+0

しかし、これをやろうとしていたクリーナーコードのために... –

答えて

0

コメントに記載されているとおり、正しくスキーマを正規化し、belongsToManyの関連付けを使用する方がよいでしょう。データが(現在)「デコレーション」だけであるという事実は、正規化を破棄するための十分な理由ではありません。

言われているように、タイプはOK-ishのように見えます。データの取得のみに問題がある場合は、実際にデータ型が実際に適用されていないと推測できます。おそらくデータを取得するテーブルオブジェクトの問題です。

ただし、タイプオブジェクトを使用してビューレイヤーで決定を行うことはできません。タイプオブジェクトは、その時点までにすでに作業を完了しています。ビュー内のデータを配列や時には文字列にする必要がある場合は、配列形式で取得し、ヘルパーを使用して文字列リストに変換したり、 (エンティティは実際にプレゼンテーションの責任を負いません)。

すべてを見るのも

+0

まずはセッターとゲッターを試しましたが、うまくいきませんでしたいくつかの間違い)..私はこの解決策に頼っています...しかし、正しい方向性のために協会を使用していただきありがとうございます。私は私のDB構造の一部をリファクタリングします.. –

+0

私は仮想プロパティを作成していませんでした。 。 –

関連する問題