2013-09-09 3 views
1

Использование Code Igniter с экземпляром mysql, я хотел бы иметь возможность генерировать электронные письма при добавлении конкретных записей. Адреса электронной почты и события, для которых должны быть созданы электронные письма, хранятся в базе данных. Я думал, что код для генерации этих писем принадлежал в after_add крюка, например, так:Код Igniter query после добавления

function c_claims_after_add($tableModel) { 
    $CI = &get_instance(); 

    $CI->db->select("ee.location_specific as sp"); 
    $CI->db->select("u.EMail as email"); 
    $CI->db->select("u.idLocation as idLocation"); 
    $CI->db->from("emails em"); 
    $CI->db->join("email_events ee" , "ee.id = em.idEvent" , "LEFT"); 
    $CI->db->join("users u" , "u.id = em.idUser" , "LEFT"); 
    $CI->db->where("ee.event='Claim Added'"); 
    $query = $CI->db->get(); 

    $recipients=""; 
    foreach ($query->result_array() as $r) { 
     if($r['sp']==1 && $r['idLocation'] != $tableModel->fields['idLocation']->dbValue) 
     { 
      continue; 
     } 
     else 
     { 
      $recipients .= $r['email']." , "; 
     } 
    } 
    //$recipients="[email protected] , [email protected]"; 

    $CI->load->library('email'); 


    $CI->email->from("[email protected]", "Code Igniter App"); 
    $CI->email->reply_to("[email protected]", "Code Guy"); 
    $CI->email->to($recipients); 

    $CI->email->subject("Added claim for ".$tableModel->fields['ClaimNumber']->dbValue); 
    $CI->email->message("This was installed on: ".$tableModel->fields['InstallDate']->dbValue."\r\nDamage statement: ".$tableModel->fields['DamageDescription']->dbValue); 

    $CI->email->send(); 
    } 

Однако, когда я запускаю это я получаю сообщение об ошибке при вставке записи в таблицу требований. Вместо ввода значений в форму, значение по умолчанию пытается вводить там:

clearFormError('claims_add_form'); setFormError('claims_add_form' , 'Cannot add or update a child row: a foreign key constraint fails (`codeigniter_app`.`claims`, CONSTRAINT `claims_fk3` FOREIGN KEY (`idLocation`) REFERENCES `locations` (`id`)) 
INSERT INTO `claims` (`Date`, `ClaimNumber`, `idStatus`, `ticket`, `idDamageType`,  `ClientName`, `InstallDate`, `DamageDescription`, `Electric`, `Hot`, `SubmittedIns`,  `idDriver`, `idHelper`, `idSecondaryHelper`, `idLocation`, `needDriverStatement`, `driverStatement`, `customerStatement`, `Notes`, `idCreatedBy`) 
VALUES (0, 0, 0, 0, NULL, 0, 0, 0, \'0\', \'0\', \'0\', NULL, NULL, NULL, 0, \'0\', NULL, NULL, NULL, \'236\')'); 

Мне кажется, что CI не на самом деле делает after_add крюк после того, как он добавляет новую запись в таблицу, так как комментируя все запросы в hook_ after_add и раскомментируя //$recipients="[email protected], [email protected] "; успешно отправляет электронное письмо получателям. Таким образом, это не проблема с моей настройкой электронной почты, я успешно отправляю электронные письма с помощью sendmail и настроил свой файл электронной почты.

Действительно ли этот крюк не выполнен после добавления записи? Если да, то каким образом я могу реализовать электронную почту после добавления добавленной функциональности?

+1

Зачем добавлять крючок? Вы используете сторонний плагин/библиотеку? – Jeemusu

+0

Я считаю, что это так, но не может отследить библиотеку. Все крючки after_add обрабатываются классом easyphp_base_controller, который расширяет CI_Controller. Этот класс определяется в приложении/models/easyphp/core. Это заставило меня подумать, что это была библиотека «easyphp», но это стек WAMP. Кто-нибудь сталкивается с библиотекой с этой номенклатурой, или это, вероятно, пользовательский код? – user2762596

ответ

0

Выполнение запроса с помощью запроса $ CI-> db-> вместо того, чтобы использовать элементы select и wheres, сделанные так, чтобы запись была вставлена ​​перед первым запросом на поиск электронных писем. Использование $ CI-> db-> select не работало, даже если перед ним выполнялся $ CI-> db-> flush_cache().