Пытаюсь сделать рассылку новостей с сайта, новости берутся с сайта по
id и
post_key из файла tmp-mailing.json
tmp-mailing.json формируется специально в момент публикации новости на сайте для того, чтобы потом сделать рассылку.
Проблема в том, что если с сайта удалить новость до рассылки,
id и
post_key останутся в файле tmp-mailing.json но фактически на сайте будет отсутствовать из-за чего скрипт рассылки прекращает работу и отдает 500 ошибку. Так как пытается получить новость, которой нет.
Ниже мой код, пожалуйста, помогите обойти эту проблему, например, сделать так, чтобы в случае отсутствия новости на сайте, скрипт просто пропускал ее и шел дальше в поисках существующих на сайте новостей
id и
post_key.
Я так понял, что нужно отредактировать код внутри foreach, возможно ошибаюсь.
//Рассылка на Email
if($this->isEnabledService('mailing')){
if(Filesystem::fileExists($this->workspace().'/tmp-mailing.json')){
$mailing_posts = $this->helper('workspace')->select('tmp-mailing');
$posts = $mailing_posts->getData();
$mail_template = html_entity_decode($this->getSettingField('mailing_settings', 'mail_template'));
$mailing_days = explode(',', $this->getSettingField('mailing_settings', 'interval'));
$reply_to = $this->getSettingField('mailing_settings', 'reply_to');
// Проверяем интервал
if(in_array(date('N'), $mailing_days)){
$readyPosts = '';
$mp_i = 0;
$posted_ids = [];
foreach ($posts as $key => $mailingPost){
$posted_ids[] = $mailingPost->id;
$page = buildPage($mailingPost->post_key);
$image = $page->thumbCoverImage();
$readyPosts .= '<div style="align: center;"><a href="'.$page->permalink().'"><h1>'.$page->title().'</h1></a></div>';
}
$result_mailing = $this->manageServerRequest('mailing', [
'mail_template' => $mail_template,
'mail' => [
'from' => 'mail',
'subject' => 'Наша рассылка',
'html' => $readyPosts,
'reply-to' => $reply_to
]
]);
if($result_mailing->status === true){
$mailing_posts->delete();
foreach ($posted_ids as $posted_id) {
$this->addPosted($posted_id, 'mailing');
$this->log([
'id' => $posted_id,
'service' => 'mailing',
'status' => 'success',
'message' => $result_mailing->message,
'params' => []
]);
}
}else{
echo 'Что-то пошло не так'.PHP_EOL.$result_mailing->message;
}
}
}
}
Workspace
class WorkspaceHelper{
private $filePath;
private $suffix = '.json';
public $workspace;
public function select($filename)
{
$this->filePath = $this->workspace.$filename.$this->suffix;
if(!Filesystem::fileExists($this->filePath)){
fclose(fopen($this->filePath,'x'));
}
return $this;
}
public function insert(array $data)
{
$data = (object) $data;
$old_data = $this->getData();
$old_data[] = $data;
return file_put_contents($this->filePath, json_encode($old_data)) OR false;
}
public function is_exist(array $find)
{
$find = (object) $find;
$old_data = $this->getData();
foreach ($old_data as $oldData)
{
foreach ($find as $find_key => $find_val){
if(isset($oldData->$find_key) && $oldData->$find_key == $find_val){
return $oldData;
}
continue;
}
}
return false;
}
public function insertIfNotExists(array $find, array $data)
{
$data = (object) $data;
$old_data = $this->getData();
foreach ($old_data as $oldData)
{
foreach ($find as $find_key => $find_val){
if(isset($oldData->$find_key) && $oldData->$find_key == $find_val){
return false;
}
continue;
}
}
$old_data[] = $data;
return file_put_contents($this->filePath, json_encode($old_data)) OR false;
}
public function update($searchKey, $searchValue, array $replacement)
{
$data = $this->getData();
foreach ($data as $data_key => $data_value) {
$data_value = (array) $data_value;
foreach ($data_value as $key => $value) {
if($searchKey == $key && $searchValue == $value){
$data[$data_key] = array_merge($data_value, $replacement);
}
}
}
return file_put_contents($this->filePath, json_encode($data)) OR false;
}
/**
* Удаляет элемент массива по шаблону поиска
*
* @param array $searchArray
* @return bool
*/
public function remove(array $searchArray)
{
$data = $this->getData();
foreach ($data as $data_key => $data_value) {
foreach ($searchArray as $sKey=>$sVal){
if(isset($data_value->$sKey) && $data_value->$sKey == $sVal) unset($data[$data_key]);
}
}
return file_put_contents($this->filePath, json_encode(array_values($data))) OR false;
}
/**
* Удаляет файл из workspace
*/
public function delete()
{
unlink($this->filePath);
}
public function getData()
{
return (array) json_decode(file_get_contents($this->filePath));
}
}