Zend Framework2 会员管理项目之三: 建立数据模型及显示用户列表
这篇博客主要通过zf完成用户一览显示的功能
编辑 module/Member/src/Member/Model/User.php文件
这就是数据库表users的模型类文件,exchangeArray函数将表单传过来的用户信息数据转变为user的成员数据。
<?php /** * This source file is part of Qiai. * * PHP Version >=5.3 * * @category Qiai_Application * @package Member * @subpackage Model * @author Sai (QIAI) <sai@qiais.com> * @license Qiai-License http://www.qiai.com/licenses/qiai.ck.html * @link http://www.qiais.com */ namespace Member\Model; /** * User model * * @category Gc_Application * @package Member * @subpackage Model */ class User { public $id; public $name; public $email; public $password; public $role; public $tel; public $fax; public $mobile; public $zipcode; public $address; public $created; /** * set password * * @param string $plain_password plain key * * @return void */ public function setPassword($plain_password) { $this->password = sha1($plain_password); } /** * change form data to members of Member * * @param array $data form data * * @return void */ function exchangeArray($data) { $this->id = (isset($data['id'])) ? $data['id'] : null; $this->name = (isset($data['name'])) ? $data['name'] : null; $this->email = (isset($data['email'])) ? $data['email'] : null; $this->role = (isset($data['role'])) ? $data['role'] : null; $this->tel = (isset($data['tel'])) ? $data['tel'] : null; $this->mobile = (isset($data['mobile'])) ? $data['mobile'] : null; $this->fax = (isset($data['fax'])) ? $data['fax'] : null; $this->zipcode = (isset($data['zipcode'])) ? $data['zipcode'] : null; $this->address = (isset($data['address'])) ? $data['address'] : null; $this->created = (isset($data['created'])) ? $data['created'] : null; if (isset($data["password"])) { $this->setPassword($data["password"]); } } /** * get object data * * @return array */ public function getArrayCopy() { return get_object_vars($this); } }
编辑module/Member/src/Member/Model/UserTable.php文件
UserTable类完成对users数据表的读取,写入等操作的封装。
public function fetchAll($paginated=false)
函数有个$paginated参数,设为true的时候,将进行分页显示操作,这里暂时设置为false,以后要用到。
<?php /** * This source file is part of Qiai. * * PHP Version >=5.3 * * @category Qiai_Application * @package Member * @subpackage Model * @author Sai (QIAI) <sai@qiais.com> * @license Qiai-License http://www.qiai.com/licenses/qiai.ck.html * @link http://www.qiais.com */ namespace Member\Model; use Zend\Db\Adapter\Adapter; use Zend\Db\ResultSet\ResultSet; use Zend\Db\TableGateway\TableGateway; use Zend\Db\Sql\Select; use Zend\Paginator\Adapter\DbSelect; use Zend\Paginator\Paginator; /** * Member: TableGateway * * @category Gc_Application * @package Member * @subpackage Model */ class UserTable { /** * TableGateway */ protected $tableGateway; /** * __construct * * @param TableGateway $tableGateway TableGateway * * @return void */ public function __construct(TableGateway $tableGateway) { $this->tableGateway = $tableGateway; } /** * fetchAll: get all data from table member. * * @return ResultSet */ public function fetchAll($paginated=false) { $resultSet = $this->tableGateway->select(); return $resultSet; } /** * saveMember: save data for user. * * @param Member $user user object * * @return ResultSet */ public function saveUser(User $user) { $nowtime = date("Y-m-d H:i:s"); $data = array( 'email' => $user->email, 'name' => $user->name, 'role' => $user->role, 'password' => $user->password, 'tel' => $user->tel, 'mobile' => $user->mobile, 'fax' => $user->fax, 'zipcode' => $user->zipcode, 'address' => $user->address, 'modified' => $nowtime ); $id = (int)$user->id; if ($id == 0) { $data['created'] = $nowtime; $this->tableGateway->insert($data); } else { if ($this->getUser($id)) { if(empty($data['password'])) unset($data['password']); $this->tableGateway->update($data, array('id' => $id)); } else { throw new \Exception('User ID does not exist'); } } } /** * Get User account by user id * * @param string $id string * * @throws \Exception * @return Row */ public function getUser($id) { $id = (int) $id; $rowset = $this->tableGateway->select(array('id' => $id)); $row = $rowset->current(); if (!$row) { throw new \Exception("Could not find row $id"); } return $row; } /** * deleteMember: delete user. * * @param int $id user id * * @return void */ public function deleteUser($id) { $this->tableGateway->delete(array('id' => $id)); } /** * getUserByEmail: get user by email. * * @param string $email email address * * @return Object */ public function getUserByEmail($email) { $rowset = $this->tableGateway->select(array('email' => $email)); $row = $rowset->current(); if (!$row) { throw new \Exception("Could not find row $email"); } return $row; } }
编辑module/Member/src/Member/Module.php文件
<?php /** * This source file is part of Qiai. * * PHP Version >=5.3 * * @category Qiai_Application * @package Member * @subpackage Module * @author Sai (QIAI) <sai@qiais.com> * @license Qiai-License http://www.qiai.com/licenses/qiai.ck.html * @link http://www.qiais.com */ namespace Member; use Zend\ModuleManager\Feature\AutoloaderProviderInterface; use Zend\Mvc\ModuleRouteListener; use Zend\Mvc\MvcEvent; use Zend\Db\ResultSet\ResultSet; use Zend\Db\TableGateway\TableGateway; use Member\Model\User; use Member\Model\UserTable; class Module implements AutoloaderProviderInterface { public function getAutoloaderConfig() { return array( 'Zend\Loader\ClassMapAutoloader' => array( __DIR__ . '/autoload_classmap.php', ), 'Zend\Loader\StandardAutoloader' => array( 'namespaces' => array( __NAMESPACE__ => __DIR__ . '/src/' . str_replace('\\', '/' , __NAMESPACE__), ), ), ); } public function getConfig() { return include __DIR__ . '/config/module.config.php'; } public function onBootstrap(MvcEvent $e) { $eventManager = $e->getApplication()->getEventManager(); $moduleRouteListener = new ModuleRouteListener(); $moduleRouteListener->attach($eventManager); } /** * get services * * @return array */ public function getServiceConfig() { return array( 'abstract_factories' => array(), 'aliases' => array(), 'factories' => array( // DB 'UserTable' => function ($sm) { $tableGateway = $sm->get('UserTableGateway'); $table = new UserTable($tableGateway); return $table; }, 'UserTableGateway' => function ($sm) { $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); $resultSetPrototype = new ResultSet(); $resultSetPrototype->setArrayObjectPrototype(new User()); return new TableGateway('users', $dbAdapter, null, $resultSetPrototype); }, ), 'invokables' => array(), 'services' => array(), 'shared' => array(), ); } }
这里我们现在主要用到以下代码
‘factories’ => array(
// DB
‘UserTable’ => function ($sm) {
$tableGateway = $sm->get(‘UserTableGateway’);
$table = new UserTable($tableGateway);
return $table;
},
‘UserTableGateway’ => function ($sm) {
$dbAdapter = $sm->get(‘Zend\Db\Adapter\Adapter’);
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new User());
return new TableGateway(‘users’, $dbAdapter, null, $resultSetPrototype);
},
通过zf2的ServiceManager连接数据库,获取容器,以便对users数据表操作。
编辑module/Member/src/Member/Controller/UserController.php文件
添加indexAction函数,读取所有用户
<?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/ZendSkeletonModule for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Member\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; use Member\Model\User; use Qiais\Auth; class UserController extends AbstractActionController { /** * index action * * @return array */ public function indexAction() { // for no pagination $userTable = $this->getServiceLocator()->get('UserTable'); $viewModel = new ViewModel(array('users' => $userTable->fetchAll())); return $viewModel; } }
通过上面的代码,我们看到,zf2的ServiceManager让我们的代码变得非常简洁。读取所有用户数据只用了2行代码。
编辑module/Member/view/member/user/index.phtml文件
这是UserController的indexAction的默认视图view文件
<h3>Users</h3> <table class="table table-bordered table-striped"> <tr> <th>Name</th> <th>Email</th> <th>Action</th> </tr> <?php foreach ($users as $user) : ?> <tr> <td><?php echo $this->escapeHtml($user->name);?></td> <td><?php echo $this->escapeHtml($user->email);?></td> <td> <a href="<?php echo $this->url('member/user', array('action'=>'edit', 'id' => $user->id));?>">Edit</a> | <a href="<?php echo $this->url('member/user', array('action'=>'delete', 'id' => $user->id));?>" onclick="return confirm('Are you sure?')">Delete</a> </td> </tr> <?php endforeach; ?> </table> <hr /> <a class="btn btn-primary" href="<?php echo $this->url('member/user',array('action'=>'create'));?>">Add User</a>