MVC приложение на php. Часть 5. Админ панель.

На этом уроке рассмотрю создание админ панели. Отделение admin от client мы сделали заранее, это плюс. Осталось добавить контрол-ры, модели, вьюхи для админской части. Тему я взял Admin LTE от того же бутстрап, версия еще 1-я.
Решил заменить имена классов, чтобы избавиться от zendовского snake case. Поменял namespace для каждого класса, сделал его соответствующим пути.

application/controllers/client/articles.php


namespace Controllers\Client;
class Articles

namespace Models\Client;
class Articles

class DateBase
use Lib\DateBase;
class Model extends DateBase
$result = DateBase::query($sql);

class Registry
use Lib\Registry;

$mysqli = Registry::get('mysqli');
$sql = Registry::get('mysqli')->query($query);
Registry::set('mysqli',$mysqli);

Хорошая практика именовать файл класса по имени класса или наоборот. В java это обязательно


test.java:1: class Foo is public, should be declared in a file named Foo.java

От префикса action_ давайте тож избавимся


/* ******************* Default directions ******** */
            $controller = 'articles';
            $action = 'index';
        
            if(!$action)
                $action = 'index';
            else
                $action = "$action";

$template = $caller;
function index()
function article(array $args = null){ 

Контроллер. По умолчанию дефолтный файл — articles.php

application/controllers/admin/articles.php



namespace Controllers\Admin;

use Models\Admin\Articles as Articles1;

use Core\Controller;

class Articles extends Controller{
	
	/**
	 * 
	 */
	public function index(){
		$articles = new Articles1();
		$articles = $articles->get_articles();
        $data = array(
            'articles' => $articles
        );
		$this->view->generate('', $data);
	}

    /**
     * @param array $args
     */
    function article(array $args = null){
        $id = (isset($args[0])? $args[0]: "");
        $model = new Articles1();
        $article = $model->getById($id);
        $data = array(
            'article' => $article,
        );
        $this->view->generate('',  $data);
    }
}

Модель. Копируем из Clientской части, заменив неймспейс.

application/models/admin/articles.php


namespace Models\Admin;

use Core\Model;
use Lib\Registry;
use Lib\DateBase;

class Categories extends Model{

    /**
     * @param $id
     * @return mixed
     */
    public function getById($id){
        $sql = 'SELECT * FROM category WHERE id = %s';
        $result = DateBase::query($sql, $id);
        $row = $result->fetch_assoc();
        return $row;
    }
    /**
     * 
     */
    public function get_categories(){
                
        $sql = 'SELECT * FROM category';

        $result = DateBase::query($sql);
        $row2 = array();
        while ($row = $result->fetch_assoc()) {
            array_push($row2 , $row);
        }
        if(empty($row2))return;
        return $row2;
    }
}

Вид для админки. Базовый шаблон — Admin lte. Подключаем биб-ки AdminLTE.css , jquery-1.8.2.min.js, bootstrap.min.js . Заменяем блок контента на внутр. шаблон.

css/AdminLTE.css

js/bootstrap.min.js

js/jquery-1.8.2.min.js

application/views/admin/template.php


                <!-- Main content -->
                <section class="content">
                    <!-- Main row -->
                    <div class="row">
                        <?php include 'application/views/admin/'.$content_view; ?>
                    </div><!-- /.row (main row) -->
                </section><!-- /.content -->

Осталось вывести в цикле данные для контента.
Есть отлич. инструмент таблицы.
Мы подключили index.php

application/views/admin/index.php


<!-- Left col -->
<section class="col-lg-12">
    <div class="box-info">
        <h3 class="box-title">Список статей</h3>
        <a href="/admin/articles/add" class="btn btn-success">Добавить статью</a>
        <br/><br/>
        <table class="table table-bordered col-lg-11 articles_table">
            <tr>
                <th style="">#</th>
                <th>Название</th>
                <th>Превью</th>
                <th>Дата</th>
                <th class="anons_td">Анонс</th>
            </tr>
            <? if (!empty($articles)): ?>
                <? foreach ($articles as $key => $article): ?>
                    <tr>
                        <td><?= $article['id'] ?></td>
                        <td class="title_td"><?= $article['title'] ?></td>
                        <td>
                            <? if (isset($article['preview_pic'])) { ?>
                                <img src="images/<?= $article['preview_pic'] ?>" alt="" class="preview">
                                <? } ?>
                            <? if (isset($article['picture'])) { ?>
                                    <img src="images/<?= $article['picture'] ?>" alt="" class="small_pic">
                                <? } ?>
                        </td>
                        <td><?= $article['date'] ?></td>
                        <td class="anons_td"><?= $article['anons'] ?>...</td>

                    </tr>
                <? endforeach ?>
            <? endif ?>
        </table>
        <div class="clearfix"></div>
    </div>
</section>

Детальная статья, она же стр. редакт-я.

application/views/admin/article.php



<?php
/**
 * Created by PhpStorm.
 * User: valiev
 * Date: 08.02.2016
 * Time: 14:43
 */
?>
<!-- Left col -->
<section class="col-lg-12 connectedSortable">
    <!-- quick email widget -->
    <div class="box box-info">
        <div class="box-body">
            <h3 class="box-title">Редактировать статью</h3>
            <!--       ////////////////////////////////  form     //////////////////////////////       -->
            <form action="/admin/articles/edit/<?= $article['id'] ?>" method="post" name="add_article"
                  enctype="multipart/form-data">
                <div class="form-group">
                    <input type="text" class="form-control" name="title" placeholder="" value="<?= $article['title'] ?>"/>
                </div>
                <img src="images/<?= $article['preview_pic'] ?>" alt="" class="preview">

                <div class="callout callout-info"><span class="glyphicon glyphicon-paperclip"></span> 
                </div>

                <!--          datepicker          -->
                <div class="form-group">
                    <label>Дата:</label>

                    <div class="input-group">
                        <div class="input-group-addon">
                            <i class="fa fa-calendar"></i>
                        </div>
                        <input type="text" class="form-control pull-right" id="datepicker" name="date"
                               value="<?= $article['date'] ?>"/>
                    </div>
                    <!-- /.input group -->
                </div>
                <!--           anons             -->
                <p class="lead">Анонс:</p>
                <textarea name="anons" id="anons" cols="30" rows="10"><?= $article['anons'] ?></textarea>
                <!--            HTML editor            -->
                <div class='box'>
                    <div class='box-header'>
                        <h3 class='box-title'>Текст статьи</h3>
                        <!-- tools box -->
                        <div class="pull-right box-tools">
                            <button class="btn btn-default btn-sm" data-widget='collapse' data-toggle="tooltip"
                                    title="Collapse"><i class="fa fa-minus"></i></button>
                            <button class="btn btn-default btn-sm" data-widget='remove' data-toggle="tooltip"
                                    title="Remove"><i class="fa fa-times"></i></button>
                        </div>
                        <!-- /. tools -->
                    </div>
                    <!-- /.box-header -->
                    <div class='box-body pad'>
                        <div>
                            <textarea name="description" class="textarea" id="editor1"
                                      placeholder="Place some text here"
                                      style="width: 100%; height: 200px; font-size: 14px; line-height: 18px; border: 1px solid #dddddd; padding: 10px;">
                                <?= $article['description'] ?>
                            </textarea>
                        </div>
                    </div>
                </div>
                <!-- Select multiple category-->
                <div class="form-group">
                    <label>Выберите категорию:</label>
                    <select name="category[]" multiple="multiple" class="form-control">
                        <? foreach ($article['categories'] as $categories): ?>
                            <option value="<?= $categories['id'] ?>"><?= $categories['name'] ?></option>
                        <? endforeach ?>
                    </select>
                </div>
                <div class="form-group">
                    <? if (isset($article['mess'])): ?>
                        <div class="alert alert-danger alert-dismissible">
                            <?= $article['mess']; ?>
                        </div>
                    <? endif ?>
                    <label for="exampleInputFile">Загрузка файлов</label>
                    <!--        error mess for pictures                -->
                    <? if (!empty($article['mess'][0])) {
                        foreach ($article['mess'] as $mess) {
                            echo '
                                    <div class="alert alert-danger alert-dismissible">
                                        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
                                        <span><i class="icon fa fa-ban"></i></span>
                                        ' . $mess . '
                                    </div>
                                    ';
                        }
                    }?>
                    <input name="picture[]" type="file" multiple="multiple" id="exampleInputFile">

                    <p class="help-block">Выберите файлы для загрузки</p>
                </div>
                <div class="box-footer clearfix">
                    <button type="submit" class="pull-right btn btn-default" name="send">Редактировать <i
                            class="fa fa-arrow-circle-right"></i></button>
                </div>
            </form>
            <!--       ////////////////////////////////  end form   //////////////////////////////       -->
        </div>
    </div>

</section><!-- /.Left col -->

Для календаря


<link rel="stylesheet" href="css/jquery-ui.min.css" type="text/css"/>
        <script src="js/jquery-ui.min.js" type="text/javascript"></script>
<script src="js/app.js" type="text/javascript"></script>
;(function($){
    $( "#datepicker" ).datepicker({
        dateFormat: "yy-mm-dd"
    });
})(jQuery)

Категории

Добавим категории на сайт. Напишем SQL, отдельные контроллеры и модели, виды для всей этой красоты.

articles___rand2748742.sql


CREATE TABLE `category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text,
  `description` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8

CREATE TABLE `category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text,
  `description` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 AVG_ROW_LENGTH=2340;


INSERT INTO category VALUES
("2","программирование","описание"),
("3","doctrine","The Doctrine Project is the home of a selected set of PHP libraries primarily focused on providing persistence services and related functionality. Its prize projects are a Object Relational Mapper and the Database Abstraction Layer it is built on top of. You can read more about what Doctrine has to offer below.
\n"),
("4","phpstorm",""),
("5","nginx","сервер")

Практически копия функционала статей.

application/controllers/admin/categories.php



namespace Controllers\Admin;

use Core\Controller;
use Models\Admin\Categories as Categories1;

class Categories extends Controller
{
    /**
     * 
     */
    public function index(){
        $categories = new categories1();
        $categories = $categories->get_categories();
        $data = array(
            'categories' => $categories
        );
        $this->view->generate('categories', $data);
    }

    /**
     * 
     */

    public function category(array $args = null){
        $id = (isset($args[0])? $args[0]: "");
        $categories = new categories1();
        $categories = $categories->getById($id);
        $data = array(
            'categories' => $categories
        );
        $this->view->generate('', $data);
    }
}

Модель категорий

application/models/admin/categories.php


namespace Models\Admin;

use Core\Model;
use Lib\Registry;
use Lib\DateBase;

class Categories extends Model{
    /**
     * @param $id
     * @return mixed
     */
    public function getById($id){
        $sql = 'SELECT * FROM category WHERE id = %s';
        $result = DateBase::query($sql, $id);
        $row = $result->fetch_assoc();
        return $row;
    }
    /**
     * 
     */
    public function get_categories(){
                
        $sql = 'SELECT * FROM category';

        $result = DateBase::query($sql);
        $row2 = array();
        while ($row = $result->fetch_assoc()) {
            array_push($row2 , $row);
        }
        if(empty($row2))return;
        return $row2;
    }
}

В клиентской части отд. контроллер категорий не нужен.
Остались представления.
Категории в админке для списка.

application/views/admin/categories.php


<!-- Left col -->
<section class="col-lg-12">
    <div class="box-info">
        <h3 class="box-title">Список категорий</h3>
        <a href="/admin/category/add" class="btn btn-success">Добавить категорию</a>
        <br/><br/>
        <table class="table table-bordered col-lg-4">
            <tr>
                <th style="">#</th>
                <th>Название</th>
                <th></th>
                <!-- <th style=""></th> -->
            </tr>
            <? if (!empty($data['categories'])): ?>
                <? foreach ($data['categories'] as $categories): ?>
                    <tr>
                        <td><?= $categories['id'] ?></td>
                        <td><?= $categories['name'] ?></td>
                        <td>
                            <a href="/admin/category/edit/<?= $categories['id'] ?>">
                                <span class="glyphicon glyphicon-edit"></span>
                            </a>
                        </td>
                    </tr>
                <? endforeach ?>
            <? endif ?>
        </table>
        <div class="clearfix"></div>
    </div>
</section>

Детальный просмотр будет одновременно стр. редак-ия. Используем виджет форм.

application/views/admin/category.php


<section class="col-lg-7 connectedSortable">
    <!-- quick email widget -->
    <div class="box box-info">
        <div class="box-header">
            <h3 class="box-title">Редактировать категорию</h3>
            <!-- tools box -->
            <div class="pull-right box-tools">
                <button class="btn btn-info btn-sm" data-widget="remove" data-toggle="tooltip" title="Remove"><i
                        class="fa fa-times"></i></button>
            </div>
            <!-- /. tools -->
        </div>
        <div class="box-body">
            <form action="/admin/categories/editCategory/<?= $category['id'] ?>" method="post">
                <div class="form-group">
                    <input type="text" class="form-control" name="name" placeholder="Название категории" value="<?=$category['name']?>" />
                </div>
                <div>
                    <textarea name="description" class="textarea" placeholder="Описание "
                              style="width: 100%; height: 125px; font-size: 14px; line-height: 18px; border: 1px solid #dddddd; padding: 10px;"><?=$category['description']?></textarea>
                </div>
                <div class="box-footer clearfix">
                    <button class="pull-right btn btn-default" type="submit" name="send">Редактировать <i
                            class="fa fa-arrow-circle-right"></i></button>
                </div>
            </form>
        </div>
    </div>

</section><!-- /.Left col -->

Добавим в левый бар пункт категории.


                        <li class="categories">
                            <a href="/admin/categories">
                                <i class="fa fa-th"></i> <span>Категории</span>
                            </a>
                        </li>

В след. уроке рассмотрим обработку форм, привяжем статьи к категориям.

Leave a comment

Your email address will not be published.


*