2017-08-08 100 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; 
    } 
} 

如何修改這個代碼

  1. 得到array回到讓自己的形式將從多發選擇框會自動選擇值。

  2. 得到string只要我想顯示該值爲一個字符串。

+1

首先,爲什麼?爲什麼不使用正確的'1:n',或者更好的'n:m'相關聯? – ndm

+0

@ndm該數據沒有太多的意義,只是在視圖模式下顯示它作爲一個字符串,這就是爲什麼我沒有正常化它 –

+0

但爲了更乾淨的代碼,我試圖做到這一點... –

回答

0

正如在評論中提到,你最好適當正常化您的架構,並使用belongsToMany關聯。數據是(目前)只是「裝飾」的事實不是一個正常化的好時機。

這就是說,類型看起來OK-ISH。如果僅在檢索數據時出現問題,那麼我只能猜測該類型實際上未應用,這可能是檢索數據的表對象的問題。

但是,您不能使用類型對象在視圖層做出決定,到那時類型對象已經完成了他們的工作。如果你需要視圖中的數據有時是一個數組,有時是一個字符串,那麼你最好總是以數組格式檢索它,並使用一個幫助器將其轉換爲字符串列表,或者甚至可以使用相應的實體類(但請記住,實體不應該爲演示負責)。

又見

+0

首先我嘗試了setter和getters,但沒有奏效(可能在那裏我可能會做一些錯誤)..然後我訴諸這個解決方案...但是,感謝正確的方向使用協會..我會重構我的數據庫結構的那部分.. –

+0

我沒有創建虛擬財產,但修改了一次實際。 。 –