/** * Overloading ManyManyList removeByID Rather Then remove() as That Just Calls removeByID() * Remove the given item from this list. * Note that for a ManyManyList, the item is never actually deleted, only the join table is affected * @param $itemID The item it */ public function removeByID($itemID) { parent::removeByID($itemID); // Get Item Object Itself Based on $itemID $dl = new DataList($this->dataClass); // Must Include Table Prefix To Prevent "Column 'ID' in where clause is ambiguous" Error $item = $dl->where("\"" . $this->dataClass . "\".\"ID\" = '" . $itemID . "'")->first(); $this->onUnlink($item); }
public static function filter(DataList $list, $member = null) { $now = date('Y-m-d H:i:s'); $nowminusone = date('Y-m-d H:i:s', strtotime("-1 day")); $groupids = array(0); if ($member) { $groupids = array_merge($member->Groups()->map('ID', 'ID')->toArray(), $groupids); } return $list->where("(\"SpecificPrice\".\"StartDate\" IS NULL) OR (\"SpecificPrice\".\"StartDate\" < '{$now}')")->where("(\"SpecificPrice\".\"EndDate\" IS NULL) OR (\"SpecificPrice\".\"EndDate\" > '{$nowminusone}')")->filter("GroupID", $groupids); }
public function onAfterWrite() { parent::onAfterWrite(); // Define Related MCList Object $list = $this->getComponent("MCList"); // Store The True Changed Fields Array On First Write if ($this->getWriteCount() == 1) { $cf = $this->getChangedFields(false, 2); // Define Change Fields Array $this->setOriginalChangedFields($cf); // Store Original (First Write) Change Fields For Use On Second Write } else { if ($this->getWriteCount() > 1 && $this->getSyncMailChimp() && !empty($this->Email) && !empty($list->ID)) { $apikey = SiteConfig::current_site_config()->getMCAPIKey(); $api = new MCAPI($apikey); // Define The Change Fields Array Which We Stored On The First Write Iteration For Use On The Second Write (When Components Are Written) if ($this->getWriteCount() == 2) { $cf = $this->getOriginalChangedFields(); } $Class = array(); $Class["MCSubscription"] = $this; $where = "\"MCListID\" = '" . $this->MCListID . "' AND \"SyncDirection\" IN ('Export','Both')"; if (!empty($this->getComponent("Member")->ID)) { $Class['Member'] = $this->getComponent("Member"); SS_Log::log("Sub ID " . $this->ID . " Has A Related Member Object..", SS_Log::NOTICE); } else { // If No Related Member Object Only Deal With Subscription Record Merge Data $where .= " AND \"OnClass\" = 'MCSubscription'"; SS_Log::log("Sub ID " . $this->ID . " Has No Related Member Object..", SS_Log::NOTICE); } $dl = new DataList("MCListField"); $mappings = $dl->where($where); $merge_vars = array(); foreach ($mappings as $map) { $merge_vars[$map->MergeTag] = $Class[$map->OnClass]->getField($map->FieldName); } if (isset($cf['ID'])) { // If Adding a New Subscription $result = $api->listSubscribe($list->ListID, $this->Email, $merge_vars, 'html', $this->DoubleOptIn); // If Successfully Added a New Subscription Make a Second Call to Return the MailChimp Member (Web) && Email ID's if (empty($api->errorCode)) { SS_Log::log("API Call Success: listSubscribe(" . $list->ListID . ", " . $this->Email . "); for Subscription ID " . $this->ID, SS_Log::NOTICE); $retval = $api->listMemberInfo($list->ListID, $this->Email); if (empty($api->errorCode)) { SS_Log::log("API Call Success: listMemberInfo(" . $list->ListID . ", " . $this->Email . "); for Subscription ID " . $this->ID, SS_Log::NOTICE); SS_Log::log("Calling Additional write() for Subscription ID " . $this->ID . " to Save MailChimp Created Data", SS_Log::NOTICE); $this->setField("MCMemberID", $retval['data'][0]['web_id']); // Set The MailChimp Member (Web) ID for this Member (Which Is Static - Used For MC - Site Imports) $this->setField("MCEmailID", $retval['data'][0]['id']); // Set The MailChimp Email ID for this Member (Which Updates When E-mail Updates - Used For Site - MC Exports) $this->setWriteCount(); $this->write(); } else { SS_Log::log("API Call Failed: listMemberInfo(" . $list->ListID . ", " . $this->Email . "); for Subscription ID " . $this->ID . " | Error Code = " . $api->errorCode . " | Error Message = " . $api->errorMessage, SS_Log::ERR); } } else { SS_Log::log("API Call Failed: listSubscribe(" . $list->ListID . ", " . $this->Email . "); for Subscription ID " . $this->ID . " | Error Code = " . $api->errorCode . " | Error Message = " . $api->errorMessage, SS_Log::ERR); } } else { if (isset($cf['Subscribed']) && !empty($this->Subscribed)) { // If Just Re-Subscribed (This Will Replace Previous MC Record With New One Rather Than Re-Subscribing Existing) $result = $api->listSubscribe($list->ListID, $this->Email, $merge_vars, 'html', $this->DoubleOptIn); // Must use E-mail For Re-Subscription as listSubscribe() assumes a new user (it actually deletes the existing 'un-subscribed' MailChimp record for the provided e-mail and re-adds the user) if (empty($api->errorCode)) { SS_Log::log("API Call Success: listSubscribe(" . $list->ListID . ", " . $this->Email . "); for Subscription ID " . $this->ID, SS_Log::NOTICE); } else { SS_Log::log("API Call Failed: listSubscribe(" . $list->ListID . ", " . $this->Email . "); for Subscription ID " . $this->ID . " | Error Code = " . $api->errorCode . " | Error Message = " . $api->errorMessage, SS_Log::ERR); } } else { if (isset($cf['Subscribed']) && empty($this->Subscribed)) { // If Just Unsubscribed $result = $api->listUnsubscribe($list->ListID, $this->getMailChimpIdentifier()); if (empty($api->errorCode)) { SS_Log::log("API Call Success: listUnsubscribe(" . $list->ListID . ", " . $this->getMailChimpIdentifier() . "); for Subscription ID " . $this->ID, SS_Log::NOTICE); } else { SS_Log::log("API Call Failed: listUnsubscribe(" . $list->ListID . ", " . $this->getMailChimpIdentifier() . "); for Subscription ID " . $this->ID . " | Error Code = " . $api->errorCode . " | Error Message = " . $api->errorMessage, SS_Log::ERR); } } else { if (!empty($this->Subscribed)) { // If Updating an Existing Subscription (That Hasnt Already Unsubscribed) $result = $api->listUpdateMember($list->ListID, $this->getMailChimpIdentifier(), $merge_vars); // If Successfully Updated a Subscription Make a Second Call to Return the MailChimp Member Email ID if (empty($api->errorCode)) { SS_Log::log("API Call Success: listUpdateMember(" . $list->ListID . ", " . $this->getMailChimpIdentifier() . "); for Subscription ID " . $this->ID, SS_Log::NOTICE); if (isset($cf['Email'])) { $retval = $api->listMemberInfo($list->ListID, $this->Email); // Call Must Use Email As MCEmailID Will Be Outdated If Last Update Was An Email Change if (empty($api->errorCode)) { SS_Log::log("API Call Success: listMemberInfo(" . $list->ListID . ", " . $this->Email . "); for Subscription ID " . $this->ID, SS_Log::NOTICE); SS_Log::log("Calling Additional write() for Subscription ID " . $this->ID . " to Save Updated MailChimp Email ID", SS_Log::NOTICE); $this->setField("MCEmailID", $retval['data'][0]['id']); // Update The MailChimp Email ID for this Member (Which Updates When E-mail Updates) $this->setSyncMailChimp(false); $this->write(); } else { SS_Log::log("API Call Failed: listMemberInfo(" . $list->ListID . ", " . $this->Email . "); for Subscription ID " . $this->ID . " | Error Code = " . $api->errorCode . " | Error Message = " . $api->errorMessage, SS_Log::ERR); } } } else { SS_Log::log("API Call Failed: listUpdateMember(" . $list->ListID . ", " . $this->getMailChimpIdentifier() . "); for Subscription ID " . $this->ID . " | Error Code = " . $api->errorCode . " | Error Message = " . $api->errorMessage, SS_Log::ERR); } } else { SS_Log::log("No API Call Made: Record Must Be Marked As Unsubscribed.", SS_Log::NOTICE); } } } } } else { SS_Log::log("In >=2 Write But No MailChimp Sync Triggered? " . "Sub ID = '" . $this->ID . "' | " . "Write Count = '" . $this->getWriteCount() . "' | " . "Sync To MailChimp = '" . $this->getSyncMailChimp() . "' | " . "Subscriber E-mail = '" . $this->Email . "' | " . "Related MC List ID = '" . $list->ID . "'", SS_Log::WARN); } } $this->setWriteCount(); // If We Have Forced An Additional Write (Triggered When Saving Subscription Object Via Related Member Data Being Updated) if ($this->getForceAdditionalWrite()) { // Ensure that two complete (i.e. DataObject::write() doesnt decide // nothing has actually changed and fails to call onAfterWrite()) // writes occour on creation as the second is responsible for // syncing to MC. Setting a dummy field is a hack to fix broken write() // function when passed $forceWrite (Does Not Actually Force a Write!) $this->DummyField = time(); // Unset It First So We Don't Keep Forcing Additional Writes Causing An Infinite Loop $this->setForceAdditionalWrite(false); // Write The Object Once More (For Benefit Of Sync Logic On Second Write) $this->write(); } }
public function filter(DataList $list) { $now = date('Y-m-d H:i:s'); //to bad ORM filtering for NULL doesn't work...so we need to use where return $list->where("(\"Discount\".\"StartDate\" IS NULL) OR (\"Discount\".\"StartDate\" < '{$now}')")->where("(\"Discount\".\"EndDate\" IS NULL) OR (\"Discount\".\"EndDate\" > '{$now}')"); }
function addScopeCheck(DataList $list) { $scopeField = $this->Scope; if ($scopeField && ($scopeValue = $this->owner->{$scopeField})) { //$list = clone $list; return $list->where("{$scopeField}='{$scopeValue}'"); } return $list; }
/** * kind of a wierd thing to add in here * @param [type] $class [description] * @param [type] $q [description] * @param array $fields [description] * @return [type] [description] */ public static function search_list($class, $q, array $fields) { // parse terms $terms = array_merge(static::str_to_terms($q), static::str_to_fragments($q)); $terms[] = $q; $terms = array_unique($terms); // generate data list $list = new DataList($class); $where = ''; foreach ($fields as $field) { foreach ($terms as $term) { if ($where) { $where .= " OR "; } $where .= $field . " LIKE '%" . Convert::raw2sql($term) . "%'"; } } return $list->where($where); }
/** * Returns the pages meet a certain criteria as {@see CMSSiteTreeFilter} or the subpages of a parent page * defaulting to no filter and show all pages in first level. * Doubles as search results, if any search parameters are set through {@link SearchForm()}. * * @param Array Search filter criteria * @param Int Optional parent node to filter on (can't be combined with other search criteria) * @return SS_List */ public function getList($params, $parentID = 0) { $list = new DataList($this->stat('tree_class')); $filter = null; $ids = array(); if(isset($params['FilterClass']) && $filterClass = $params['FilterClass']){ if(!is_subclass_of($filterClass, 'CMSSiteTreeFilter')) { throw new Exception(sprintf('Invalid filter class passed: %s', $filterClass)); } $filter = new $filterClass($params); $filterOn = true; foreach($pages=$filter->pagesIncluded() as $pageMap){ $ids[] = $pageMap['ID']; } if(count($ids)) $list->where('"'.$this->stat('tree_class').'"."ID" IN ('.implode(",", $ids).')'); } else { $list->filter("ParentID", is_numeric($parentID) ? $parentID : 0); } return $list; }
public function onAfterWrite() { parent::onAfterWrite(); // This is to ensure this only fires once on each write if ($this->getFirstWrite()) { // Get Array of updated fields $UpdatedDataFields = $this->owner->getChangedFields(true, 2); // Get HasManyList of this Members MCSubscriptions $subs = $this->owner->getComponents("MCSubscriptions"); // If the Member Has One or More Subscriptions if (is_object($subs) && $subs->exists()) { // Foreach of This Members Subscription Objects foreach ($subs as $sub) { SS_Log::log("Subscription ID = " . $sub->ID, SS_Log::NOTICE); // Get DataList of MC List Field Mappings (Excluding LastVisited) Which Are On The Member Class && In A MCList Which Concerns This Member (i.e. One They Are Subscribed To) // (as if LastVisited is the ONLY updated field it just represents a site login, not an actual manual MC data field update) $dl = new DataList("MCListField"); $mappings = $dl->where("\"OnClass\" = 'Member' AND \"MCListID\" = '" . $sub->MCListID . "' AND \"SyncDirection\" IN ('Export','Both') AND \"FieldName\" != 'LastVisited'"); // Foreach Mapping Record foreach ($mappings as $mapping) { SS_Log::log("Mapping Field Name = " . $mapping->FieldName, SS_Log::NOTICE); // If The Member FieldName is One of the Updated Fields if (isset($UpdatedDataFields[$mapping->FieldName])) { // Mark the Subscription as Being Updated SS_Log::log("\$UpdatedDataFields['" . $mapping->FieldName . "'] Is Set, doing \$sub->write();", SS_Log::NOTICE); $sub->setSyncMailChimp($this->getSyncMailChimp()); // Set MCSubscriber Sync to MailChimp Based on This (Member) Sync State $sub->setForceAdditionalWrite(true); $sub->write(); break; } } } } else { if (isset($UpdatedDataFields["ID"])) { // Creation Write // Add New or Link Existing Subscription Records $subs = MCSubscription::get()->where("\"Email\" = '" . $this->owner->Email . "'"); if (is_object($subs) && $subs->exists()) { // Link Each Subscriber Object to this Member foreach ($subs as $sub) { $sub->setForceAdditionalWrite(true); $this->owner->getComponents("MCSubscriptions")->add($sub); } } else { // Get the Default MailChimp List To Relate The New Subscription To $MCList = MCList::get()->sort("\"SortOrder\" ASC")->first(); if (is_object($MCList) && $MCList->exists()) { // Create New Subscriber Object and Link to New Member $sub = new MCSubscription(); $sub->setField("FirstName", $this->owner->FirstName); $sub->setField("Surname", $this->owner->Surname); $sub->setField("Email", $this->owner->Email); $sub->setField("MemberID", $this->owner->ID); $sub->setField("MCListID", $MCList->ID); $sub->write(); // Link the New Subscriber Object to this Member $this->owner->getComponents("MCSubscriptions")->add($sub); } else { SS_Log::log("No MCList object available to add new MCSubscriptions to when saving Member #" . $this->owner->ID, SS_Log::NOTICE); } } } } } }
<?php require_once "DataList.php"; $testArray = array(array('name' => 'Anna', 'age' => 22, 'owns' => array('type' => 'furniture', 'label' => 'chair')), array('name' => 'Bill', 'age' => 12, 'owns' => array('type' => 'fruit', 'label' => 'apple')), array('name' => 'Cedric', 'age' => 33, 'owns' => array('type' => 'furniture', 'label' => 'sofa'))); $test = new DataList($testArray); $test->where('age', '> 15'); $test->where('name', '^[AaBbCc](.*)$'); $test->find(); if ($test->length()) { $people = $test->sort('name'); foreach ($people as $person) { echo $person['name'] . ", " . $person['age'] . "\n"; } }
public function CleanUpSubscriptionStatus($list = null) { if (!is_object($list)) { SS_Log::log("CleanUpSubscriptionStatus() Requireds MCList Object Parameter!", SS_Log::ERR); return false; } $emails = array(); $api = new MCAPI($this->apikey); // Get ALL Subscribed List Members $retval = $api->listMembers($list->ListID, 'subscribed', null, 0, 5000); if ($api->errorCode) { SS_Log::log("API Call Failed: listMembers('" . $list->ListID . "', 'subscribed', null, 0, 5000); Error Code = " . $api->errorCode . " | Error Message = " . $api->errorMessage, SS_Log::ERR); } else { SS_Log::log("API Call Success: listMembers('" . $list->ListID . "', 'subscribed', null, 0, 5000); Returned Members = " . $retval['total'], SS_Log::NOTICE); if ($retval['total'] > 0) { foreach ($retval['data'] as $member) { $emails[] = strtolower($member['email']); } } } // Get ALL Unsubscribed List Members $retval = $api->listMembers($list->ListID, 'unsubscribed', null, 0, 5000); if ($api->errorCode) { SS_Log::log("API Call Failed: listMembers('" . $list->ListID . "', 'unsubscribed', null, 0, 5000); Error Code = " . $api->errorCode . " | Error Message = " . $api->errorMessage, SS_Log::ERR); } else { SS_Log::log("API Call Success: listMembers('" . $list->ListID . "', 'unsubscribed', null, 0, 5000); Returned Members = " . $retval['total'], SS_Log::NOTICE); if ($retval['total'] > 0) { foreach ($retval['data'] as $member) { $emails[] = strtolower($member['email']); } } } if (!empty($emails)) { // For All Subscription Records On The Webstie Which Arnt In The MailChimp List (MailChimp Admin Panel Deletions and Subscriptions Yet To Be Confirmed) $dl = new DataList("MCSubscription"); $subs = $dl->where("\"MCListID\" = '" . $list->ID . "' AND LOWER(\"Email\") NOT IN (" . $this->arrayToCSV($emails) . ")"); if (!empty($subs)) { foreach ($subs as $sub) { $sub->setField("Subscribed", 0); $sub->setSyncMailChimp(false); $sub->write(); } } } }