本日、在庫管理システムSASO2.4がリリースされました。
以下のリンクからお越しください。
在庫管理システムSASO2.4
フリーロケーションのシンプルな在庫管理システムSASO
bootstrap5を使ったクールなデザイン。
クリーンアーキテクチャとモナドによる美しく※1、そして透明感※2のあるコード。
それが今、あなたの手に。
※1 当店比。
※2 参照透過性のこと。
21世紀のライフスタイルに合った新しい装束 ―
日本標準機構では、日本の装束をカジュアルにアレンジして販売しています。
狩衣(かりぎぬ)、直衣(のうし)、直垂(ひたたれ)などを現代のライフスタイルに合わせてより着やすく、よりカジュアルに。
カジュアル装束の販売は
日本標準機構
本日、在庫管理システムSASO2.4がリリースされました。
以下のリンクからお越しください。
在庫管理システムSASO2.4
フリーロケーションのシンプルな在庫管理システムSASO
bootstrap5を使ったクールなデザイン。
クリーンアーキテクチャとモナドによる美しく※1、そして透明感※2のあるコード。
それが今、あなたの手に。
※1 当店比。
※2 参照透過性のこと。
<?php namespace saso\classes\controllers; use \saso\classes\base; class ControllerBase{ private $_title; private $_content; private $_errorMessage; private function _linkTo($path){ return 'http://' . $_SERVER['HTTP_HOST'] . '/' . PROGRAM_DIR . '/' . $path; } private function _getContentTitle() { return $this->_title; } private function _getContent() { return $this->_content; } protected function _setContentTitle($title) { $this->_title = $title; } protected function _setCurrentContent($current) { require_once 'logic/' . $this->_controllerName . '/' . $current.'.php'; $this->_content = 'view/' . $this->_controllerName . '/' . $current.'.php'; require_once 'view/temp.php'; } protected function _invalidAccess(){ $postTest = new base\Post(); $nameTest = new base\Request($postTest); if(is_null($nameTest->getRequest())){ header('Location: http://'.$_SERVER['HTTP_HOST'] . '/' . PROGRAM_DIR . '/' . $this->_controllerName . '/start/',TRUE,'303'); } } public function error($errorCode){ switch($errorCode){ case 'database': $this->_errorMessage = 'データベースに接続できませんでした。'; break; case 'invalid': $this->_errorMessage = '入力値が不正です。'; break; case 'notFound': $this->_errorMessage = 'ページが見つかりません。'; break; case 'invalidClone': $this->_errorMessage = 'クローンは使えません。'; break; default: $this->_errorMessage = '予期せぬエラーが発生しました。'; break; } $this->_title = 'エラー'; $this->_content = 'view/error.php'; require_once 'view/temp.php'; } }
<?php namespace saso\classes\controllers; class ItemController extends ControllerBase{ protected $_controllerName = 'item'; public function startAction(){ $this->_setContentTitle('商品管理'); $this->_setCurrentContent('start'); } //商品登録 public function addItemAction(){ $this->_setContentTitle('商品登録'); $this->_setCurrentContent('addItem'); } public function addItemConfirmAction(){ $this->_invalidAccess(); $this->_setContentTitle('登録確認'); $this->_setCurrentContent('addItemConfirm'); } public function addItemSaveAction(){ $this->_invalidAccess(); $this->_setContentTitle('登録完了'); $this->_setCurrentContent('addItemSave'); } }
<?php namespace saso\classes\base; interface RequestInterface{ function setValues(); }それを実装したものが以下の二つです。
<?php namespace saso\classes\base; class Post implements RequestInterface{ private $_values; public function setValues(){ foreach($_POST as $key => $value){ $value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); $this->_values[$key] = $value; } return $this->_values; } }
<?php namespace saso\classes\base; class UrlParameter implements RequestInterface{ private $_values; public function setValues(){ foreach($_GET as $key => $value){ $this->_values[$key] = $value; } return $this->_values; } }Requestクラスはコンストラクタでインターフェースをタイプヒンティングしています。
<?php namespace saso\classes\base; class Request{ private $_request; public function __construct(RequestInterface $r){ $this->_request = $r->setValues(); } private function _hasKey($key){ if(false == array_key_exists($key,$this->_request)){ return false; } return true; } public function getRequest($key = null){ if(null == $key){ return $this->_request; }//キーを指定されなかったら、全部を配列で返す。 if(false == $this->_hasKey($key)){ return null; }//言われたキーがない場合nullを返す return $this->_request[$key];//普通は言われたキーのヴァリューを返す } }使い方は以下の通りです。
<?php $post = new base\Post(); $name = new base\Request($post); echo $name->getRequest('itemName');
<?php namespace saso\classes\base; class Dispatcher{ private $_sysRoot; public function setSystemRoot($path){ $this->_sysRoot = rtrim($path, '/'); } public function dispatch(){ $param = ereg_replace('/?$', '', $_SERVER['REQUEST_URI']); $param = ereg_replace(PROGRAM_DIR, '', $param); $param = ereg_replace('^/*', '', $param); $params = array(); if('' != $param){ $params = explode('/', $param); } //_GET(UrlParameter用) $_GET[0] = ''; if(2 < count($params)){ for($i = 0; $i < count($params) - 2; $i++){ $_GET[$i] = $params[$i+2]; } } //controller if(isset($params[0]) && 'start' == $params[0] && 'start' == $params[1]){ header('Location: http://'.$_SERVER['HTTP_HOST'] . '/' . PROGRAM_DIR . '/',TRUE,'301'); } $controller = 'start'; if(0 < count($params)){ $controller = $params[0]; } $className = ucfirst(strtolower($controller)) . 'Controller'; $className = '\\saso\\classes\\controllers\\' . $className; try{ $controllerInstance = new $className(); }catch(\Exception $e){ $ctrlbase = new \saso\classes\controllers\ControllerBase(); $ctrlbase->error($e->getMessage()); die(); } //action if(isset($params[0]) && !isset($params[1])){ header('Location: http://'.$_SERVER['HTTP_HOST'] . '/' . PROGRAM_DIR . '/' . $controller . '/start/',TRUE,'301'); } $action = 'start'; if(1 < count($params)){ $action = $params[1]; } $actionMethod = $action . 'Action'; try{ if(!method_exists($controllerInstance, $actionMethod)){ throw new \Exception('notFound'); } $controllerInstance->$actionMethod(); }catch(\Exception $e){ $ctrlbase = new \saso\classes\controllers\ControllerBase(); $ctrlbase->error($e->getMessage()); die(); } } }
<?php use \saso\classes\base; require_once 'config.php'; require_once 'autoload.php'; $dispatcher = new base\Dispatcher(); $dispatcher->setSystemRoot(DOCUMENT_ROOT . PROGRAM_DIR); $dispatcher->dispatch();
<?php function __autoload($classname) { $classname = ltrim($classname, '\\'); $filename = ''; $namespace = ''; if ($lastnspos = strripos($classname, '\\')) { $namespace = substr($classname, 0, $lastnspos); $classname = substr($classname, $lastnspos + 1); $firstnspos = stripos($namespace, '\\'); $namespace = substr($namespace, $firstnspos + 1); $filename = DOCUMENT_ROOT . PROGRAM_DIR . '/' . str_replace('\\', '/', $namespace) . '/'; } $filename .= $classname . '.php'; if(!file_exists($filename)){ throw new \Exception('notFound'); } require $filename; }
<?php const //パス DOCUMENT_ROOT = '/***/***/public_html/' ,PROGRAM_DIR = 'saso1_0' //データベース ,DSN = 'mysql:dbname=saso;host=localhost' ,USER = 'saso_user' ,PASSWORD= '**********' ;
<?php namespace saso\classes\base; class PdoManager{ private static $_pdo; private function __construct() { try{ self::$_pdo = new \PDO( DSN, USER, PASSWORD, array( \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_CLASS, ) ); self::$_pdo->exec('SET NAMES utf8'); }catch (\PDOException $e){ $ctrlbase = new \saso\classes\controllers\ControllerBase(); $ctrlbase->error('database'); die(); } } public static function getPdo() { new PdoManager(); return self::$_pdo; } public final function __clone() { throw new \Exception('invalidClone'); } }以下のように使います:
$pdo = saso\classes\base\PdoManager::getPdo(); $pdo->query('内容');
<?php $size = array('Sサイズ', 'Mサイズ', 'Lサイズ'); foreach($size as $key => $value){ echo $value; if(count($size)-1 != $key ){ echo "、"; } } ?>
<?php $size = array('Sサイズ', 'Mサイズ', 'Lサイズ'); foreach($size as $key => $value){ echo $value; if(count($size)-1 == $key ){ echo "。"; } } ?>
class Tomjr extends Tom { protected static $sentence="私はTomjr"; public function foo(){ $this->bar(); } } class Tom { protected static $sentence="私はTom"; public function bar(){ echo static::$sentence;//親クラスが子クラスの静的プロパティ・メンバを呼ぶときに使う } } $tomjr = new Tomjr(); $tomjr->foo();//結果:私はTomjr $tom = new Tom(); $tom->bar();//結果:私はTom