fix #8131 - chinese translations
[Pman.Core] / DataObjects / Core_email.php
index 0227c60..02ce342 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Table Definition for core_email
  */
-require_once 'DB/DataObject.php';
+class_exists('DB_DataObject') ? '' : require_once 'DB/DataObject.php';
 
 class Pman_Core_DataObjects_Core_email extends DB_DataObject 
 {
@@ -20,7 +20,10 @@ class Pman_Core_DataObjects_Core_email extends DB_DataObject
     public $from_name;
     public $owner_id;
     public $is_system;
-
+    public $active;
+    public $bcc_group_id;
+    public $test_class;
+     
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
     
@@ -35,6 +38,33 @@ class Pman_Core_DataObjects_Core_email extends DB_DataObject
                 $tn.subject LIKE '%{$this->escape($q['search']['nameortitle'])}%'
             ");
         }
+        $cgm = DB_DataObject::Factory('core_group_member')->tableName();;
+      
+        $this->selectAdd("
+            (
+                SELECT 
+                    count(id) 
+                FROM 
+                    {$cgm}
+                WHERE 
+                    to_group_id = {$cgm}.group_id
+            )  AS group_member_count,
+            
+            (
+                SELECT 
+                    count(id) 
+                FROM 
+                    {$cgm}
+                WHERE 
+                    bcc_group_id = {$cgm}.group_id
+            )  AS bcc_group_member_count
+        ");
+
+       
+       if (!empty($_REQUEST['_hide_system_emails'])) {
+           $this->whereAddIn("!{$this->tableName()}.name", array('EVENT_ERRORS_REPORT'), 'string');
+       }
+       
     }
     
     function beforeDelete($dependants_array, $roo)
@@ -44,7 +74,7 @@ class Pman_Core_DataObjects_Core_email extends DB_DataObject
         $i->ontable = $this->tableName();
         $i->find();
         while ($i->fetch()){
-            $i->beforeDelete();
+            $i->beforeDelete(array(), $roo);
             $i->delete();
         }
     }
@@ -55,6 +85,16 @@ class Pman_Core_DataObjects_Core_email extends DB_DataObject
             $this->makeCopy($roo);
             
         }
+        
+        if ($this->to_group_id != -1) {
+                  
+            $c = DB_DataObject::factory('core_group_member');            
+            $c->group_id = $this->to_group_id;
+                        
+            if (!$c->count() && empty($request['_ignore_group_count'])) {
+                $roo->jerr('Failed to create email template - No member found in recieptent group',array('errcode'=> 100));
+            }
+        }
     }
     
     function makeCopy($roo)
