Difference between revisions of "VbzCart/v1/class/vcCartData Buyer"

from HTYP, the free directory anyone can edit if they can prove to me that they're not a spambot
Jump to navigation Jump to search
(header)
(Replaced content with "{{page/code/class}} * '''file''': {{l/project|file|cart/cart.data.fg.buyer.php}} * '''extends''': {{l/version|class|vcCartData_Contact}} * '''call links''': ** '''field cr...")
Tag: Replaced
Line 2: Line 2:
 
* '''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}}
* '''rendering call chains''':
+
* '''call links''':
** public function '''RenderPayment'''($doEdit)
+
** '''field creation''':
*** calls $this->'''RenderPayTypeSection'''($doEdit)
+
*** $this->'''CreateFields'''() [events API]:
**** calls $this->'''RenderPayCardSection'''($doEdit)
+
**** '''calls''' {{l/version|class|vcCartData_Contact}}::CreateFields() (parent)
***** calls $this->'''RenderPayCardNumberSection'''($doEdit)
+
**** '''calls''' $this->'''OrderMessageField'''(); // add this field to the standard ones
***** calls $this->'''RenderPayCardAddrSection'''($doEdit)
+
**** '''calls''' $this->'''CardNumberField'''();
* '''field creation chains''':
+
**** '''calls''' $this->'''CardExpiryField'''();
** protected function '''InvokeCardNumberFields()'''
+
** '''rendering''':
*** calls $this->'''CardNumberField()'''
+
*** $this->'''RenderPayment'''($doEdit) [public]:
*** calls $this->'''CardExpiryField()'''
+
**** '''calls''' $this->'''RenderPayTypeSection'''($doEdit)
** protected function '''LoadPaymentFields'''()
+
***** '''calls''' $this->'''RenderPayCardSection'''($doEdit)
*** calls $this->'''InvokeCardNumberFields'''()
+
****** '''calls''' $this->'''RenderPayCardNumberSection'''($doEdit)
*** calls $this->'''InvokeNameAddressFields'''() => {{l/version|class|vtCartData_NameAddress}}::CreateFields()
+
****** '''calls''' $this->'''RenderPayCardAddrSection'''($doEdit)
 
 
<source lang=php>
 
/*::::
 
  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>&emsp;<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 -- //
 
 
 
}
 
</source>
 

Revision as of 13:57, 15 April 2019

  • file: cart/cart.data.fg.buyer.php
  • extends: vcCartData_Contact
  • call links:
    • field creation:
      • $this->CreateFields() [events API]:
        • calls vcCartData_Contact::CreateFields() (parent)
        • calls $this->OrderMessageField(); // add this field to the standard ones
        • calls $this->CardNumberField();
        • calls $this->CardExpiryField();
    • rendering:
      • $this->RenderPayment($doEdit) [public]:
        • calls $this->RenderPayTypeSection($doEdit)
          • calls $this->RenderPayCardSection($doEdit)
            • calls $this->RenderPayCardNumberSection($doEdit)
            • calls $this->RenderPayCardAddrSection($doEdit)