Система управления подписчиками на рассылку новостей в CodeIgniter 3

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

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

Основная тема имеет форму подписки на рассылку новостей, поэтому для CMS необходимо иметь система управления подписчиками на рассылку новостей.

Список подписчиков

Выглядит это так:

введите описание изображения здесь

Код:

<div class="card bg-light w-100">
  <div class="card-header d-flex p-2">
    <h6 class="text-dark m-0 align-self-center">Newsletter list</h6>
    <?php echo form_open(base_url('dashboard/subscribers/export'),  ['class' => 'ml-auto']); ?>
      <button type="submit" class="btn btn-sm btn-success"><i class="fa fa-file mr-1"></i> Export CSV</button>
    <?php echo form_close(); ?>
  </div>
  <div class="card-body bg-white p-0">
    <?php if($total_subscribers > 0):?>
      <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 $count = $index + 1; echo $count + $offset; ?></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>
      <div class="card-footer bg-white px-0 py-<?php echo $total_subscribers > $limit ? '1' : '0'?>">                      
        <?php if($total_subscribers > $limit):?>
          <?php $this->load->view("dashboard/partials/pagination");?>
        <?php endif ?>
      </div>              
      <?php else: ?>
        <p class="text-center my-2">No subscribers</p>
      <?php endif ?>
    </div>
  </div>
</div>

Модель:

class Newsletter_model extends CI_Model {

    public function subscriber_exists() {   
        $query = $this->db->get_where('newsletter', ['email' => $this->input->post('email')]);
        return $query->num_rows() > 0;
    }

    public function get_num_rows() {
        $query = $this->db->get('newsletter');
        return $query->num_rows(); 
    }

    // Insert subscriber
    public function addSubscriber() {
        $data = [
            'email' => $this->input->post('email'),
            'subscription_date' => date('Y-m-d H:i:s')
        ];
        return $this->db->insert('newsletter', $data);
    }

    // Fetch subscribers
    public function getSubscribers($limit, $offset){
        $this->db->select('newsletter.*');
        $this->db->order_by('newsletter.id', 'ASC');
        $this->db->limit($limit, $offset);
        $query = $this->db->get('newsletter');
        return $query->result();
    }

   // Edit subscriber data
    public function editSubscriber($id){
        $query = $this->db->get_where('newsletter', array('id' => $id));
        if ($query->num_rows() > 0) {
            return $query->row();
        }
    }

    // Update subscriber data
    public function updateSubscriber($id) {
        $data = [
            'email' => $this->input->post('email')
        ];

        $this->db->where('id', $id);
        return $this->db->update('newsletter', $data);
    }

    // Remove subscriber
    public function deleteSubscriber($id) {
        return $this->db->delete('newsletter', array('id' => $id));
    }

    // Expot subscribers
    public function fetchSubscribers() {
        $this->db->select('email, subscription_date');
        $this->db->order_by('newsletter.id', 'DESC');
        $query = $this->db->get('newsletter');
        return $query->result();
    }
}

Контроллер

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());
            }
        }
        
        $this->load->library('pagination');
        $config['base_url']             = base_url("dashboard/subscribers");
        $config['query_string_segment'] = 'page';
        $config['total_rows']           = $this->Newsletter_model->get_num_rows();
        $config['per_page']             = 10;
        
        if (!isset($_GET[$config['query_string_segment']]) || $_GET[$config['query_string_segment']] < 1) {
            $_GET[$config['query_string_segment']] = 1;
        }
        
        $limit  = $config['per_page'];
        $offset = ($this->input->get($config['query_string_segment']) - 1) * $limit;
        $this->pagination->initialize($config);
        
        $data                      = $this->Static_model->get_static_data();
        $data['subscribers']       = $this->Newsletter_model->getSubscribers($limit, $offset);
        $data['offset']            = $offset;
        $data['limit']             = $limit;
        $data['total_subscribers'] = $config['total_rows'];
        
        $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');
    }
    
    public function export()
    {
        $data        = $this->Static_model->get_static_data();
        $subscribers = $this->Newsletter_model->fetchSubscribers();
        
        $file_name="subscribers_" . date('Ymd') . '.csv';
        header("Content-Description: File Transfer");
        header("Content-Disposition: attachment; filename=$file_name");
        header("Content-Type: application/csv;");
        
        // CSV creation 
        $file = fopen(BASEPATH . '../downloads/csv/' . $file_name, 'w');
        $header = array("Email", "Subscription Date");
        fputcsv($file, $header);
        foreach ($subscribers as $subscriber) {
            fputcsv($file, array($subscriber->email, $subscriber->subscription_date));
        }
        fclose($file);
        redirect('dashboard/subscribers');
    }
}

Обеспокоенность

  1. Система управления абонентами (особенно функция экспорта CSV) безопасна?

  2. Это далеко не оптимально с точки зрения качества кода?

0

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

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