Open Journal Systems  3.3.0
SubscriptionForm.inc.php
1 <?php
2 
16 import('lib.pkp.classes.form.Form');
17 
18 class SubscriptionForm extends Form {
19 
21  var $subscription;
22 
24  var $userId;
25 
28 
31 
33  var $validCountries;
34 
40  public function __construct($template, $subscriptionId = null) {
41  parent::__construct($template);
42 
43  $subscriptionId = isset($subscriptionId) ? (int) $subscriptionId : null;
44 
45  $this->subscription = null;
46  $this->subscriptionTypes = null;
47 
48  import('classes.subscription.SubscriptionDAO');
49  $this->validStatus = SubscriptionDAO::getStatusOptions();
50 
51  $isoCodes = new \Sokil\IsoCodes\IsoCodesFactory();
52  $this->validCountries = array();
53  foreach ($isoCodes->getCountries() as $country) {
54  $this->validCountries[$country->getAlpha2()] = $country->getLocalName();
55  }
56  asort($this->validCountries);
57 
58  // User is provided and valid
59  $this->addCheck(new FormValidator($this, 'userId', 'required', 'manager.subscriptions.form.userIdRequired'));
60  $this->addCheck(new FormValidatorCustom($this, 'userId', 'required', 'manager.subscriptions.form.userIdValid', function($userId) {
61  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
62  return $userDao->userExistsById($userId);
63  }));
64 
65  // Subscription status is provided and valid
66  $this->addCheck(new FormValidator($this, 'status', 'required', 'manager.subscriptions.form.statusRequired'));
67  $this->addCheck(new FormValidatorInSet($this, 'status', 'required', 'manager.subscriptions.form.statusValid', array_keys($this->validStatus)));
68  // Subscription type is provided
69  $this->addCheck(new FormValidator($this, 'typeId', 'required', 'manager.subscriptions.form.typeIdRequired'));
70  // Notify email flag is valid value
71  $this->addCheck(new FormValidatorInSet($this, 'notifyEmail', 'optional', 'manager.subscriptions.form.notifyEmailValid', array('1')));
72 
73  $this->addCheck(new FormValidatorPost($this));
74  $this->addCheck(new FormValidatorCSRF($this));
75  }
76 
81  public function fetch($request, $template = null, $display = false) {
82  $templateMgr = TemplateManager::getManager($request);
83  $templateMgr->assign(array(
84  'subscriptionId' => $this->subscription?$this->subscription->getId():null,
85  'yearOffsetPast' => SUBSCRIPTION_YEAR_OFFSET_PAST,
86  'yearOffsetFuture' => SUBSCRIPTION_YEAR_OFFSET_FUTURE,
87  'validStatus' => $this->validStatus,
88  'subscriptionTypes' => $this->subscriptionTypes,
89  ));
90  return parent::fetch($request, $template, $display);
91  }
92 
96  public function initData() {
97  if (isset($this->subscription)) {
99  $this->_data = array(
100  'status' => $subscription->getStatus(),
101  'userId' => $subscription->getUserId(),
102  'typeId' => $subscription->getTypeId(),
103  'dateStart' => $subscription->getDateStart(),
104  'dateEnd' => $subscription->getDateEnd(),
105  'membership' => $subscription->getMembership(),
106  'referenceNumber' => $subscription->getReferenceNumber(),
107  'notes' => $subscription->getNotes()
108  );
109  }
110  }
111 
115  public function readInputData() {
116  $this->readUserVars(array('status', 'userId', 'typeId', 'membership', 'referenceNumber', 'notes', 'notifyEmail', 'dateStart', 'dateEnd'));
117 
118  // If subscription type requires it, membership is provided
119  $subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /* @var $subscriptionTypeDao SubscriptionTypeDAO */
120  $needMembership = $subscriptionTypeDao->getSubscriptionTypeMembership($this->getData('typeId'));
121 
122  if ($needMembership) {
123  $this->addCheck(new FormValidator($this, 'membership', 'required', 'manager.subscriptions.form.membershipRequired'));
124  }
125 
126  // If subscription type requires it, start and end dates are provided
127  $subscriptionType = $subscriptionTypeDao->getById($this->getData('typeId'));
128  $nonExpiring = $subscriptionType->getNonExpiring();
129 
130  if (!$nonExpiring) {
131  // Start date is provided and is valid
132  $this->addCheck(new FormValidator($this, 'dateStart', 'required', 'manager.subscriptions.form.dateStartRequired'));
133  $this->addCheck(new FormValidatorCustom($this, 'dateStart', 'required', 'manager.subscriptions.form.dateStartValid', function($dateStart) {
134  $dateStartYear = strftime('%Y', strtotime($dateStart));
135  $minYear = date('Y') + SUBSCRIPTION_YEAR_OFFSET_PAST;
136  $maxYear = date('Y') + SUBSCRIPTION_YEAR_OFFSET_FUTURE;
137  return ($dateStartYear >= $minYear && $dateStartYear <= $maxYear);
138  }));
139  $this->addCheck(new FormValidatorCustom($this, 'dateStart', 'required', 'manager.subscriptions.form.dateStartValid', function($dateStart) {
140  $dateStartMonth = strftime('%m', strtotime($dateStart));
141  return ($dateStartMonth >= 1 && $dateStartMonth <= 12);
142  }));
143  $this->addCheck(new FormValidatorCustom($this, 'dateStart', 'required', 'manager.subscriptions.form.dateStartValid', function($dateStart) {
144  $dateStartDay = strftime('%d', strtotime($dateStart));
145  return ($dateStartDay >= 1 && $dateStartDay <= 31);
146  }));
147 
148  // End date is provided and is valid
149  $this->addCheck(new FormValidator($this, 'dateEnd', 'required', 'manager.subscriptions.form.dateEndRequired'));
150  $this->addCheck(new FormValidatorCustom($this, 'dateEnd', 'required', 'manager.subscriptions.form.dateEndValid', function($dateEnd) {
151  $dateEndYear = strftime('%Y', strtotime($dateEnd)); $minYear = date('Y') + SUBSCRIPTION_YEAR_OFFSET_PAST;
152  $maxYear = date('Y') + SUBSCRIPTION_YEAR_OFFSET_FUTURE;
153  return ($dateEndYear >= $minYear && $dateEndYear <= $maxYear);
154  }));
155  $this->addCheck(new FormValidatorCustom($this, 'dateEnd', 'required', 'manager.subscriptions.form.dateEndValid', function($dateEnd) {
156  $dateEndMonth = strftime('%m', strtotime($dateEnd));
157  return ($dateEndMonth >= 1 && $dateEndMonth <= 12);
158  }));
159  $this->addCheck(new FormValidatorCustom($this, 'dateEnd', 'required', 'manager.subscriptions.form.dateEndValid', function($dateEnd) {
160  $dateEndDay = strftime('%d', strtotime($dateEnd));
161  return ($dateEndDay >= 1 && $dateEndDay <= 31);
162  }));
163  } else {
164  // Is non-expiring; ensure that start/end dates weren't entered.
165  $this->addCheck(new FormValidatorCustom($this, 'dateStart', 'optional', 'manager.subscriptions.form.dateStartEmpty', function($dateStart) {
166  return empty($dateStart);
167  }));
168  $this->addCheck(new FormValidatorCustom($this, 'dateEnd', 'optional', 'manager.subscriptions.form.dateEndEmpty', function($dateEnd) {
169  return empty($dateEnd);
170  }));
171  }
172 
173  // If notify email is requested, ensure subscription contact name and email exist.
174  if ($this->_data['notifyEmail'] == 1) {
175  $this->addCheck(new FormValidatorCustom($this, 'notifyEmail', 'required', 'manager.subscriptions.form.subscriptionContactRequired', function() {
176  $request = Application::get()->getRequest();
177  $journal = $request->getJournal();
178  $subscriptionName = $journal->getData('subscriptionName');
179  $subscriptionEmail = $journal->getData('subscriptionEmail');
180  return $subscriptionName != '' && $subscriptionEmail != '';
181  }));
182  }
183  }
184 
188  public function execute(...$functionArgs) {
189  $request = Application::get()->getRequest();
190  $journal = $request->getJournal();
192 
193  parent::execute(...$functionArgs);
194 
195  $subscription->setJournalId($journal->getId());
196  $subscription->setStatus($this->getData('status'));
197  $subscription->setUserId($this->getData('userId'));
198  $subscription->setTypeId($this->getData('typeId'));
199  $subscription->setMembership($this->getData('membership') ? $this->getData('membership') : null);
200  $subscription->setReferenceNumber($this->getData('referenceNumber') ? $this->getData('referenceNumber') : null);
201  $subscription->setNotes($this->getData('notes') ? $this->getData('notes') : null);
202 
203  $subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /* @var $subscriptionTypeDao SubscriptionTypeDAO */
204  $subscriptionType = $subscriptionTypeDao->getById($subscription->getTypeId());
205  if (!$subscriptionType->getNonExpiring()) {
206  $subscription->setDateStart($this->getData('dateStart'));
207  $subscription->setDateEnd($this->getData('dateEnd'));
208  }
209  }
210 
215  protected function _prepareNotificationEmail($mailTemplateKey) {
216  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
217  $subscriptionTypeDao = DAORegistry::getDAO('SubscriptionTypeDAO'); /* @var $subscriptionTypeDao SubscriptionTypeDAO */
218 
219  $request = Application::get()->getRequest();
220  $journal = $request->getJournal();
221  $journalName = $journal->getLocalizedTitle();
222  $user = $userDao->getById($this->subscription->getUserId());
223  $subscriptionType = $subscriptionTypeDao->getById($this->subscription->getTypeId());
224 
225  $subscriptionName = $journal->getData('subscriptionName');
226  $subscriptionEmail = $journal->getData('subscriptionEmail');
227  $subscriptionPhone = $journal->getData('subscriptionPhone');
228  $subscriptionMailingAddress = $journal->getData('subscriptionMailingAddress');
229  $subscriptionContactSignature = $subscriptionName;
230 
231  if ($subscriptionMailingAddress != '') {
232  $subscriptionContactSignature .= "\n" . $subscriptionMailingAddress;
233  }
234  if ($subscriptionPhone != '') {
235  $subscriptionContactSignature .= "\n" . __('user.phone') . ': ' . $subscriptionPhone;
236  }
237 
238  $subscriptionContactSignature .= "\n" . __('user.email') . ': ' . $subscriptionEmail;
239 
240  $paramArray = array(
241  'subscriberName' => $user->getFullName(),
242  'journalName' => $journalName,
243  'subscriptionType' => $subscriptionType->getSummaryString(),
244  'username' => $user->getUsername(),
245  'subscriptionContactSignature' => $subscriptionContactSignature
246  );
247 
248  import('lib.pkp.classes.mail.MailTemplate');
249  $mail = new MailTemplate($mailTemplateKey);
250  $mail->setReplyTo($subscriptionEmail, $subscriptionName);
251  $mail->addRecipient($user->getEmail(), $user->getFullName());
252  $mail->setSubject($mail->getSubject($journal->getPrimaryLocale()));
253  $mail->setBody($mail->getBody($journal->getPrimaryLocale()));
254  $mail->assignParams($paramArray);
255 
256  return $mail;
257  }
258 }
259 
260 
SubscriptionForm\execute
execute(... $functionArgs)
Definition: SubscriptionForm.inc.php:203
SubscriptionForm\$subscription
$subscription
Definition: SubscriptionForm.inc.php:24
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
Form\readUserVars
readUserVars($vars)
Definition: Form.inc.php:378
Form\getData
getData($key)
Definition: Form.inc.php:220
SubscriptionForm\__construct
__construct($template, $subscriptionId=null)
Definition: SubscriptionForm.inc.php:55
FormValidatorPost
Form validation check to make sure the form is POSTed.
Definition: FormValidatorPost.inc.php:18
MailTemplate
Subclass of Mail for mailing a template email.
Definition: MailTemplate.inc.php:21
SubscriptionForm\fetch
fetch($request, $template=null, $display=false)
Definition: SubscriptionForm.inc.php:96
SubscriptionForm
Base form class for subscription create/edits.
Definition: SubscriptionForm.inc.php:18
SubscriptionForm\$userId
$userId
Definition: SubscriptionForm.inc.php:30
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
SubscriptionForm\$subscriptionTypes
$subscriptionTypes
Definition: SubscriptionForm.inc.php:36
FormValidator
Class to represent a form validation check.
Definition: FormValidator.inc.php:23
SubscriptionForm\_prepareNotificationEmail
_prepareNotificationEmail($mailTemplateKey)
Definition: SubscriptionForm.inc.php:230
SubscriptionForm\$validCountries
$validCountries
Definition: SubscriptionForm.inc.php:48
Form\addCheck
addCheck($formValidator)
Definition: Form.inc.php:395
FormValidatorInSet
Form validation check that checks if value is within a certain set.
Definition: FormValidatorInSet.inc.php:18
FormValidatorCSRF
Form validation check to make sure the CSRF token is correct.
Definition: FormValidatorCSRF.inc.php:18
Form
Class defining basic operations for handling HTML forms.
Definition: Form.inc.php:47
SubscriptionForm\readInputData
readInputData()
Definition: SubscriptionForm.inc.php:130
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
SubscriptionDAO\getStatusOptions
static getStatusOptions()
Definition: SubscriptionDAO.inc.php:54
FormValidatorCustom
Form validation check with a custom user function performing the validation check.
Definition: FormValidatorCustom.inc.php:18
SubscriptionForm\$validStatus
$validStatus
Definition: SubscriptionForm.inc.php:42
SubscriptionForm\initData
initData()
Definition: SubscriptionForm.inc.php:111