实习小结十三:基于PHP ZF框架的文章管理模块

时间:2022-07-11 11:10:41

这是我最近两三周做的一个Post模块,从数据库到后台,前台,数据库设计和总体设计都已经给我了,我也参考了不少已有模块的代码。刚开始7天,我用来实现post模块的增删改查的基本功能,之后的时间,就是修改一些逻辑代码,以及增添新功能,就像小结12里面写的ajax功能之类的。
先给出这个module的整个代码框架吧:
实习小结十三:基于PHP ZF框架的文章管理模块

列出来的代码文件就是我所用到的代码,其中有些abstract为空,因为直接继承了其他的类。

Controller里面就是主要的action,在设置了路由文件之后,在controller里面写出相应的action,在action中完成对前台的传参,设置相应的template等。

Form里面就是在需要输入数据,添加数据时,所用的表格,里面有详细的label参数,下图就是基于PostAddForm的。
实习小结十三:基于PHP ZF框架的文章管理模块

Model就是数据库中对应的参数,在这边定义清楚。

Table是对数据库进行操作的各种方法,这边参考了不少Zend Framework官网给出的Db方法,不是很难。在action里面通过getTable调用这些方法。

接下来就是相应的页面文件了。post文件夹中是大体的页面框架文件,具体的小文件部分在ctrl中,基本可以传个partial到post大页面中去。

这边我把controller里面,两个稍微重要的方法贴出来。贴多了,以后自己看,估计也不知所云。

public function PostAction(){
        if(!$this->userHasPermission('ADMIN', 'VIEW_PRODUCT'))
        {
            return $this->requirePermission('ADMIN', 'VIEW_PRODUCT');
        }

        $page = $this->getRequest()->getQuery('page', 1);
        $condition = array();
        $type_name = 'post';

        if(isset($_GET['post_status']) && $_GET['post_status'] != 'null') {
            $status = $_GET['post_status'];
            $condition['post_status'] = (int)$_GET['post_status'];
        }else{
            $condition['post_status'] = null;
        }

        if(isset($_GET['query'])) {
            $condition['title'] = $_GET['query'];
        }
        else{
            $condition['title'] = null;
        }

        if(isset($_GET['category'])) {
            $condition['category'] = $_GET['category'];
        }
        else{
            $condition['category'] = null;
        }

        if(isset($_GET['author'])) {
            $condition['author'] = $_GET['author'];
        }
        else{
            $condition['author'] = null;
        }

        $posts = $this->getPostTable()->getPaginator($condition);
        $posts->setItemCountPerPage(10);
        $posts->setCurrentPageNumber($page);

        $vm = new ViewModel(array(
            'post_paginator' => $posts,
        ));
        $vm->setTemplate('post/post-index');

        $this->layout()->selectedTab = 'post-list';
        return $vm;
    }

    public function addPostAction(){
        if(!$this->userHasPermission('ADMIN', 'VIEW_PRODUCT'))
        {
            return $this->requirePermission('ADMIN', 'VIEW_PRODUCT');
        }
        $user_service = $this->getServiceLocator()->get('UserService');

        $table = $this->getPostTable();
        $config = $this->getServiceLocator()->get('config');

        $sm = $this->getServiceLocator();

        $request = $this->getRequest();

        $form = new \Post\Form\PostAddForm(array(
            'adapter' => $sm->get('Zend\Db\Adapter\Adapter'),
            'user_service' => $user_service,
        ));

        $author_valid = true;

        if($request->isPost())
        {
            $form->setData($request->getPost());

            if ($form->isValid()) {
                $post_array = array();
                $post = new Post($this->getRequest()->getPost()->toArray());

                $user = $this->getServiceLocator()->get('UserService')->getUserById($post->author_id);
                if ($user) {
                   $author = $user->username;
                }
                else
                    $author = null;

                foreach ($post as $key => $value) {
                    if ($key == 'post_featured_img') {
                        $json_arr = json_decode($value,true);
                        $value = '/img'. '/' . substr($json_arr['name'],0,6) . '/' . $json_arr['name'] . '.' . $json_arr['type'];
                    }
                   $post_array[$key] = $value;
                }

                $post_array['author'] = $author;
                if (is_null($post_array['author'])) {
                    $author_valid = false;
                }else{
                    $postId = $table->addPost($post_array);
                    $this->redirect()->toUrl("/post");
                }
            } 
        } 

在代码中可以看出,关于图片是使用Json数组返回的,这是代码库里原来就封装好的Image Element的返回值,感觉很方便。

估计接下来,还得继续改改这个模块,刚开始做的时候,财哥跟我讲这个,我觉得很抽象,根本想象不出来这个怎么做,现在做出来,功能也都实现了,感觉蛮有成就感的,在博客里面算是纪念一下,这两周来,这个module给我带来的好坏心情吧。