Функциональность подписки на новостную рассылку в Codeigniter 3

Я работаю над онлайн-газета / приложение для ведения блога с CodeIgniter 3.1.8 и Веточка.

Приложение предназначено для того, чтобы предложить разработчикам и дизайнерам возможность очень легко превратить свои HTML-шаблоны в веб-сайты на базе баз данных. Для этого я использовал Веточка шаблонизатор для внешнего интерфейса.

Я недавно добавил Подписка на новостную рассылку функциональность.

Форма подписки на информационный бюллетень:

<h5>Sign Up for Newsletter</h5>
<p>Signup to get updates on articles, interviews and events.</p>
  <div class="subscribe-form">
    <div id="messags" class="is-hidden h-text-center">
      <div class="success is-hidden alert-box alert-box--success">You have successfully subscribed to our newsletter</div>
      <div class="notnew is-hidden alert-box alert-box--info">You are already subscribed</div>
      <div class="fail is-hidden alert-box alert-box--error">Sorry, the newsletter subscription filed</div>
    </div>
    <form name="newsletter" method="post" action="{{base_url}}newsletter/subscribe" id="newsletterForm" class="group" novalidate>
      <input type="email" name="email" class="email" value="{{set_value('email') | striptags}}" data-rule-required="true" placeholder="Your Email Address"> 
      <input type="submit" name="subscribe" value="subscribe">
    </form>
</div>

Данные формы отправляются через jQuery Ajax:

(function($) {
    $("#newsletterForm").validate({
        rules: {
            email: {
                email: true
            }
        },

        submitHandler: function(form) {
            var form = $("#newsletterForm"),
                $fields = form.find('input[type="email"]'),
                url = form.attr('action'),
                data = form.serialize();
            $.ajax({
                dataType: "json",
                type: "post",
                url: url,
                data: data,
                cache: false,
                success: function(response) {
                    $('#messags').slideDown(250).delay(2500).slideUp(250);
                    $fields.val('');
                    if (response.is_new_subscriber === true) {
                        $('#messags .success').show();
                        $('#messags .notnew').hide();
                    } else {
                        $('#messags .notnew').show();
                    }
                },
                error: function() {
                    $('#messags .fail').show();
                }
            });
        }
    });
})(jQuery);

В Новостная рассылка контроллер:

class Newsletter extends CI_Controller {
    
    public function __construct()
    {
        parent::__construct();
    }
    
    public function subscribe()
    {
        $data['is_new_subscriber'] = true;
        if (!$this->Newsletter_model->subscriber_exists()) {
            $this->Newsletter_model->addSubscriber();
        } else {
            $data['is_new_subscriber'] = false;
        }
        echo json_encode($data);
    }
}

В Newsletter_model модель:

class Newsletter_model extends CI_Model {
    
    public function subscriber_exists()
    {
        $query = $this->db->get_where('newsletter', array(
            'email' => $this->input->post('email')
        ));
        return $query->num_rows() > 0;
    }
    
    public function addSubscriber()
    {
        $data = array(
            'email' => $this->input->post('email'),
            'subscription_date' => date('Y-m-d H:i:s')
        );
        return $this->db->insert('newsletter', $data);
    }
    
    public function getSubscribers()
    {
        $query = $this->db->get('newsletter');
        return $query->result();
    }
    
    public function editSubscriber($id)
    {
        $query = $this->db->get_where('newsletter', array(
            'id' => $id
        ));
        if ($query->num_rows() > 0) {
            return $query->row();
        }
    }
    
    public function updateSubscriber($id)
    {
        $data = array(
            'email' => $this->input->post('email')
        );
        
        $this->db->where('id', $id);
        return $this->db->update('newsletter', $data);
    }
    
    public function deleteSubscriber($id)
    {
        return $this->db->delete('newsletter', array(
            'id' => $id
        ));
    }
}

Подписчики на рассылку новостей управляются в серверной части.

Вид:

