1: <?php
2: /*****************************************************************************************
3: * X2Engine Open Source Edition is a customer relationship management program developed by
4: * X2Engine, Inc. Copyright (C) 2011-2016 X2Engine Inc.
5: *
6: * This program is free software; you can redistribute it and/or modify it under
7: * the terms of the GNU Affero General Public License version 3 as published by the
8: * Free Software Foundation with the addition of the following permission added
9: * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
10: * IN WHICH THE COPYRIGHT IS OWNED BY X2ENGINE, X2ENGINE DISCLAIMS THE WARRANTY
11: * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
12: *
13: * This program is distributed in the hope that it will be useful, but WITHOUT
14: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15: * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
16: * details.
17: *
18: * You should have received a copy of the GNU Affero General Public License along with
19: * this program; if not, see http://www.gnu.org/licenses or write to the Free
20: * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21: * 02110-1301 USA.
22: *
23: * You can contact X2Engine, Inc. P.O. Box 66752, Scotts Valley,
24: * California 95067, USA. or at email address [email protected].
25: *
26: * The interactive user interfaces in modified source and object code versions
27: * of this program must display Appropriate Legal Notices, as required under
28: * Section 5 of the GNU Affero General Public License version 3.
29: *
30: * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
31: * these Appropriate Legal Notices must retain the display of the "Powered by
32: * X2Engine" logo. If the display of the logo is not reasonably feasible for
33: * technical reasons, the Appropriate Legal Notices must display the words
34: * "Powered by X2Engine".
35: *****************************************************************************************/
36:
37: /**
38: * A Campaign represents a one time mailing to a list of contacts.
39: *
40: * When a campaign is created, a contact list must be specified. When a campaing is 'launched'
41: * a duplicate list is created leaving the original unchanged. The duplicate 'campaign' list
42: * will keep track of which contacts were sent email, who opened the mail, and who unsubscribed.
43: * A campaign is 'active' after it has been launched and ready to send mail. A campaign is 'complete'
44: * when all applicable email has been sent. This is the model class for table "x2_campaigns".
45: *
46: * @package application.modules.marketing.models
47: */
48: class Campaign extends X2Model {
49:
50: const CAMPAIGN_TYPE_DROPDOWN = 107;
51:
52: public $supportsWorkflow = false;
53:
54: public static function model($className=__CLASS__) {
55: return parent::model($className);
56: }
57:
58: public function tableName() { return 'x2_campaigns'; }
59:
60: public function behaviors() {
61: return array_merge(parent::behaviors(),array(
62: 'X2LinkableBehavior'=>array(
63: 'class'=>'X2LinkableBehavior',
64: 'module'=>'marketing'
65: ),
66: 'ERememberFiltersBehavior' => array(
67: 'class'=>'application.components.ERememberFiltersBehavior',
68: 'defaults'=>array(),
69: 'defaultStickOnClear'=>false
70: ),
71: 'TagBehavior' => array(
72: 'class' => 'TagBehavior',
73: 'disableTagScanning' => true,
74: ),
75: ));
76: }
77:
78: public function relations() {
79: return array_merge(parent::relations(),array(
80: 'list'=>array(self::BELONGS_TO, 'X2List', array('listId'=>'nameId')),
81: 'attachments'=>array(self::HAS_MANY, 'CampaignAttachment', 'campaign'),
82: ));
83: }
84:
85: //Similar to X2Model but we had a special case with 'marketing'
86: public function attributeLabels() {
87: $this->queryFields();
88:
89: $labels = array();
90:
91: foreach(self::$_fields[$this->tableName()] as &$_field)
92: $labels[ $_field->fieldName ] = Yii::t('marketing',$_field->attributeLabel);
93:
94: return $labels;
95: }
96:
97: //Similar to X2Model but we had a special case with 'marketing'
98: public function getAttributeLabel($attribute) {
99:
100: $this->queryFields();
101:
102: // don't call attributeLabels(), just look in self::$_fields
103: foreach(self::$_fields[$this->tableName()] as &$_field) {
104: if($_field->fieldName == $attribute)
105: return Yii::t('marketing',$_field->attributeLabel);
106: }
107: // original Yii code
108: if(strpos($attribute,'.')!==false) {
109: $segs=explode('.',$attribute);
110: $name=array_pop($segs);
111: $model=$this;
112: foreach($segs as $seg) {
113: $relations=$model->getMetaData()->relations;
114: if(isset($relations[$seg]))
115: $model=X2Model::model($relations[$seg]->className);
116: else
117: break;
118: }
119: return $model->getAttributeLabel($name);
120: } else
121: return $this->generateAttributeLabel($attribute);
122: }
123:
124: /**
125: * Convenience method to retrieve a Campaign model by id. Filters by the current user's permissions.
126: *
127: * @param integer $id Model id
128: * @return Campaign
129: */
130: public static function load($id) {
131: $model = X2Model::model('Campaign');
132: return $model->with('list')->findByPk((int)$id,$model->getAccessCriteria());
133: }
134:
135: /**
136: * Search all Campaigns using this model's attributes as the criteria
137: *
138: * @return Array Set of matching Campaigns
139: */
140: public function search() {
141: $criteria=new CDbCriteria;
142: return $this->searchBase($criteria);
143: }
144:
145: /**
146: * Override of {@link X2Model::setX2Fields}
147: *
148: * Skips HTML purification for the content so that tracking links will work.
149: */
150: public function setX2Fields(&$data, $filter = false, $bypassPermissions=false) {
151: $originalContent = isset($data['content'])?$data['content']:$this->content;
152: parent::setX2Fields($data, $filter, $bypassPermissions);
153: $this->content = $originalContent;
154: }
155:
156: public static function getValidContactLists () {
157: $lists = X2Model::model('ContactList')->findAllByAttributes (array(),
158: "type!='campaign'"
159: );
160: return $lists;
161: }
162:
163: public function getDisplayName ($plural=true, $ofModule=true) {
164: if (!$ofModule) {
165: return Yii::t('app', 'Campaign'.($plural ? 's' : ''));
166: } else {
167: return parent::getDisplayName ($plural, $ofModule);
168: }
169: }
170: }
171: