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());
 }
 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();
         }
     }
 }
 /**
  *
  * @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;
 }