<?php if(count($subscribers)):?>
 <div class="table-responsive">
  <table class="table table-striped table-sm mb-0 w-100">
    <thead>
      <tr class="row m-0">
        <th class="w-5">#</th>
        <th class="w-50">Email</th>
        <th class="w-25">Subscription date</th>
        <th class="w-20 text-right">Actions</th>
      </tr>
    </thead>
    <tbody>
      <?php foreach ($subscribers as $index => $subscriber): ?>
      <tr id="<?php echo $subscriber->id; ?>" class="row m-0">
        <td class="w-5"><?php echo $index + 1; ?></td>
        <td class="w-50"><?php echo $subscriber->email; ?></td>
        <td class="w-25"><?php echo $subscriber->subscription_date; ?></td>
        <td class="w-20 text-right">
          <div class="btn-group">
            <a href="<?php%20echo%20base_url('dashboard/subscribers/edit/'%20.%20$subscriber->id);%20?>" title="Edit" class="btn btn-sm btn-success"><i class="fa fa-pencil-square-o"></i> Edit</a>
            <a href="<?php%20echo%20base_url('dashboard/subscribers/delete/'%20.%20$subscriber->id);%20?>" title="Delete" class="delete-subscriber btn btn-sm btn-success"><i class="fa fa-trash"></i> Delete</a>
          </div>
        </td>
      </tr>
      <?php endforeach ?>
    </tbody>
  </table>
</div>
<?php else: ?>
<p class="text-center">No subscribers</p>
<?php endif ?>

В Подписчики контроллер (в приборной панели):

class Subscribers extends CI_Controller
{
    
    public function __construct()
    {
        parent::__construct();
    }

    public function index(){
            
            if (!$this->session->userdata('is_logged_in')) {
                redirect('login');
            } else {
                // Admin ONLY area!
                if (!$this->session->userdata('user_is_admin')) {
                    redirect($this->agent->referrer());
                }
            }

            $data = $this->Static_model->get_static_data();
            $data['subscribers'] = $this->Newsletter_model->getSubscribers();

            $this->load->view('dashboard/partials/header', $data);
            $this->load->view('dashboard/subscribers');
            $this->load->view('dashboard/partials/footer');
    }

        public function edit($id) {
            // Only logged in users can edit subscribers
            if (!$this->session->userdata('is_logged_in')) {
                redirect('login');
            }
    
            $data = $this->Static_model->get_static_data();
            $data['subscriber'] = $this->Newsletter_model->editSubscriber($id);
    
            $this->load->view('dashboard/partials/header', $data);
            $this->load->view('dashboard/edit-subscriber');
            $this->load->view('dashboard/partials/footer');
        }

        public function update() {
            // Only logged in users can update user profiles
            if (!$this->session->userdata('is_logged_in')) {
                redirect('login');
            }
    
            $id = $this->input->post('subscriber');
    
            $data = $this->Static_model->get_static_data();
            $data['subscriber'] = $this->Newsletter_model->editSubscriber($id);
    
            $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email');
            $this->form_validation->set_error_delimiters('<p class="error-message">', '</p>');
    
            if(!$this->form_validation->run()) {
                $this->load->view('dashboard/partials/header', $data);
                $this->load->view('dashboard/edit-subscriber');
                $this->load->view('dashboard/partials/footer');
            } else {
                $this->Newsletter_model->updateSubscriber($id);
                $this->session->set_flashdata('subscriber_updated', 'The email address was updated');
                redirect('dashboard/subscribers');
            }
        }

        public function delete($id) {
            if ($this->Newsletter_model->deleteSubscriber($id)) {
                $this->session->set_flashdata('subscriber_delete_success', "The subscriber was deleted");
            } else {
                $this->session->set_flashdata('subscriber_delete_fail', "Failed to delete subscriber");
            }
            redirect('dashboard/subscribers');
        }
}

Моя главная забота — это безопасность, но я буду признателен любая конструктивная критика. Спасибо! 🙂

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *