Я работаю над онлайн-газета / приложение для ведения блога с 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');
}
}
Моя главная забота — это безопасность, но я буду признателен любая конструктивная критика. Спасибо! 🙂