public static function send(PetitionSigning $signing, $subject_prefix = null) { if ($signing->getValidationKind() != PetitionSigning::VALIDATION_KIND_EMAIL) { return; } $widget = $signing->getWidget(); $petition = $widget->getPetition(); $petition_text = $widget->getPetitionText(); $subject = $petition_text->getEmailValidationSubject(); $body = $petition_text->getEmailValidationBody(); $validation = UtilLink::signValidation($signing->getId(), $signing->getValidationData()); $url_ref_ = $signing->getField(Petition::FIELD_REF); // $this->getValue('ref'); $url_readmore_ = $petition->getReadMoreUrl(); $url_ref = UtilPolicat::firstString(array($url_ref_, $url_readmore_)); $url_readmore = UtilPolicat::firstString(array($url_readmore_, $url_ref_)); $from = $petition->getFrom(); $to = $signing->getEmail(); $additional_subst = array('URL-REFERER' => $url_ref, 'URL-READMORE' => $url_readmore, 'VALIDATION' => $validation, '#REFERER-URL#' => $url_ref, '#READMORE-URL#' => $url_readmore, '#VALIDATION-URL#' => $validation); if ($subject_prefix) { $i18n = sfContext::getInstance()->getI18N(); $i18n->setCulture($signing->getWidget()->getPetitionText()->getLanguageId()); $translated = $i18n->__($subject_prefix); $subject = $translated . ' ' . $subject; } UtilMail::sendWithSubst(null, $from, $to, $subject, $body, $petition_text, $widget, $additional_subst, $signing->getSubst()); }
/** * * @param Petition $petition * @param string $ts_1 * @param string $ts_2 * @param PetitionSigning $existing_signing * @return Doctrine_Query */ public function queryByTargetSelector(Petition $petition, $ts_1, $ts_2, $existing_signing = null) { $ts = $petition->getTargetSelectors(); $query = $this->createQuery('c')->where('c.mailing_list_id = ?', $petition->getMailingListId()); if ($existing_signing) { $query->andWhere('c.id NOT IN (SELECT psc.contact_id FROM PetitionSigningContact psc WHERE psc.petition_signing_id = ?)', $existing_signing->getId()); } if ($ts_1 && count($ts) > 0) { $sel = $ts[0]['id']; if (is_numeric($sel)) { $is_mapping = array_key_exists('kind', $ts[0]) && $ts[0]['kind'] == MailingListMeta::KIND_MAPPING; $is_choice = array_key_exists('kind', $ts[0]) && $ts[0]['kind'] == MailingListMeta::KIND_CHOICE; $query->leftJoin('c.ContactMeta cm1'); if ($is_mapping) { $mapped_ts1 = MappingPairTable::getInstance()->getMapByIdAndA($ts[0]['mapping_id'], $ts_1); $query->andWhere('cm1.mailing_list_meta_id = ?', $ts[0]['meta_id'])->leftJoin('cm1.MailingListMetaChoice mlmc1')->andWhereIn('mlmc1.choice', $mapped_ts1); } elseif ($is_choice && is_numeric($ts_1)) { $query->andWhere('cm1.mailing_list_meta_id = ?', $sel)->andWhere('cm1.mailing_list_meta_choice_id = ?', $ts_1); } else { // should not happen $query->andWhere('cm1.mailing_list_meta_id = ?', $sel)->andWhere('cm1.value = ?', $ts_1); } } else { if ($sel === 'contact') { if (is_numeric($ts_1)) { $query->andWhere("c.id = ?", $ts_1); } } else { if (is_string($ts_1) && $ts_1 != 'all') { $query->andWhere("c.{$sel} = ?", $ts_1); } } } if ($ts_2 && count($ts) > 1) { $sel = $ts[1]['id']; if (is_numeric($sel)) { if (is_numeric($ts_2)) { $query->leftJoin('c.ContactMeta cm2')->andWhere('cm2.mailing_list_meta_id = ?', $sel)->andWhere('cm2.mailing_list_meta_choice_id = ?', $ts_2); } } else { if (is_string($ts_2) && $ts_2 != 'all') { $query->andWhere("c.{$sel} = ?", $ts_2); } } } else { if (is_numeric($ts_2)) { $query->andWhere("c.id = ?", $ts_2); } } } return $query; }
public function savePetitionSigning(PetitionSigning $signing, $clean = true) { $string = ''; foreach (array(Petition::FIELD_FULLNAME => 'fullname', Petition::FIELD_FIRSTNAME => 'firstname', Petition::FIELD_LASTNAME => 'lastname', Petition::FIELD_EMAIL => 'email', Petition::FIELD_ADDRESS => 'address', Petition::FIELD_CITY => 'city', Petition::FIELD_POSTCODE => 'post_code') as $field_name) { $field = trim($signing->getField($field_name, '')); if ($field) { $string .= ' ' . $field; } } $parts = explode(' ', PetitionSigningSearchTable::normalize($string)); $final_parts = array(); foreach ($parts as $part) { $part = trim($part); $len = mb_strlen($part, 'UTF-8'); if ($len > 2) { if ($len > 48) { $final_parts[] = mb_substr($part, 0, 48, 'UTF-8'); } else { $final_parts[] = $part; } } } $unique_array = array_unique($final_parts, SORT_STRING); if (count($unique_array)) { if ($clean && $signing->getId()) { $this->createQuery('pss')->where('pss.id = ?', $signing->getId())->delete()->execute(); } $i = 0; try { $con = $this->getConnection(); $con->beginTransaction(); foreach ($unique_array as $keyword) { if ($i++ > 10) { break; } $psk = new PetitionSigningSearch(); $psk->setPetitionSigning($signing); $psk->setKeyword($keyword); $psk->save(); $psk->free(); } $con->commit(); } catch (Exception $e) { $con->rollback(); } } }
protected function doUpdateObject($values) { $code = PetitionSigning::genCode(); if ($this->getObject()->getPetition()->isGeoKind()) { // EMAIL-TO-LIST ACTION (AND PLEDGE) $fields = array(); $formFields = array(); foreach ($this->formfields as $fieldname) { $formFields[] = $fieldname; } if ($this->getObject()->getPetition()->isEmailKind()) { $formFields[] = Petition::FIELD_EMAIL_SUBJECT; $formFields[] = Petition::FIELD_EMAIL_BODY; } $non_json_fields = array('email', 'country', 'subscribe'); foreach ($formFields as $fieldname) { if (!in_array($fieldname, $non_json_fields)) { if (array_key_exists($fieldname, $values)) { $fields[$fieldname] = $values[$fieldname]; } } } $fields[Petition::FIELD_REF] = $values[Petition::FIELD_REF]; $wave = new PetitionSigningWave(); $wave->setWave($this->getObject()->getWavePending()); $wave->setFields(json_encode($fields)); $wave->setEmail($this->getValue(Petition::FIELD_EMAIL)); $wave->setCountry($this->getObject()->getPetition()->getWithCountry() ? $this->getValue(Petition::FIELD_COUNTRY) : $this->getObject()->getPetition()->getDefaultCountry()); $wave->setValidationData($code); $wave->setLanguageId($this->getObject()->getWidget()->getPetitionText()->getLanguageId()); $wave->setWidgetId($this->getObject()->getWidgetId()); $wave->setContactNum($this->contact_num); $object = $this->getObject(); $object['PetitionSigningWave'][] = $wave; } if (!$this->getObject()->isNew()) { unset($values[Petition::FIELD_EMAIL_SUBJECT], $values[Petition::FIELD_EMAIL_BODY]); } if (!$this->getObject()->getPetition()->getWithCountry()) { $values['country'] = $this->getObject()->getPetition()->getDefaultCountry(); } $validation_kind = $this->getOption('validation_kind', PetitionSigning::VALIDATION_KIND_NONE); switch ($validation_kind) { case PetitionSigning::VALIDATION_KIND_EMAIL: $values['validation_data'] = $code; $values['validation_kind'] = PetitionSigning::VALIDATION_KIND_EMAIL; break; case PetitionSigning::VALIDATION_KIND_NONE: default: $values['validation_kind'] = PetitionSigning::VALIDATION_KIND_NONE; break; } unset($values['id']); parent::doUpdateObject($values); }
protected function execute($arguments = array(), $options = array()) { // initialize the database connection $databaseManager = new sfDatabaseManager($this->configuration); $connection = $databaseManager->getDatabase($options['connection'])->getConnection(); $filename = $arguments['filename']; $petition_id = $arguments['petition_id']; $search_table = PetitionSigningSearchTable::getInstance(); $petition = PetitionTable::getInstance()->findById($petition_id, true); if (empty($petition)) { echo "Petition not found.\n"; return; } $campaign = $petition->getCampaign(); $formfields = $petition->getFormfields(); $formfields[] = Petition::FIELD_REF; $table = Doctrine_Core::getTable('PetitionSigning'); printf("Campaign: %s\nPetition: %s\n", $campaign['name'], $petition['name']); $first_id = false; $first_line = null; if (($handle = @fopen($filename, "r")) !== false) { $con = $table->getConnection(); $con->beginTransaction(); echo "Begin transaction\n"; try { $emails = array(); $i = 0; while (($data = fgetcsv($handle, 1000, ",")) !== false) { $i++; if ($i % 100 == 0) { echo "{$i}\n"; } //if ($i > 300) break; if (!is_array($first_line)) { $first_line = $data; } else { $line = array_combine($first_line, $data); $signing = new PetitionSigning(); $signing->setPetitionId($petition_id); $signing->setStatus(PetitionSigning::STATUS_VERIFIED); foreach ($formfields as $formfield) { switch ($formfield) { // case 'created_at': // $signing->setCreatedAt($line[$formfield]); // break; // case 'updated_at': // $signing->setUpdatedAt($line[$formfield]); // break; case Petition::FIELD_FULLNAME: $fullname = array(); if (isset($line[Petition::FIELD_FIRSTNAME])) { $fullname[] = trim($line[Petition::FIELD_FIRSTNAME]); } if (isset($line[Petition::FIELD_LASTNAME])) { $fullname[] = trim($line[Petition::FIELD_LASTNAME]); } if (isset($line[Petition::FIELD_FULLNAME])) { $fullname[] = trim($line[Petition::FIELD_FULLNAME]); } $fullname = join(' ', $fullname); $signing->setField(Petition::FIELD_FULLNAME, $fullname); break; case Petition::FIELD_SUBSCRIBE: if (isset($line[Petition::FIELD_SUBSCRIBE]) && $line[Petition::FIELD_SUBSCRIBE] == '1') { $signing->setField(Petition::FIELD_SUBSCRIBE, array('yes')); } else { $signing->setField(Petition::FIELD_SUBSCRIBE, array()); } break; default: if (isset($line[$formfield])) { $signing->setField($formfield, $line[$formfield]); } } } $signing->save(); $search_table->savePetitionSigning($signing, false); if ($first_id === false) { $first_id = $signing->getId(); } $email = $signing->getField(Petition::FIELD_EMAIL); if (is_string($email)) { $emails[] = trim($email); } $signing->free(); } } echo "checking duplicates\n"; while (count($emails) > 0) { $i = 0; $where_param = array(); $where = array(); while ($i++ < 100) { $email = array_shift($emails); if (empty($email)) { $break; } $where_param[] = $email; $where[] = '(LOWER(ps.email) = LOWER(?))'; } echo count($emails) . "\n"; $duplicates = $table->createQuery('ps')->where('ps.petition_id = ?', $petition_id)->andWhere('ps.id < ?', $first_id)->andWhere(join(' OR ', $where), $where_param)->execute(); foreach ($duplicates as $duplicate) { $duplicate->setStatus(PetitionSigning::STATUS_DUPLICATE); } $duplicates->save(); $duplicates->free(); } echo "Commit transaction"; $con->commit(); echo ".\n"; } catch (Exception $e) { $con->rollback(); echo "DB error. (rollback)\n"; } fclose($handle); } else { echo "File error.\n"; return; } }