If you’re looking for a simple tool that uses Zend Framework’s robust database classes (such as Zend_Db and Zend_Db_Table), you can check out zdbform. It’s a short yet effective library that let’s you perform simple administration tasks on your database, with minimal coding.
It’s not a full blown phpMyAdmin, but it’s a simple way to view, edit and add your tables rows in a web interface. Also, don’t expect it to scale, because I am sure this library was written to serve some quick table administration needs, and that it is not ready to handle large datasets. But, it is very convenient if you have a small database to administer.
I implemented it with the Zend MVC components, and following is a brief overview.
In the front controller, or front plugin, or any class that your controller subclasses:
$this->db = Zend_Db::factory('Pdo_Mysql', array( 'host' => DB_HOST, 'username' => DB_USER, 'password' => DB_PASS, 'dbname' => DB_NAME )); Zend_Db_Table_Abstract::setDefaultAdapter($this->db);
Then set your controller and view scripts as necessary. Let’s say you have two tables to admin, “clients” and “history”. First make sure they are declared as subclasses of Zend_Db_Table:
require_once "Zend/Db/Table/Abstract.php"; class Clients extends Zend_Db_Table_Abstract { protected $_name = 'clients'; } class History extends Zend_Db_Table_Abstract { protected $_name = 'history'; }
Your controller would look like:
require_once "Zend/Controller/Action.php"; class AdminController extends Zend_Controller_Action { public function init() { require_once 'zdbform/zdbform.class.php'; require_once 'zdbform/zdbform_widgets.class.php'; require_once 'zdbform/zdbform_validations.php'; parent::init(); $this->view->headLink()->appendStylesheet('/zdbform/zdbform.css'); $this->_helper->viewRenderer('index'); } public function indexAction() { } public function clientsAction() { $this->view->dbform = new Zdbform('Clients'); $this->view->dbform->setWidget('description', 'textarea'); $this->view->dbform->processForms(); } public function historyAction() { $this->view->dbform = new Zdbform('History'); $this->view->dbform->processForms(); } }
And the single view script you need is admin/index.phtml:
<?php echo $this->headLink(); include_once "Zend/Filter/Word/CamelCaseToDash.php"; include_once "Zend/Filter/Word/CamelCaseToUnderscore.php"; $cctd = new Zend_Filter_Word_CamelCaseToDash(); $cctu = new Zend_Filter_Word_CamelCaseToUnderscore(); $classes = get_declared_classes(); foreach ($classes as $class) { if (is_subclass_of($class,'Zend_Db_Table_Abstract')) { ?> <a href="/admin/<?= strtolower($cctd->filter($class)) ?>"><?= strtolower($cctu->filter($class)) ?></a> <?php } } if ($this->dbform) { ?> <h1>Table: <?= $this->dbform->tableName ?></h1> <?php $this->dbform->showForms(); $this->dbform->showTable(); } ?>
There were also a couple things that needed changing in the zdbform class itself:
- Replace all PHP_SELF with REQUEST_URL. On the mvc case, PHP_SELF is empty or index.php, and we don’t want all the forms posted there, we want them to go back to /admin/clients or /admin/history
- After this line
$this->pk = $tableInfo['primary'];
I had to add this:
if (is_array($this->pk)) $this->pk = $this->pk[1];
- zdbform->orderBy is treated as a single column, of you want multiple column sorting you have to hack a bit with getAllRows().
That’s it, point your browser to /admin and you’re good to go. In a very short time and with a little bit of code, you can get something similar to a stripped down version of phpMyAdmin, using the power of Zend Framework.