Difference between revisions of "VbzCart/v1/class/vcCartData Buyer"
Jump to navigation
Jump to search
(Created page with "* '''file''': {{l/project|file|cart/cart.data.fg.buyer.php}} * '''extends''': {{l/version|class|vcCartData_Contact}} <source lang=php> /*:::: PURPOSE: Handles Buyer subforms...") |
|||
Line 1: | Line 1: | ||
* '''file''': {{l/project|file|cart/cart.data.fg.buyer.php}} | * '''file''': {{l/project|file|cart/cart.data.fg.buyer.php}} | ||
* '''extends''': {{l/version|class|vcCartData_Contact}} | * '''extends''': {{l/version|class|vcCartData_Contact}} | ||
+ | * '''field creation chain''': | ||
+ | ** protected function '''InvokeCardNumberFields()''' { | ||
+ | *** $this->'''CardNumberField()'''; | ||
+ | *** $this->'''CardExpiryField()'''; | ||
+ | ** protected function '''LoadPaymentFields()''' { | ||
+ | *** $this->'''InvokeCardNumberFields()'''; | ||
+ | *** $this->'''InvokeNameAddressFields()''' => {{l/version|class|vtCartData_NameAddress}}::CreateFields() | ||
+ | |||
<source lang=php> | <source lang=php> | ||
/*:::: | /*:::: | ||
Line 12: | Line 20: | ||
const KS_CARDADDRTYPE_NEWENTRY = 'new'; | const KS_CARDADDRTYPE_NEWENTRY = 'new'; | ||
− | // ++ | + | // ++ SETUP ++ // |
+ | |||
+ | /*---- | ||
+ | EXTENDER | ||
+ | TODO: see if we can work out in advance which groups of fields *actually* need invoking | ||
+ | */ | ||
+ | protected function CreateFields() { | ||
+ | parent::CreateFields(); | ||
+ | $this->InvokeContactFields() | ||
+ | $this->InvokeCardNumberFields(); | ||
+ | } | ||
+ | protected function InvokeContactFields() { | ||
+ | $this->OrderMessageField(); // add this field to the standard ones | ||
+ | parent::InvokeContactFields(); // load standard ones | ||
+ | } | ||
+ | protected function InvokeCardNumberFields() { | ||
+ | $this->CardNumberField(); | ||
+ | $this->CardExpiryField(); | ||
+ | } | ||
+ | /*---- | ||
+ | TODO: When other payment types are available, this will have to invoke different sets of fields | ||
+ | depending on which type is selected... or maybe we'll just invoke all the fields all the time, | ||
+ | to simplify troubleshooting. | ||
+ | */ | ||
+ | protected function InvokePaymentFields() { | ||
+ | $this->InvokeCardNumberFields(); | ||
+ | // (if entering new card) | ||
+ | $this->InvokeNameAddressFields(); | ||
+ | } | ||
+ | |||
+ | // CEMENT trait | ||
protected function PrecedingLinesForTemplate() { | protected function PrecedingLinesForTemplate() { | ||
$htName = $this->FieldName_forContactName(); | $htName = $this->FieldName_forContactName(); | ||
Line 19: | Line 57: | ||
return $out; | return $out; | ||
} | } | ||
+ | // CEMENT trait | ||
protected function FollowingLinesForTemplate() { | protected function FollowingLinesForTemplate() { | ||
return NULL; | return NULL; | ||
} | } | ||
+ | // CEMENT trait | ||
protected function FieldName_Prefix() { | protected function FieldName_Prefix() { | ||
return 'buyer-'; | return 'buyer-'; | ||
} | } | ||
+ | // CEMENT trait | ||
protected function DefaultEmail() { | protected function DefaultEmail() { | ||
$oApp = $this->AppObject(); | $oApp = $this->AppObject(); | ||
Line 34: | Line 75: | ||
} | } | ||
− | // -- | + | // -- SETUP -- // |
// ++ FIELD VALUES ++ // | // ++ FIELD VALUES ++ // | ||
Line 42: | Line 83: | ||
*/ | */ | ||
protected function Value_forCardAddrType($s=NULL) { | protected function Value_forCardAddrType($s=NULL) { | ||
+ | throw new exception('2019-02-26 Is this being used?'); | ||
$sfName = $this->FieldName_forCardAddrType(); | $sfName = $this->FieldName_forCardAddrType(); | ||
if (!is_null($s)) { | if (!is_null($s)) { | ||
Line 170: | Line 212: | ||
return $this->oField_OrderInstrux; | return $this->oField_OrderInstrux; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
// -- FIELD OBJECTS -- // | // -- FIELD OBJECTS -- // | ||
− | // ++ FORM | + | // ++ FORM INPUT ++ // |
public function CapturePayment() { | public function CapturePayment() { | ||
− | $this->LoadPaymentFields(); | + | //$this->LoadPaymentFields(); |
$this->ReceiveForm(); | $this->ReceiveForm(); | ||
} | } | ||
− | // -- FORM | + | // -- FORM INPUT -- // |
− | // ++ FORM | + | // ++ FORM OUTPUT ++ // |
// OVERRIDE of trait method | // OVERRIDE of trait method | ||
Line 217: | Line 238: | ||
public function RenderPayment($doEdit) { | public function RenderPayment($doEdit) { | ||
− | $this->LoadPaymentFields(); | + | //$this->LoadPaymentFields(); |
$out = | $out = | ||
$this->RenderPayTypeSection($doEdit) | $this->RenderPayTypeSection($doEdit) | ||
Line 299: | Line 320: | ||
} | } | ||
− | // -- FORM | + | // -- FORM OUTPUT -- // |
// ++ TEMPLATES ++ // | // ++ TEMPLATES ++ // | ||
Revision as of 14:26, 28 February 2019
- file: cart/cart.data.fg.buyer.php
- extends: vcCartData_Contact
- field creation chain:
- protected function InvokeCardNumberFields() {
- $this->CardNumberField();
- $this->CardExpiryField();
- protected function LoadPaymentFields() {
- $this->InvokeCardNumberFields();
- $this->InvokeNameAddressFields() => vtCartData_NameAddress::CreateFields()
- protected function InvokeCardNumberFields() {
/*::::
PURPOSE: Handles Buyer subforms:
* email/phone
* payment (name/address/details)
*/
class vcCartData_Buyer extends vcCartData_Contact {
const KS_CARDADDRTYPE_EXISTING = 'old';
const KS_CARDADDRTYPE_NEWENTRY = 'new';
// ++ SETUP ++ //
/*----
EXTENDER
TODO: see if we can work out in advance which groups of fields *actually* need invoking
*/
protected function CreateFields() {
parent::CreateFields();
$this->InvokeContactFields()
$this->InvokeCardNumberFields();
}
protected function InvokeContactFields() {
$this->OrderMessageField(); // add this field to the standard ones
parent::InvokeContactFields(); // load standard ones
}
protected function InvokeCardNumberFields() {
$this->CardNumberField();
$this->CardExpiryField();
}
/*----
TODO: When other payment types are available, this will have to invoke different sets of fields
depending on which type is selected... or maybe we'll just invoke all the fields all the time,
to simplify troubleshooting.
*/
protected function InvokePaymentFields() {
$this->InvokeCardNumberFields();
// (if entering new card)
$this->InvokeNameAddressFields();
}
// CEMENT trait
protected function PrecedingLinesForTemplate() {
$htName = $this->FieldName_forContactName();
$out = "\n <tr><td align=right>Name on Card:</td><td>[[$htName]]</td></tr>";
return $out;
}
// CEMENT trait
protected function FollowingLinesForTemplate() {
return NULL;
}
// CEMENT trait
protected function FieldName_Prefix() {
return 'buyer-';
}
// CEMENT trait
protected function DefaultEmail() {
$oApp = $this->AppObject();
if ($oApp->UserIsLoggedIn()) {
return $oApp->GetUserRecord()->EmailAddress();
} else {
return NULL;
}
}
// -- SETUP -- //
// ++ FIELD VALUES ++ //
/*----
2016-05-17 It's possible this hasn't been used yet. Maybe it should have "Intype" in there somewhere,
to make its role more obvious. TODO: check to see if this is used.
*/
protected function Value_forCardAddrType($s=NULL) {
throw new exception('2019-02-26 Is this being used?');
$sfName = $this->FieldName_forCardAddrType();
if (!is_null($s)) {
$this->SetValue($sfName,$s);
}
return $this->GetValue($sfName);
}
/*----
NOTE: This is basically the same as Value_forShipInType in the Recip class, but that may be deceptive.
Right *now* there's only one intype field in Recip and Buyer, but that could change later. So even though
they both use the same base naming function (FieldName_forIntype()), I'm giving the value functions
different names (and adding a suffix to the field name) so there won't be any ambiguity later
if we add more intype choices.
PUBLIC so Cart object can access it during conversion to Order
*/
public function Value_forBillInType($s=NULL) {
$sfName = $this->FieldName_forBillIntype();
if (!is_null($s)) {
$this->SetValue($sfName,$s);
}
return $this->GetValue($sfName);
}
public function Value_forBillInType_isNew() {
$sIntype = $this->Value_forBillInType();
return is_null($sIntype) || ($sIntype == KS_FORM_INTYPE_NEWENTRY);
}
public function GetValue_forCardNumber() {
$sfName = $this->FieldName_forCardNumber();
return $this->GetValue($sfName);
}
public function GetValue_forCardExpiry() {
$sfName = $this->FieldName_forCardExpiry();
return $this->GetValue($sfName);
}
public function GetValue_forOrderMessage() {
$sfName = $this->FieldName_forOrderMessage();
return $this->GetValue($sfName);
}
// -- FIELD VALUES -- //
// ++ FIELD NAMES ++ //
protected function FieldName_forBillIntype() {
return 'intype-bill';
}
protected function FieldName_forCardAddrType() {
return 'card-addr-type';
}
protected function FieldName_forCardNumber() {
return 'card-num';
}
protected function FieldName_forCardExpiry() {
return 'card-exp';
}
protected function FieldName_forOrderMessage() {
return 'order-msg';
}
// -- FIELD NAMES -- //
// ++ FIELD OBJECTS ++ //
private $oField_CardAddrType;
protected function CardAddrTypeField() {
if (empty($this->oField_CardAddrType)) {
$sName = $this->FieldName_forCardAddrType();
$oField = new fcFormField_Text(
$this->FormObject(),
$sName
);
//$oField->SetValue(self::KS_INTYPE_EXISTING);
$arBtns = array(
self::KS_CARDADDRTYPE_EXISTING => new fcInstaModeButton($sName,"Ship to Card's Billing Address"),
self::KS_CARDADDRTYPE_NEWENTRY => new fcInstaModeButton($sName,"Enter Card's Billing Address"),
);
$oCtrl = new fcFormControl_HTML_InstaMode($oField,$arBtns);
$this->oField_Intype = $oField;
}
return $this->oField_Intype;
}
private $oField_CardNum;
protected function CardNumberField() {
if (empty($this->oField_CardNum)) {
$oField = new fcFormField_Text(
$this->FormObject(),
$this->FieldName_forCardNumber()
);
$oCtrl = new fcFormControl_HTML($oField,array('size'=>20));
$oCtrl->DisplayAlias('card number');
$oCtrl->Required(TRUE);
$this->oField_CardNum = $oField;
}
return $this->oField_CardNum;
}
private $oField_CardExp;
protected function CardExpiryField() {
if (empty($this->oField_CardExp)) {
$oField = new fcFormField_Text(
$this->FormObject(),
$this->FieldName_forCardExpiry()
);
$oCtrl = new fcFormControl_HTML($oField,array('size'=>5));
$oCtrl->DisplayAlias('card expiration');
$oCtrl->Required(TRUE);
$this->oField_CardExp = $oField;
}
return $this->oField_CardExp;
}
private $oField_OrderInstrux;
protected function OrderMessageField() {
if (empty($this->oField_OrderInstrux)) {
$oField = new fcFormField_Text(
$this->FormObject(),
$this->FieldName_forOrderMessage()
);
$oCtrl = new fcFormControl_HTML_TextArea($oField,array('rows'=>3,'cols'=>50));
$oCtrl->Required(FALSE);
$this->oField_OrderInstrux = $oField;
}
return $this->oField_OrderInstrux;
}
// -- FIELD OBJECTS -- //
// ++ FORM INPUT ++ //
public function CapturePayment() {
//$this->LoadPaymentFields();
$this->ReceiveForm();
}
// -- FORM INPUT -- //
// ++ FORM OUTPUT ++ //
// OVERRIDE of trait method
protected function ContactTemplate_FollowingLines() {
$htMsg = $this->FieldName_forOrderMessage();
// Main label and additional explanation above; everything centered
$out = "\n<tr><td align=center colspan=2>"
.'Special instructions for this order only:'
."\n<br>[[$htMsg]]"
.'</td></tr>'
;
return $out;
}
public function RenderPayment($doEdit) {
//$this->LoadPaymentFields();
$out =
$this->RenderPayTypeSection($doEdit)
;
return $out;
}
/*----
FUTURE: This will display instamode buttons to allow switching payment types.
For now, we're only supporting credit card, so this just dispatches to
the credit card form.
*/
protected function RenderPayTypeSection($doEdit) {
$sWhere = __METHOD__."() - ".__FILE__." LINE ".__LINE__;
$out = $this->RenderPayCardSection($doEdit);
/*
$out =
"\n<!-- vv $sWhere vv -->"
//.$this->SectionHeader('Payment type:')
."\n<table class=\"form-block\" id=\"pay-type\">"
;
$isShipCardSame = $this->CartFields()->IsShipToCard();
$htChecked = $isShipCardSame?' checked':'';
$out .= "\n<tr><td align=center>\n"
.$this->Skin()->RenderPaymentIcons()
."<table><tr><td>"
.'<input name=payType value="'.KSF_CART_PTYP_CARD_HERE.'" type=radio checked disabled> Visa / MasterCard / Discover / American Express - pay here'
.'<br> <input name="'.KSF_SHIP_IS_CARD.'" type=checkbox value=1'.$htChecked.'>billing address is same as shipping address above'
."</td></tr></table>\n"
."<hr>More payment options will be available soon.\n"
."</td></tr>";
$out .=
// "\n</table>"
// .$this->Skin()->SectionFooter()
"\n<!-- ^^ $sWhere ^^ -->"
;
*/
return $out;
}
/*----
RENDERS: Form controls for credit card name, number, expiration;
dispatches to RenderPayCardAddr_* depending on whether address is
same as shipping or not.
Name defaults to recipient name, but is editable.
*/
protected function RenderPayCardSection($doEdit) {
$out =
$this->RenderPayCardNumberSection($doEdit)
.$this->RenderPayCardAddrSection($doEdit)
;
return $out;
}
protected function RenderPayCardNumberSection($doEdit) {
$oForm = $this->FormObject();
$oTplt = $this->PayCardNumberTemplate($doEdit);
$arCtrls = $oForm->RenderControls($doEdit);
$oTplt->SetVariableValues($arCtrls);
return $oTplt->RenderRecursive();
}
protected function RenderPayCardAddrSection($doEdit) {
$sCAType = $this->Value_forCardAddrType();
$doOld = ($sCAType == self::KS_CARDADDRTYPE_EXISTING);
if ($doOld) {
$out = $this->RenderPayCardAddr_Old($doEdit);
} else {
$out = $this->RenderPayCardAddr_New($doEdit);
}
return $out;
}
protected function RenderPayCardAddr_New($doEdit) {
$oTplt = $this->NameAddressTemplate();
$arCtrls = $this->FormObject()->RenderControls($doEdit);
$oTplt->SetVariableValues($arCtrls);
return $oTplt->RenderRecursive();
}
protected function RenderPayCardAddr_Old($doEdit) {
}
// -- FORM OUTPUT -- //
// ++ TEMPLATES ++ //
protected function PayCardNumberTemplate($doEdit) {
$sMsg = $doEdit
?"<tr><td colspan=2><span class=note><b>Tip</b>: It's okay to use dashes or spaces in the card number - reduces typing errors!</span></td></tr>"
:''
;
$og = vcGlobalsApp::Me();
$wsVisa = $og->GetWebSpec_forVisaCard();
$wsMCard = $og->GetWebSpec_forMasterCard();
$wsAmex = $og->GetWebSpec_forAmexCard();
$wsDisc = $og->GetWebSpec_forDiscoverCard();
$sTplt = <<<__END__
<table class="form-block" id="card-address">
<tr><td align=right valign=middle>We accept:</td>
<td>
<img align=absmiddle src="$wsVisa" title="Visa">
<img align=absmiddle src="$wsMCard" title="MasterCard">
<img align=absmiddle src="$wsAmex" title="American Express">
<img align=absmiddle src="$wsDisc" title="Discover / Novus">
</td></tr>
<tr><td align=right valign=middle>Card Number:</td>
<td>[[card-num]] Expires: [[card-exp]] (mm/yy)
</td></tr>
$sMsg
</table>
__END__;
return new fcTemplate_array('[[',']]',$sTplt);
}
// -- TEMPLATES -- //
}