https://htyp.org/mw/index.php?title=Help:Sandbox/diffs&feed=atom&action=history
Help:Sandbox/diffs - Revision history
2024-03-29T13:58:36Z
Revision history for this page on the wiki
MediaWiki 1.35.0
https://htyp.org/mw/index.php?title=Help:Sandbox/diffs&diff=21824&oldid=prev
Woozle: cust base classes
2016-05-22T16:40:45Z
<p>cust base classes</p>
<p><b>New page</b></p><div><php><br />
class clsCusts extends clsTable_key_single {<br />
const TableName='core_custs';<br />
<br />
// ++ SETUP ++ //<br />
<br />
public function __construct($iDB) {<br />
parent::__construct($iDB);<br />
$this->Name(self::TableName);<br />
$this->KeyName('ID');<br />
$this->ClassSng('clsCust');<br />
}<br />
<br />
// -- SETUP -- //<br />
// ++ CLASS NAMES ++ //<br />
<br />
protected function NamesClass() {<br />
return 'clsCustNames';<br />
}<br />
protected function AddrsClass() {<br />
return 'clsCustAddrs';<br />
}<br />
<br />
// -- CLASS NAMES -- //<br />
// ++ DATA TABLE ACCESS ++ //<br />
<br />
protected function NameTable() {<br />
return $this->Engine()->Make($this->NamesClass());<br />
}<br />
protected function AddrTable() {<br />
return $this->Engine()->Make($this->AddrsClass());<br />
}<br />
<br />
// -- DATA RECORDS ACCESS -- //<br />
<br />
public function Recs_forUser($idUser) {<br />
$rs = $this->GetData('(ID_Repl IS NULL) AND (ID_User='.$idUser.')');<br />
return $rs;<br />
}<br />
<br />
// -- DATA RECORDS ACCESS -- //<br />
// ++ ACTIONS ++ //<br />
<br />
/*----<br />
ACTION: Creates records for customer, name, and address --<br />
everything needed to record a new customer.<br />
*/<br />
public function CreateCustomer($idUser,vcCartData_NameAddress $oPerson) {<br />
$id = $this->CreateRecord($idUser);<br />
<br />
// create Name record<br />
$tNames = $this->NameTable();<br />
$sName = $oPerson->GetNameFieldValue();<br />
$idName = $tNames->CreateRecord($id,$sName);<br />
<br />
// create Address record<br />
$tAddrs = $this->AddrTable();<br />
$idAddr = $tAddrs->CreateRecord($id,$oPerson);<br />
<br />
// fill in name & address IDs in Cart record (do we stil store those?)<br />
if (!is_null($idName) && !is_null($idAddr)) {<br />
$rcCust = $this->GetItem($id);<br />
$rcCust->FinishRecord($idName,$idAddr);<br />
return TRUE;<br />
} else {<br />
return FALSE;<br />
}<br />
}<br />
/* 2016-05-08 old version<br />
public function CreateCustomer($idUser,$sName,clsPerson $oPerson) {<br />
$id = $this->CreateRecord($idUser);<br />
<br />
// create Name record<br />
$tNames = $this->NameTable();<br />
$idName = $tNames->CreateRecord($id,$sName);<br />
<br />
// create Address record<br />
$tAddrs = $this->AddrTable();<br />
$idAddr = $tAddrs->CreateRecord($id,$oPerson);<br />
<br />
if (!is_null($idName) && !is_null($idAddr)) {<br />
$rcCust = $this->GetItem($id);<br />
$rcCust->FinishRecord($idName,$idAddr);<br />
return TRUE;<br />
} else {<br />
return FALSE;<br />
}<br />
}//*/<br />
public function CreateRecord($idUser) {<br />
$arUpd = array(<br />
'ID_User' => $idUser,<br />
'WhenCreated' => 'NOW()',<br />
);<br />
$ok = $this->Insert($arUpd);<br />
if ($ok) {<br />
return $this->Engine()->NewID();<br />
} else {<br />
return NULL;<br />
}<br />
}<br />
<br />
// -- ACTIONS -- //<br />
<br />
}<br />
class clsCust extends clsVbzRecs {<br />
<br />
// ++ FIELD CALCULATIONS ++ //<br />
<br />
protected function SingleLine() {<br />
$oName = $this->NameRecord();<br />
$oAddr = $this->AddrObj();<br />
$txt = $oName->ShortDescr();<br />
if (empty($oAddr)) {<br />
$txt .= ' (no address, cust ID='.$this->KeyValue().')';<br />
} else {<br />
$txt .= ' - '.$oAddr->ShortDescr();<br />
}<br />
$ht = htmlspecialchars($txt);<br />
return $ht;<br />
}<br />
<br />
// -- FIELD CALCULATIONS -- //<br />
// ++ CLASS NAMES ++ //<br />
<br />
protected function MailAddrsClass() {<br />
return 'clsCustAddrs';<br />
}<br />
protected function PhonesClass() {<br />
return 'clsCustPhones';<br />
}<br />
protected function CardsClass() {<br />
return 'clsCustCards';<br />
}<br />
<br />
// -- CLASS NAMES ++ //<br />
// ++ DATA TABLE ACCESS ++ //<br />
<br />
protected function MailAddrTable($id=NULL) {<br />
return $this->Engine()->Make($this->MailAddrsClass(),$id);<br />
}<br />
protected function PhoneTable($id=NULL) {<br />
return $this->Engine()->Make($this->PhonesClass(),$id);<br />
}<br />
protected function CardTable($id=NULL) {<br />
return $this->Engine()->Make($this->CardsClass(),$id);<br />
}<br />
<br />
// -- DATA TABLE ACCESS -- //<br />
// ++ DATA RECORDS ACCESS ++ //<br />
<br />
/*----<br />
RETURNS: recordset of aliases for this customer ID<br />
HISTORY:<br />
2012-01-09 created for admin page<br />
*/<br />
protected function Aliases_rs() {<br />
$id = $this->KeyValue();<br />
$tbl = $this->Table();<br />
$rs = $tbl->GetData('ID_Repl='.$id,NULL,'ID');<br />
return $rs;<br />
}<br />
<br />
/*----<br />
RETURNS: recordset of Names for this Customer<br />
HISTORY:<br />
2012-01-08 split off from AdminNames<br />
*/<br />
public function Names() {<br />
$tbl = $this->Engine()->CustNames();<br />
$rs = $tbl->GetData('ID_Cust='.$this->KeyValue());<br />
return $rs;<br />
}<br />
/*----<br />
RETURNS: recordset of default name for this customer<br />
HISTORY:<br />
2013-11-09 Created for user-based checkout.<br />
*/<br />
public function NameRecord() {<br />
$id = $this->Value('ID_Name');<br />
if (is_null($id)) {<br />
$rc = NULL;<br />
} else {<br />
$rc = $this->Engine()->CustNames($id);<br />
}<br />
return $rc;<br />
}<br />
/*----<br />
RETURNS: recordset of all Addresses for this Customer, optionally filtered<br />
HISTORY:<br />
2012-01-08 split off from AdminAddrs<br />
2013-11-08 Added optional $iFilt parameter.<br />
2013-11-09 Moved most of the code to clsCusts::Recs_forCust()<br />
*/<br />
public function Addrs($iFilt=NULL) {<br />
throw new exception('Addrs() is deprecated; call AddrRecords().');<br />
$tbl = $this->MailAddrTable();<br />
$id = $this->KeyValue();<br />
$rc = $tbl->Recs_forCust($id,$iFilt);<br />
return $rc;<br />
}<br />
protected function AddrRecords($doVoided) {<br />
$tbl = $this->MailAddrTable();<br />
$id = $this->KeyValue();<br />
$sqlFilt = NULL;<br />
if (!$doVoided) {<br />
$sqlFilt = 'WhenVoid IS NULL';<br />
}<br />
$rc = $tbl->Recs_forCust($id,$sqlFilt);<br />
return $rc;<br />
}<br />
/*----<br />
RETURNS: recordset of only active Addresses for this Customer<br />
HISTORY:<br />
2013-11-08 Created for user-based checkout.<br />
*/<br />
public function AddrsActive() {<br />
return $this->Addrs('(WhenVoid IS NULL) AND NOT (WhenExp < NOW())');<br />
}<br />
/*----<br />
RETURNS: recordset of default address for this customer<br />
If ID_Addr is not set, returns first active record found.<br />
If there are no active records, returns NULL.<br />
HISTORY:<br />
2013-11-09 Added check for ID_Addr = NULL.<br />
*/<br />
public function AddrObj() {<br />
$id = $this->Value('ID_Addr');<br />
if (is_null($id)) {<br />
$rc = $this->AddrsActive();<br />
if ($rc->RowCount == 0) {<br />
$rc = NULL;<br />
} else {<br />
$rc->NextRow(); // load the first record<br />
}<br />
} else {<br />
$rc = $this->Engine()->CustAddrs($id);<br />
}<br />
return $rc;<br />
}<br />
/*----<br />
RETURNS: recordset of Emails for this Customer<br />
HISTORY:<br />
2012-01-08 split off from AdminEmails<br />
*/<br />
public function Emails() {<br />
throw new exception('Emails() is deprecated; call EmailRecords().');<br />
$tbl = $this->objDB->CustEmails();<br />
$rs = $tbl->GetData('ID_Cust='.$this->KeyValue());<br />
return $rs;<br />
}<br />
protected function EmailAddrRecords() {<br />
$tbl = $this->EmailAddrTable();<br />
$rs = $tbl->GetData('ID_Cust='.$this->KeyValue());<br />
return $rs;<br />
}<br />
/*----<br />
RETURNS: recordset of Phones for this Customer<br />
HISTORY:<br />
2012-01-08 split off from AdminPhones<br />
*/<br />
public function Phones() {<br />
$tbl = $this->PhoneTable();<br />
$rs = $tbl->GetData('ID_Cust='.$this->KeyValue());<br />
return $rs;<br />
}<br />
/*----<br />
RETURNS: recordset of Cards for this Customer<br />
HISTORY:<br />
2012-01-08 split off from AdminCards<br />
*/<br />
public function Cards() {<br />
throw new exception('Cards() is deprecated; call CardRecords().');<br />
}<br />
public function CardRecords() {<br />
$tbl = $this->CardTable();<br />
$rs = $tbl->GetData('ID_Cust='.$this->KeyValue());<br />
return $rs;<br />
}<br />
<br />
// -- DATA RECORD ACCESS -- //<br />
// ++ DATA RECORD ARRAYS ++ //<br />
<br />
<br />
// TODO: Each of these table-types needs a GetData_active() method, and we should be using that instead.<br />
/*----<br />
RETURNS: recordset of Names for all records in the current set<br />
*/<br />
public function NameRecords_forRows() {<br />
$sqlIDs = $this->KeyListSQL();<br />
return $this->NameTable()->GetData("isActive AND (ID_Cust IN ($sqlIDs))");<br />
}<br />
public function AddrRecords_forRows() {<br />
$sqlIDs = $this->KeyListSQL();<br />
return $this->MailAddrTable()->GetData("(WhenVoid IS NULL) AND (NOW() <= IFNULL(WhenExp,NOW())) AND (ID_Cust IN ($sqlIDs))");<br />
}<br />
public function CardRecords_forRows() {<br />
$sqlIDs = $this->KeyListSQL();<br />
return $this->CardTable()->GetData("isActive AND (NOW() <= IFNULL(WhenInvalid,NOW())) AND (ID_Cust IN ($sqlIDs))");<br />
}<br />
<br />
public function AsArray($doNames,$doAddrs,$doCards) {<br />
$ar = NULL;<br />
while ($this->NextRow()) {<br />
$idCust = $this->KeyValue();<br />
$qRows = 0;<br />
<br />
if ($doNames) {<br />
$rs = $this->Names(); // get names for this customer<br />
while ($rs->NextRow()) {<br />
$qRows++;<br />
$idName = $rs->KeyValue();<br />
$sName = $rs->ShortDescr();<br />
$ar[$idCust]['names'][$idName] = $sName;<br />
}<br />
}<br />
<br />
if ($doAddrs) {<br />
$rs = $this->AddrRecords(FALSE); // get addresses for this customer<br />
while ($rs->NextRow()) {<br />
$qRows++;<br />
$idAddr = $rs->KeyValue();<br />
$ht = htmlspecialchars($rs->AsSingleLine());<br />
$ar[$idCust]['addrs'][$idAddr] = $ht;<br />
}<br />
}<br />
<br />
if ($doCards) {<br />
$rs = $this->CardRecords(FALSE); // get addresses for this customer<br />
while ($rs->NextRow()) {<br />
$qRows++;<br />
$idRow = $rs->KeyValue();<br />
$ht = htmlspecialchars($rs->AsSingleLine());<br />
$ar[$idCust]['cards'][$idRow] = $ht;<br />
}<br />
}<br />
if ($qRows > 0) {<br />
$sCust = $this->SingleLine();<br />
$ar[$idCust]['cust'] = $sCust;<br />
}<br />
}<br />
return $ar;<br />
}<br />
/*----<br />
RETURNS: array of orders for this customer<br />
FUTURE: also check ID_Buyer and ID_Recip<br />
HISTORY:<br />
2012-01-08 split off from AdminOrders(), moved from admin.cust to base.cust<br />
*/<br />
protected function Orders_array() {<br />
$tOrd = $this->Engine()->Orders();<br />
$idCust = $this->KeyValue();<br />
$arRow = NULL;<br />
$arOrd = NULL;<br />
<br />
// collect orders where customer is buyer<br />
$rs = $tOrd->GetData('ID_Buyer='.$idCust);<br />
while ($rs->NextRow()) {<br />
$idOrd = $rs->KeyValue();<br />
$arRow = $rs->Values();<br />
$arRow['roles'] = nz($arRow['roles']).'B';<br />
$arOrd[$idOrd] = $arRow;<br />
}<br />
<br />
// collect orders where customer is recipient<br />
$rs = $tOrd->GetData('ID_Recip='.$idCust);<br />
while ($rs->NextRow()) {<br />
$idOrd = $rs->KeyValue();<br />
if (array_key_exists($idOrd,$arOrd)) {<br />
$arRow = $arOrd[$idOrd];<br />
} else {<br />
$arRow = $rs->Values();<br />
}<br />
$arRow['roles'] = nz($arRow['roles']).'R';<br />
$arOrd[$idOrd] = $arRow;<br />
}<br />
<br />
return $arOrd;<br />
<br />
}<br />
<br />
// -- DATA RECORD ARRAYS -- //<br />
// ++ ACTIONS ++ //<br />
<br />
/*----<br />
USED BY: Customers table<br />
*/<br />
public function FinishRecord($idName,$idAddr) {<br />
$arUpd = array(<br />
'ID_Name' => $idName,<br />
'ID_Addr' => $idAddr,<br />
'WhenCreated' => 'NOW()',<br />
);<br />
$ok = $this->Update($arUpd);<br />
}<br />
<br />
// -- ACTIONS -- //<br />
// ++ WEB UI ++ //<br />
<br />
/*----<br />
RETURNS: HTML for a drop-down list of all Addresses belonging to<br />
any of the Customer records in the current set<br />
*/<br />
public function Render_DropDown_Addrs($sName) {<br />
$out = NULL;<br />
$rs = $this->AddrRecords_forRows();<br />
if (is_null($rs) || ($rs->RowCount() == 0)) {<br />
$out .= 'No addresses found.'; // should this actually ever happen?<br />
} else {<br />
$out .= "\n<select name='$sName'>";<br />
while ($rs->NextRow()) {<br />
$id = $rs->KeyValue();<br />
$sRow = $rs->AsString(' / ');<br />
$ht = htmlspecialchars($sRow);<br />
$out .= "\n<option value=$id>$ht</option>";<br />
}<br />
$out .= "\n</select>";<br />
}<br />
return $out;<br />
}<br />
/*----<br />
RETURNS: HTML for a drop-down list of all Cards belonging to<br />
any of the Customer records in the current set<br />
*/<br />
public function Render_DropDown_Cards($sName) {<br />
$out = NULL;<br />
$rs = $this->CardRecords_forRows();<br />
if (is_null($rs) || ($rs->RowCount() == 0)) {<br />
$out .= 'No cards found.'; // should this actually ever happen?<br />
} else {<br />
$out .= "\n<select name='$sName'>";<br />
while ($rs->NextRow()) {<br />
$id = $rs->KeyValue();<br />
$sRow = $rs->SafeString();<br />
$ht = htmlspecialchars($sRow);<br />
$out .= "\n<option value=$id>$ht</option>";<br />
}<br />
$out .= "\n</select>";<br />
}<br />
return $out;<br />
}<br />
/*----<br />
RETURNS: HTML for a drop-down list of all the customers<br />
in the current recordset<br />
NOTE: This is somewhat DEPRECATED<br />
*/<br />
public function Render_DropDown($iName,$doNames,$doAddrs,$doCards) {<br />
$ar = $this->AsArray($doNames,$doAddrs,$doCards);<br />
<br />
// output the results<br />
<br />
$out = NULL;<br />
<br />
if (is_null($ar) || (count($ar) == 0)) {<br />
$out .= 'No entries found.'; // should this actually ever happen?<br />
} else {<br />
$out .= "\n<select name=\"$iName\">";<br />
<br />
foreach ($ar as $idCust => $arCust) {<br />
<br />
//$ht = escapeshellarg($arCust['cust']);<br />
if (array_key_exists('addrs',$arCust)) {<br />
$ht = escapeshellarg("customer ID #$idCust");<br />
$out .= "\n<optgroup label=$ht>";<br />
<br />
$arAddr = $arCust['addrs'];<br />
foreach ($arAddr as $idAddr => $sAddr) {<br />
$ht = htmlspecialchars($sAddr);<br />
$out .= "\n<option value=$idAddr>$ht</option>";<br />
}<br />
<br />
$out .= "\n</optgroup>";<br />
}<br />
<br />
if (array_key_exists('cards',$arCust)) {<br />
// TODO: finish<br />
}<br />
}<br />
<br />
$out .= "\n</select>";<br />
}<br />
<br />
return $out;<br />
}<br />
}<br />
</php></div>
Woozle