0

次の構造の「アドレス」テーブルを持つ Cakephp プロジェクトがあります。

CREATE TABLE `addresses` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`name` varchar(50) NOT NULL,
`company` varchar(50) NOT NULL,
`address1` varchar(50) NOT NULL,
`address2` varchar(50) DEFAULT NULL,
`city` varchar(40) NOT NULL,
`state` varchar(2) NOT NULL,
`country` varchar(2) NOT NULL,
`zip` varchar(5) NOT NULL,
PRIMARY KEY (`id`)
)

このプロジェクトには、ユーザーに配送先住所と請求先住所の両方を要求するページがあり、1 つのページで同じデータベース フィールドの複数のインスタンスを許可するためにフォーム入力の名前を構造化する方法がわかりません。

ビューで、アドレス フィールドの 2 つのインスタンスを分離するためにエイリアスを使用しようとしました

IE-

<?=$this->Form->input('Shipaddress.zip', array('label' => 'Zip Code'));?>
...
<?=$this->Form->input('Billaddress.zip', array('label' => 'Zip Code'));?>

次に、ビューで、2 つのインスタンスを分離し、両方を検証し、適切な $this->validationError 値を設定して、エラーを正しいフィールド ビューに適切に表示しようとしました

// place in arrays with proper model name ['Address']
$ship_array['Address'] = $this->request->data['Shipaddress'];
$bill_array['Address'] = $this->request->data['Billaddress'];

//Set Data to model, Validate Against model, change model name in validationErrors to  match aliased fields, and remove validationErrors for ['Address']
$this->Address->set($ship_array);
$shipping_valid = $this->Address->validates(array('fieldList' => array('name', 'company', 'address1', 'address2', 'city', 'state', 'country', 'zip')));
$this->validationErrors['Shipaddress'] = $this->validationErrors['Address'];
$this->validationErrors['Address'] = array();

//Do it again for Billing Address fields
$this->Address->set($bill_array);
$billing_valid = $this->Address->validates(array('fieldList' => array('name', 'company', 'address1', 'address2', 'city', 'state', 'country', 'zip')));
$this->validationErrors['Billaddress'] = $this->validationErrors['Address'];
$this->validationErrors['Address'] = array();

残念ながら、これは機能していないようです。これを機能させようとしてやりすぎたのではないかと心配しています...

これを適切に行う方法について、誰かが正しい方向にキックを与えることができますか?

4

1 に答える 1

0

自力でやり方を考え...

/app/Model で「ShippingAddress.php」と「BillingAddress.php」を作成しました。どちらも「住所」を拡張します

//ShippingAddress.php
<?php  
App::uses('Address', 'Model');
class ShippingAddress extends Address { 
} 

//BillingAddress.php
<?php  
App::uses('Address', 'Model');
class BillingAddress extends Address { 
} 

新しいモデルがそれらにちなんで名付けられたテーブルを使用しないようにするために、親の Address.php を編集し、$useTable を設定して、両方の拡張モデルが Addresses テーブルを使用するようにします。

//Address.php
...
public $useTable = 'addresses';
...

次に、入力フィールドの2つのインスタンスをビューに挿入するだけです...モデルの名前を変更したり、validationErrorsを変更したりする必要はありません。動作します:)

于 2013-07-11T19:09:59.553 に答える