| <?php |
| /** |
| * Copyright (c) 2015, 2018 Eclipse Foundation and others. |
| * |
| * This program and the accompanying materials are made |
| * available under the terms of the Eclipse Public License 2.0 |
| * which is available at https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * Contributors: |
| * Christopher Guindon (Eclipse Foundation) - initial API and implementation |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| */ |
| |
| require_once("ad.class.php"); |
| |
| /** |
| * Eclipse Ads |
| * |
| * @package eclipse.org-common |
| * @subpackage ads |
| * @author: Christopher Guindon <chris.guindon@eclipse.org> |
| */ |
| class EclipseAds { |
| |
| /** |
| * The selected ad to display |
| * @var Ad object |
| */ |
| protected $ad = array(); |
| |
| /** |
| * List of all ads to chose from |
| * @var array |
| */ |
| protected $ads = array(); |
| |
| /** |
| * The HTML output of the ad |
| * @var string |
| */ |
| protected $output = ""; |
| |
| /** |
| * The description of the page that will display the ad |
| * @var string |
| */ |
| protected $source = ""; |
| |
| /** |
| * The total weight of all ads |
| * @var int |
| */ |
| protected $total_weight = 0; |
| |
| /** |
| * Constructor |
| * @param string $source |
| */ |
| public function __construct($source = "") { |
| if ($source != "") { |
| $this->source = $source; |
| } |
| } |
| |
| /** |
| * The ad builder, this funciton is ussually overwritten in a parent class |
| * @return string |
| */ |
| protected function _build($layout = "", $type = "", $impression_id = "") { |
| return ""; |
| } |
| |
| /** |
| * Add an add to the list of ads |
| * @param object $Ad |
| */ |
| public function newAd($Ad = NULL) { |
| if ($Ad->validAd()) { |
| $this->ads[] = $Ad; |
| } |
| } |
| |
| /** |
| * Randomly chose an ad from the list |
| * @return boolean |
| */ |
| protected function _choseAd() { |
| if (!empty($this->ads)) { |
| $this->_getTotalWeight(); |
| switch ($this->total_weight) { |
| // split evenly |
| case 0: |
| $random = array_rand($this->ads, 1); |
| $this->ad = $this->ads[$random]; |
| break; |
| |
| // use weight to chose an ad. |
| default: |
| $draw = rand(1, $this->total_weight); |
| $current = 0; |
| foreach ($this->ads as $Ad) { |
| $current = $current + $Ad->getWeight(); |
| if ($draw <= $current) { |
| $this->ad = $Ad; |
| break; |
| } |
| } |
| } |
| } |
| } |
| |
| private function _getTotalWeight() { |
| $this->total_weight = 0; |
| foreach ($this->ads as $ad) { |
| $this->total_weight = $ad->getWeight() + $this->total_weight; |
| } |
| return $this->total_weight; |
| } |
| |
| /** |
| * Return HTML of the add and count impression if possible |
| */ |
| public function output($layout = "") { |
| $this->_choseAd(); |
| |
| if (!empty($this->ad)) { |
| if ($this->ad->getType() == "empty") { |
| return ""; |
| } |
| $campaign = $this->ad->getCampaign(); |
| $impression_id = ""; |
| if (!empty($this->ad) && $campaign != "") { |
| $CampaignImpression = new CampaignImpression($campaign); |
| $impression_id = $CampaignImpression->recordImpression(); |
| } |
| $this->_build($layout, $this->ad->getType(), $impression_id); |
| } |
| return $this->output; |
| } |
| } |