Jak vypadá kód stojící za těmito stránkami?
Tyto stránky jsou postaveny na Zend Frameworku s rozdělením na modely, šablony prezentační vrstvy a controllery, které vše řídí.
Jako Model posloužila ORM knihovna Doctrine.
Pro View jsem použil vlastní šablonovací systém PSTL, který je podobný základnímu JSTL známému z Javy doplněnému o tagy z knihovny Stripes.
Ukázka PSP souboru
<?xml version="1.0" encoding="utf-8"?> <%@page pageEncoding="utf-8"%> <%@ taglib prefix="c" uri="http://www.hopkins.cz/pstl/core/" %> <%@ taglib prefix="f" uri="http://www.hopkins.cz/pstl/fmt/" %> <%@ taglib prefix="s" uri="http://www.hopkins.cz/stripes/" %> <s:layout-definition> <s:layout-render name="../layouts/layout.psp" title="${category.title?category.title:category.name}" description="${category.headerDescription}" keywords="${category.headerKeywords}"> <s:layout-component name="content"> <h2><c:out value="${category.title?category.title:category.name}" /></h2> ${category.content} <c:import url="articles.psp"/> <c:import url="file_list.psp"/> <c:import url="photogallery.psp"/> </s:layout-component> </s:layout-render> </s:layout-definition>
Jako Controller jsem použil ActionBean z mé PHP knihovny Stripes, který rozšiřuje standardní Zend_Controller o některé vhodné vlastnosti.
Ukázka ActionBeanu
<?php class Cms_FilesController extends Hopkins_Stripes_ActionBean { protected $_validateNestedProperties = array( array('method' => 'POST', 'on' => array('createFolder', 'editFolder'), 'field' => 'folder_name', 'required' => true), array('method' => 'POST', 'on' => array('create', 'edit'), 'field' => 'file_name', 'required' => true), ); protected $_validationMethods = array( array('method' => 'POST', 'on' => array('create', 'edit'), 'name' => '_nameValidation', 'when' => Stripes::VALIDATION_NO_ERRORS), array('method' => 'POST', 'on' => array('create', 'edit'), 'name' => '_fileUploadValidation', 'when' => Stripes::VALIDATION_NO_ERRORS), ); protected $file; private $fileManager; public function init() { $this->fileManager = FileManager::getInstance(); } /* ACTIONS INITS */ public function initIndex() { $this->_preloadSelectedFileFolder($this->getRequest()->getParam('folder')?$this->getRequest()->getParam('folder'):0); } public function initSelect() { $this->initIndex(); } /* ACTIONS */ public function indexAction() { $this->view->folders = $this->fileFolderManager->search('lft > ? AND rgt < ? AND level = ? AND locale = ?', array($this->selectedFolder->getLft(), $this->selectedFolder->getRgt(), $this->selectedFolder->getLevel() + 1, Zend_Registry::get('locale')), null, null, 't.name ASC'); $this->view->files = $this->fileManager->search('folder = ? AND locale = ?', array($this->selectedFolder->getId(), Zend_Registry::get('locale')), null, null, 'name ASC'); if ($this->selectedFolder->getId() != 0) { $this->view->folderId = $this->selectedFolder->getNode()->getParent()->getId(); } } public function createFolderAction() { if ($this->getRequest()->isPost()) { $this->fileFolderManager->save($this->folder); $this->folder->getNode()->insertAsLastChildOf($this->selectedFolder); Stripes::getInstance()->addMessage(new Hopkins_Message( PSTL::getInstance()->getResourceBundle()->getString('folders.create'), PSTL::getInstance()->getResourceBundle()->getString('folders.folderCreated', array($this->folder->getName())) )); $this->_helper->redirector->gotoSimpleAndExit('index', 'files', 'cms', array("folder" => $this->getRequest()->getParam('folder'))); } } /* VALIDATION METHODS */ protected function _fileUploadValidation() { if ($this->getRequest()->getActionName() == 'edit' && $_FILES['file_upload']['error'] == UPLOAD_ERR_NO_FILE) { return true; } elseif ($_FILES['file_upload']['error'] != UPLOAD_ERR_OK || !is_uploaded_file($_FILES['file_upload']['tmp_name'])) { switch($_FILES['file_upload']['error']) { case UPLOAD_ERR_NO_FILE: $message = PSTL::getInstance()->getResourceBundle()->getString("files.fileUpload.noFile"); break; case UPLOAD_ERR_INI_SIZE: $message = str_replace('{0}', ini_get('upload_max_filesize')."B", PSTL::getInstance()->getResourceBundle()->getString("files.fileUpload.sizeLimitExceeded")); break; default: $message = PSTL::getInstance()->getResourceBundle()->getString("files.fileUpload.failed"); } return array('file_upload' => $message); } return true; } }