@@ -179,7 +219,7 @@ class Pman_Core_DataObjects_Core_email extends DB_DataObject
     function processRelacements($replace_links = true)
     {   
         $cfg = isset(HTML_FlexyFramework::get()->Pman_Crm) ? HTML_FlexyFramework::get()->Pman_Crm : false;
-        print_r($cfg);exit;
+        
         libxml_use_internal_errors (true);
         $doc = new DOMDocument('1.0', 'UTF-8');
         $doc->loadHTML('<?xml encoding="UTF-8">'.$this->bodytext);
@@ -188,18 +228,22 @@ class Pman_Core_DataObjects_Core_email extends DB_DataObject
         
         foreach ($xpath->query('//img[@src]') as $img) { // process images!
             $href = $img->getAttribute('src');
-            $cid = explode('#', $href);
-            if(isset($cid[1])){
-                $img->setAttribute('src', 'cid:' . $cid[1]);
+            $hash = explode('#', $href);
+            // we name all our cid's as attachment-*
+            // however the src url may be #image-*
+            
+            
+            if(!isset($hash[1])){
+                continue;
+            }
+            $cid = explode('-', $hash[1]);
+            if(!empty($cid[1])){
+                $img->setAttribute('src', 'cid:attachment-' . $cid[1]);
             }
         }
         
-        $unsubscribe = false;
+        $unsubscribe = $this->unsubscribe_url();
         
-        if(!empty($cfg)){
-            $unsubscribe = $cfg ['server_baseurl'] . '/Crm/Unsubscribe/' . $this->id . '/{person.id}';
-        }
-       
         foreach ($xpath->query('//a[@href]') as $a) { 
             
             $href = $a->getAttribute('href');
@@ -215,6 +259,10 @@ class Pman_Core_DataObjects_Core_email extends DB_DataObject
             if (!$replace_links) {
                 continue;
             }
+           if (empty($cfg)) {
+               continue;
+           }
+           // not available if server_baseurl not set... and crm module not used.
             $link = DB_DataObject::factory('crm_mailing_list_link');
             $link->setFrom(array(
                 'url' => $href
@@ -234,17 +282,19 @@ class Pman_Core_DataObjects_Core_email extends DB_DataObject
             
         }
         
-        if(!empty($unsubscribe)){
+        if(!empty($unsubscribe) && !empty($cfg)){
             $element = $doc->createElement('img');
-        
+            $element->setAttribute('mailembed', 'no');
             $element->setAttribute('src', $cfg ['server_baseurl']  . '/Crm/Open/' . $this->id . '/{person.id}.html');
             $element->setAttribute('width', '1');
             $element->setAttribute('height', '1');
 
             $html = $doc->getElementsByTagName('html');
-            $html->item(0)->appendChild($element);
+            if ($html->length) {
+                $html->item(0)->appendChild($element);
+            }
             
-            $this->plaintext = str_replace("{unsubscribe_link}", $unsubscribe, $this->plaintext);
+            $this->plaintext = str_replace("{unsubscribe_link}", $unsubscribe, empty($this->plaintext) ? '' : $this->plaintext);
         }
         
         
@@ -258,21 +308,112 @@ class Pman_Core_DataObjects_Core_email extends DB_DataObject
         return;
     }
     
-    function send($obj, $force = true, $send = true)
-    {   
+    function unsubscribe_url()
+    {
+        $unsubscribe = false;
+        
+        $cfg = isset(HTML_FlexyFramework::get()->Pman_Crm) ? HTML_FlexyFramework::get()->Pman_Crm : false;
+        
+        if(!empty($cfg)){
+            $unsubscribe = $cfg ['server_baseurl'] . '/Crm/Unsubscribe/' . $this->id . '/{person.id}';
+        }
+        
+        return $unsubscribe;
+    }
+    
+    /**
+     * convert email with contents into a core mailer object. - ready to send..
+     * @param Object|Array $obj Object (or array) to send @see Pman_Core_Mailer
+     *    + subject
+     *    + rcpts || person   << if person is set - then it goes to them...
+     *    + rcpts_group (string) << name of group - normally to send admin emails.. (if set, then bcc_group is ignored.)
+     *    + replace_links
+     *    + template
+     *    + mailer_opts
+     *    + person << who it actually goes to..
+     *    
+     * @param bool $force - force re-creation of cached version of email.
+     *
+     * @returns Pman_Core_Mailer||PEAR_Error
+     */
+    
+    function toMailer($obj,$force=false)
+    {
+        require_once 'PEAR.php';
+        
+        $p = new PEAR();
         $contents = (array)$obj;
         
-        if(empty($this->id)){
+        if(empty($this->id) && !empty($contents['template'])){
             $this->get('name', $contents['template']);
         }
+             
+        
+        if(empty($this->active)){
+            return $p->raiseError("template [{$contents['template']}] is Disabled");
+        }
+        
         
         if(empty($this->id)){
-            return PEAR::raiseError("template [{$contents['template']}]has not been set");
+            return $p->raiseError("template [{$contents['template']}] has not been set");
         }
+        
+        // fill in BCC
+        
+        if (!empty($this->bcc_group_id) && $this->bcc_group_id > 0 && empty($contents['bcc']) && empty($contents['rcpts_group'])) {
+            $admin_grp = DB_DAtaObject::Factory('core_group')->load($this->bcc_group_id);
+           
+           $admin = $admin_grp ?  $admin_grp->members('email') : false;
+            
+            if (empty($admin) && $admin_grp->name != 'Empty Group') { // allow 'empty group mname'
+                return $p->raiseError("template [{$contents['template']}] - bcc group is empty");
+            }
+            
+            $contents['bcc'] = $admin ;
+        }
+        if (!empty($contents['rcpts_group'])) {
+            
+            $admin = DB_DAtaObject::Factory('core_group')->lookupMembers($contents['rcpts_group'],'email');
+            
+            if (empty($admin)) {
+                return $p->raiseError("Trying to send to {$contents['rcpts_group']} - group is empty");
+            }
+            $contents['rcpts'] = $admin;
+        }
+        if (empty($contents['rcpts']) && $this->to_group_id > 0) {
+           $members = $this->to_group()->members();
+           $contents['rcpts'] = array();
+           foreach($this->to_group()->members() as $m) {
+               $contents['rcpts'][] = $m->email;
+           }
+           //var_dump($contents['rcpts']);
+           
+       }
+        //subject replacement
         if(empty($contents['subject'])){
            $contents['subject'] = $this->subject; 
         }
         
+        if (!empty($contents['subject_replace'])) {
+            
+            // do not use the mapping 
+            if (isset($contents['mapping'])) {
+                foreach ($contents['mapping'] as $pattern => $replace) {
+                    $contents['subject'] = preg_replace($pattern,$replace,$contents['subject']);
+                }
+            }
+            
+            foreach ($contents as $k => $v) {
+                if (is_string($v)) {
+                    $contents['subject'] = str_replace('{'. $k . '}', $v, $contents['subject']);
+                }
+            }
+        }
+        
+        if(!empty($contents['rcpts']) && is_array($contents['rcpts'])){
+            $contents['rcpts'] = implode(',', $contents['rcpts']);
+        }     
+        
         $ui = posix_getpwuid(posix_geteuid());
         
         $cachePath = session_save_path() . '/email-cache-' . $ui['name'] . '/mail/' . $this->tableName() . '-' . $this->id . '.txt';
@@ -285,12 +426,31 @@ class Pman_Core_DataObjects_Core_email extends DB_DataObject
         
         $templateDir = session_save_path() . '/email-cache-' . $ui['name'] ;
         
-        $r = new Pman_Core_Mailer(array(
+        $cfg = array(
             'template'=> $this->tableName() . '-' . $this->id,
             'templateDir' => $templateDir,
             'page' => $this,
-            'contents' => $contents
-        ));
+            'contents' => $contents,
+            'css_embed' => true, // we should always try and do this with emails...
+        );
+        
+        if (isset($contents['rcpts'])) {
+            $cfg['rcpts'] = $contents['rcpts'];
+        }
+        
+        if (isset($contents['attachments'])) {
+            $cfg['attachments'] = $contents['attachments'];
+        }
+        
+        if (isset($contents['mailer_opts']) && is_array($contents['mailer_opts'])) {
+            $cfg = array_merge($contents['mailer_opts'], $cfg);
+        }
+        
+        if(isset($contents['css_inline'])){
+            $cfg['css_inline'] = $contents['css_inline'];
+        }
+        
+        $r = new Pman_Core_Mailer($cfg);
         
         $imageCache = session_save_path() . '/email-cache-' . $ui['name'] . '/mail/' . $this->tableName() . '-' . $this->id . '-images.txt';
         
@@ -299,13 +459,44 @@ class Pman_Core_DataObjects_Core_email extends DB_DataObject
             $r->images = $images;
         }
         
-        $ret = $r->toData();
+        return $r;
+    }
+    function toMailerData($obj,$force=false)
+    {   
+        $r = $this->toMailer($obj, $force);
+        if (is_a($r, 'PEAR_Error')) {
+            return $r;
+        }
+        return $r->toData();
+    }
+    
+    /**
+     *
+     * DEPRICATED !!! - DO NOT USE THIS !!!
+     *
+     * use: toMailerData() -- to return the email data..
+     * or
+     * $mailer = $core_email->toMailer($obj, false);
+     * $sent = is_a($mailer,'PEAR_Error') ? false : $mailer->send();
+
+     * toMailer($obj, false)->send()
+     *
+     * 
+     */
+    
+    function send($obj, $force = true, $send = true)
+    {   
+        if (!$send) {
+            return $this->toMailerData($obj,$force);
+        }
+        
+        $r = $this->toMailer($obj, $force);
         
-        if(!$send){
-            return $ret;
+        if (is_a($r, 'PEAR_Error')) {
+            return $r;
         }
         
-        return $r->send($ret);
+        return $r->send();
     }
     
     function cachedMailWithOutImages($force = false, $replace_links = true)
@@ -331,10 +522,11 @@ class Pman_Core_DataObjects_Core_email extends DB_DataObject
 
         fwrite($fh, implode("\n", array(
             "From: {if:t.messageFrom}{t.messageFrom:h}{else:}{t.messageFrom():h}{end:}",
-            "To: {if:t.person}{t.person.getEmailFrom():h}{else:}{foreach:rcpts,v}{v:h},{end:}{end:}",
+            "To: {if:t.person}{t.person.getEmailFrom():h}{else:}{rcpts:h}{end:}",
+            "Subject: {t.subject:h} ",
+            "X-Message-ID: {t.id} ",
             "{if:t.replyTo}Reply-To: {t.replyTo:h}{end:}",
-            "Subject: {t.subject} ",
-            "X-Message-ID: {t.id} "
+            "{if:t.mailgunVariables}X-Mailgun-Variables: {t.mailgunVariables:h}{end:}"
         ))."\n");
         
         
@@ -361,8 +553,20 @@ Content-Transfer-Encoding: 7bit
             mkdir(dirname($cachePath), 0700, true);
         }
         
-        file_put_contents($cachePath, $this->bodytext);
+        if (empty($this->use_file)) {
+            file_put_contents($cachePath, $this->bodytext);
+            return;
+        }
+        // use-file -- uses the original template...
+        $mailtext = file_get_contents($this->use_file);        
+         
+        require_once 'Mail/mimeDecode.php';
+        require_once 'Mail/RFC822.php';
         
+        $decoder = new Mail_mimeDecode($mailtext);
+        $parts = $decoder->getSendArray();
+        file_put_contents($cachePath,$parts[2]);
+         
     }
     
     function cachedImages()
@@ -392,7 +596,7 @@ Content-Transfer-Encoding: 7bit
                 continue;
             }
             
-            $images["attachment-$i->id"] = array(
+            $images["attachment-{$i->id}"] = array(
                 'file' => $i->getStoreName(),
                 'mimetype' => $i->mimetype,
                 'ext' => $y->toExt($i->mimetype),
@@ -410,6 +614,17 @@ Content-Transfer-Encoding: 7bit
             return false;
         }
         
+        if (!empty($this->use_file)) {
+            $ctime = filemtime($cachePath);
+            $mtime = filemtime($this->use_file);
+            if($ctime >= $mtime){
+                return true;
+            }
+            return false;
+            
+        }
+        
+        
         
         $ctime = filemtime($cachePath);
         $mtime = array();
@@ -430,7 +645,10 @@ Content-Transfer-Encoding: 7bit
     
     function messageFrom()
     {
-        return '"' . addslashes($this->from_name) . '" <' . $this->from_email. '>'  ;
+        if (empty($this->from_name)) {
+            return trim($this->from_email);
+        }
+        return trim('"' . addslashes($this->from_name) . '" <' . $this->from_email. '>')  ;
     }
     
     function formatDate($dt, $format = 'd/M/Y')
@@ -439,5 +657,70 @@ Content-Transfer-Encoding: 7bit
     } 
     
     
+     // fixme - this is now in core/udatedatabase..
+    
+    function initMail($mail_template_dir,  $name, $master='')
+    {
+        $cm = DB_DataObject::factory('core_email');
+        if ($cm->get('name', $name)) {
+            return;
+        }
+        
+//        $basedir = $this->bootLoader->rootDir . $mail_template_dir;
+        
+        $opts = array();
+        
+        $opts['file'] = $mail_template_dir. $name .'.html';
+        if (!empty($master)) {
+            $opts['master'] = $mail_template_dir . $master .'.html';
+        }
+        //print_r($opts);
+        require_once 'Pman/Core/Import/Core_email.php';
+        $x = new Pman_Core_Import_Core_email();
+        $x->get('', $opts);
+         
+    }
+    
+    
+    function testData($person, $dt , $core_notify)
+    {
+        
+       // should return the formated email???
+       $pg = HTML_FlexyFramework::get()->page;
+       
+        
+       
+       
+        if(empty($this->test_class)){
+            $pg->jerr("[{$this->name}] does not has test class");
+        }
+        
+        require_once "{$this->test_class}.php";
+        
+        $cls = str_replace('/', '_', $this->test_class);
+        
+        $x = new $cls;
+        
+        $method = "test_{$this->name}";
+        
+        if(!method_exists($x, $method)){
+            $pg->jerr("{$method} does not exists in {$cls}");
+        }
+        
+        $content = $x->{$method}($this, $person);
+        $content['to'] = $person->getEmailFrom();
+
+        $content['bcc'] = array();
+       $data = $this->toMailerData($content);
+       return $data;
+        
+           
+    }
     
+    function to_group()
+    {
+       $g = DB_DataObject::Factory('core_group');
+       $g->get($this->to_group_id);
+       return $g;
+    }
 }