本日の業務日報と進捗表は以下の通りです。予定より前出しで進捗しております。
なお、本日「ルバシカ・黒」をヤフオク!に出品いたしましたことを報告いたします。
21世紀のライフスタイルに合った新しい装束 ―
日本標準機構では、日本の装束をカジュアルにアレンジして販売しています。
狩衣(かりぎぬ)、直衣(のうし)、直垂(ひたたれ)などを現代のライフスタイルに合わせてより着やすく、よりカジュアルに。
カジュアル装束の販売は
日本標準機構
2013年10月31日木曜日
2013年10月30日水曜日
在庫管理システム『SASO1.0』コントローラクラス
コントローラクラスは全て、スーパークラスのControllerBaseクラスを継承します。
ControllerBaseクラスの役割は主に、レガシーPHPであるlogicディレクトリの中身、及びビューの呼び出しです。
そして、エラーページを呼び出す役割もあります。
ビューはviewディレクトリ内のtemp.phpというテンプレートファイルから呼び出されます。
各ページのタイトルなどはtemp.phpに記述されます。
少々長いControllerBaseクラスに対し、それぞれのコントローラクラスは非常に単純です。
やっていることは、タイトルの設定と、呼び出すlogicとviewディレクトリ以下のファイル名のセットです。
「$this->_invalidAccess();」を設定することでPOSTなしでアクセスするのを防ぎます。
(startAction()に飛ばされます)
ControllerBaseクラスの役割は主に、レガシーPHPであるlogicディレクトリの中身、及びビューの呼び出しです。
そして、エラーページを呼び出す役割もあります。
ビューはviewディレクトリ内のtemp.phpというテンプレートファイルから呼び出されます。
各ページのタイトルなどはtemp.phpに記述されます。
<?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'; } }
少々長いControllerBaseクラスに対し、それぞれのコントローラクラスは非常に単純です。
やっていることは、タイトルの設定と、呼び出すlogicとviewディレクトリ以下のファイル名のセットです。
「$this->_invalidAccess();」を設定することでPOSTなしでアクセスするのを防ぎます。
(startAction()に飛ばされます)
<?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'); } }
2013年11月前半の予定
標題の予定は以下のガントチャートの通りです。
袴及び袴その2の製品作成に入ります。
それと同時に、新商品の開発も行ないます。
立体裁断は一日仕事となりますので、製品製造はその日はいたしません。
以上、今後とも日本標準機構をよろしくお願いいたします。
袴及び袴その2の製品作成に入ります。
それと同時に、新商品の開発も行ないます。
立体裁断は一日仕事となりますので、製品製造はその日はいたしません。
以上、今後とも日本標準機構をよろしくお願いいたします。
2013年10月29日火曜日
2013年10月28日月曜日
2013年10月25日金曜日
在庫管理システム『SASO1.0』POSTとGETの受け取り
POSTとGETの受け取りもクラスにします。
参考:http://www.objective-php.net/
手順としては、まずPOSTはPostクラス、GETはUrlParameterクラスが受け取ります。
(リクエスト振り分けクラスDispatcherがGETはスラッシュ区切りの第3パラメータ以降としていたのでした。)
次に、RequestクラスがPostインスタンス、UrlParameterインスタンスを引数に取り、
そののちgetRequest()メソッドで使えるようにします。
ここで、Requestクラスは2種類のインスタンスを引数に取りますが、
その2種類にはsetValues()メソッドを持って欲しいのです。
そこで、RequestInterfaceを定義します。
<?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');
参考:http://www.objective-php.net/
2013年10月24日木曜日
2013年10月23日水曜日
在庫管理システム『SASO1.0』リクエスト振り分けクラス
今回は在庫管理システムのリクエスト自動振り分けクラスDispatcherです。
少々長いです。
まず、setSystemRoot()はindex.phpで使用していました。
このシステムのルートディレクトリをセットするメソッドです。
dispatch()は受け取ったリクエストのルートより後を、
スラッシュ区切りでコントローラやアクション(コントローラ内のメソッド)に振り分けるのが
主な仕事です。
余分なところを取り除いた後で、スラッシュ区切りで配列に収納します。
具体的には、
http://****/saso1_0/
を取り除きます。
その後のリクエスト、例えば、
item/addItem/
であれば、まずitemの頭文字を大文字にして、"Controller"をくっつけてクラスを呼び出します。
そして、addItemは"Action"をくっつけてそのコントローラのメソッドを使います。
デフォルトは双方とも"start"としています。
つまり、item/だけであれば、ItemControllerクラスのstartAction()が呼ばれます。
さて、二つのパラメータの後にもスラッシュでリクエストが続いていたら、
以降はスーパーグローバル変数の$_GETに代入します。
スーパーグローバル変数には代入できないのかと思いましたが、$_GETには代入できるようです。
スラッシュで区切りながら、収納していきます。
以下のサイトを大いに参考にしました。PHPのオブジェクト指向、MVCアーキテクチャーについてわかりやすく説明しています。
http://www.objective-php.net/
少々長いです。
まず、setSystemRoot()はindex.phpで使用していました。
このシステムのルートディレクトリをセットするメソッドです。
dispatch()は受け取ったリクエストのルートより後を、
スラッシュ区切りでコントローラやアクション(コントローラ内のメソッド)に振り分けるのが
主な仕事です。
余分なところを取り除いた後で、スラッシュ区切りで配列に収納します。
具体的には、
http://****/saso1_0/
を取り除きます。
その後のリクエスト、例えば、
item/addItem/
であれば、まずitemの頭文字を大文字にして、"Controller"をくっつけてクラスを呼び出します。
そして、addItemは"Action"をくっつけてそのコントローラのメソッドを使います。
デフォルトは双方とも"start"としています。
つまり、item/だけであれば、ItemControllerクラスのstartAction()が呼ばれます。
さて、二つのパラメータの後にもスラッシュでリクエストが続いていたら、
以降はスーパーグローバル変数の$_GETに代入します。
スーパーグローバル変数には代入できないのかと思いましたが、$_GETには代入できるようです。
スラッシュで区切りながら、収納していきます。
<?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のオブジェクト指向、MVCアーキテクチャーについてわかりやすく説明しています。
http://www.objective-php.net/
2013年10月22日火曜日
在庫管理システム『SASO1.0』入口のファイル
SASO1.0では階層のトップに3つのPHPファイルを置いています。
index.phpは以下の通りです。
定数設定ファイルのconfig.phpとオートローダのautoload.phpを呼び出しています。
後はリクエストに応じて、Dispatcherクラスが振り分けてくれます。
次にオートローダである、autoload.phpです。
クラスを使うときは名前空間とディレクトリ構造が一致している必要があります。
もちろん、一つのクラスにつき一つのファイルです。
ちなみに、config.phpは以下の通りです。
index.phpは以下の通りです。
定数設定ファイルのconfig.phpとオートローダのautoload.phpを呼び出しています。
後はリクエストに応じて、Dispatcherクラスが振り分けてくれます。
<?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();
次にオートローダである、autoload.phpです。
クラスを使うときは名前空間とディレクトリ構造が一致している必要があります。
もちろん、一つのクラスにつき一つのファイルです。
<?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; }
ちなみに、config.phpは以下の通りです。
<?php const //パス DOCUMENT_ROOT = '/***/***/public_html/' ,PROGRAM_DIR = 'saso1_0' //データベース ,DSN = 'mysql:dbname=saso;host=localhost' ,USER = 'saso_user' ,PASSWORD= '**********' ;
2013年10月21日月曜日
在庫管理システム『SASO1.0』PDOを使う。
SASO1.0ではデータベース抽象レイヤーにPDOを使っています。
シングルトンパターンを使って、作ってみました。
クローンを禁止しています。
なお、オートローダがディレクトリ構造を把握したいので、名前空間を使っています。
デフォルトフェッチモードをクラスとして作ります。
catch内はコントローラクラスのスーパークラスにエラー処理をまとめているので、こうしました。
このファイルはclassesのbaseディレクトリに入れます。
シングルトンパターンを使って、作ってみました。
クローンを禁止しています。
なお、オートローダがディレクトリ構造を把握したいので、名前空間を使っています。
デフォルトフェッチモードをクラスとして作ります。
catch内はコントローラクラスのスーパークラスにエラー処理をまとめているので、こうしました。
このファイルはclassesのbaseディレクトリに入れます。
<?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('内容');
2013年10月18日金曜日
在庫管理システム『SASO1.0』のディレクトリ構造
下記のツリーは作成した在庫管理システムのディレクトリ構造です。
MVCアーキテクチャーで作りました。
まず、index.phpではオートローダと振り分けクラスを呼び出します。
全てのアクセスが、index.phpを経由します。
なお、config.phpも呼び出しますがそれは単に定数定義です。
classesディレクトリの中身は三つです。
baseはPDOやリクエスト振り分けなど、ほぼすべての箇所で使いまわすクラスを収めたディレクトリです。
controllersはMVCのC、そのままです。modelsはMです。
extentionは自作でないソフトの置き場です。
バーコードラベル印刷に使うPDFの出力を行うtcpdfをおきました。
http://www.tcpdf.org/(本家。ダウンロードできます)
http://www.monzen.org/doc/tcpdf/jman/(マニュアル日本語訳)
imgは画像ファイル、styleはスタイルシートです。
logicにはクラスを使うレガシーPHPのファイルを入れます。
viewはMVCのVです。ただしテンプレートシステムは使いませんでした。
このlogicとviewの中身のディレクトリは全て、コントローラクラスにそのまま対応します。
例えば、imageディレクトリの中身はImageController.phpから呼び出されます。
さらに各ディレクトリの中身のファイルがコントローラクラスのメソッドに対応します。
例えば、ImageController.phpのaddImageAction()はimageディレクトリのaddImage.phpを呼び出します。
saso1_0
├── .htaccess
├── index.php
├── config.php
├── autoload.php
├── classes
│ ├── base
│ ├── controllers
│ └── models
├── extention
│ └── tcpdf
├── img
├── logic
│ ├── image
│ ├── item
│ ├── label
│ ├── quantity
│ ├── shelf
│ └── start
├── style
└── view
├── image
├── item
├── label
├── quantity
├── shelf
└── start
MVCアーキテクチャーで作りました。
まず、index.phpではオートローダと振り分けクラスを呼び出します。
全てのアクセスが、index.phpを経由します。
なお、config.phpも呼び出しますがそれは単に定数定義です。
classesディレクトリの中身は三つです。
baseはPDOやリクエスト振り分けなど、ほぼすべての箇所で使いまわすクラスを収めたディレクトリです。
controllersはMVCのC、そのままです。modelsはMです。
extentionは自作でないソフトの置き場です。
バーコードラベル印刷に使うPDFの出力を行うtcpdfをおきました。
http://www.tcpdf.org/(本家。ダウンロードできます)
http://www.monzen.org/doc/tcpdf/jman/(マニュアル日本語訳)
imgは画像ファイル、styleはスタイルシートです。
logicにはクラスを使うレガシーPHPのファイルを入れます。
viewはMVCのVです。ただしテンプレートシステムは使いませんでした。
このlogicとviewの中身のディレクトリは全て、コントローラクラスにそのまま対応します。
例えば、imageディレクトリの中身はImageController.phpから呼び出されます。
さらに各ディレクトリの中身のファイルがコントローラクラスのメソッドに対応します。
例えば、ImageController.phpのaddImageAction()はimageディレクトリのaddImage.phpを呼び出します。
saso1_0
├── .htaccess
├── index.php
├── config.php
├── autoload.php
├── classes
│ ├── base
│ ├── controllers
│ └── models
├── extention
│ └── tcpdf
├── img
├── logic
│ ├── image
│ ├── item
│ ├── label
│ ├── quantity
│ ├── shelf
│ └── start
├── style
└── view
├── image
├── item
├── label
├── quantity
├── shelf
└── start
.htaccessの中身は以下の通りです:
RewriteEngine On
RewriteBase /saso1_0/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !\.(pdf|ico|gif|jpg|png|css|html|xml)$ index.php
こう書いておくと、最後の行で指定した拡張子以外のファイルをどう呼びだそうと、
index.phpに飛ばされます。そして、そのindex.phpはアドレスバーに表示されません。
2013年10月17日木曜日
2013年10月17日業務報告と直近の予定
本日の業務日報は以下の通りです。
本日、ギリシャ風パンツのサンプル第一版の作成が完了しました。
修正すべき点が多数ありますので、今後改良していきます。
さて、本日から2013年10月31日の予定を作成いたしました。
以下のガントチャートの通りです。
本着物えりシャツのサンプル作成と同時に袴のパターンを2型作成します。
そのあと、本着物えりシャツは可能であれば本生産に入ります。
(もし不可であれば、ルバシカ・黒の予定を前倒しにします。)
また、その間に袴のサンプルを作成します。
以後、ルバシカ・黒の製品作成や袴のサンプル2型目を作成します。
以上、今後とも日本標準機構をよろしくお願いいたします。
本日、ギリシャ風パンツのサンプル第一版の作成が完了しました。
修正すべき点が多数ありますので、今後改良していきます。
さて、本日から2013年10月31日の予定を作成いたしました。
以下のガントチャートの通りです。
本着物えりシャツのサンプル作成と同時に袴のパターンを2型作成します。
そのあと、本着物えりシャツは可能であれば本生産に入ります。
(もし不可であれば、ルバシカ・黒の予定を前倒しにします。)
また、その間に袴のサンプルを作成します。
以後、ルバシカ・黒の製品作成や袴のサンプル2型目を作成します。
以上、今後とも日本標準機構をよろしくお願いいたします。
2013年10月16日水曜日
2013年10月15日〜16日業務報告と在庫管理システムの紹介
昨日と本日の業務について説明いたします。
ついに、在庫管理システムが完成いたしました。
昨日、完成が近づき熱中してプログラミングしておりましたため、報告が遅くなりました。
Stok-Administra SistemO(在庫管理システムのエスペラント語訳)バージョン1.0を略しまして、
SASO1.0(サーソ)と申します。
バーコードリーダで簡単に棚番登録、入出庫管理ができ、
どこに何がいくつあるかという、在庫管理システムの基本的な機能のみ実装しました。
アパレル商品を想定しているため、サイズ、色の区分が存在するアイテムに使用できます。
2番目の画像のようにラベルシールにバーコードを含んだ商品ラベルを印刷することが可能です。
その他、入出庫の履歴を記録したり、棚番とそのバーコードを出力したりが可能です。
なお、本来であれば、どのようなソフトウエアなのかを、公開したいのですが、
十分なセキュリティチェックをしておりませんので、公開できません。
いくつかの脆弱性には対応していますが、完全ではありません。
ついに、在庫管理システムが完成いたしました。
昨日、完成が近づき熱中してプログラミングしておりましたため、報告が遅くなりました。
Stok-Administra SistemO(在庫管理システムのエスペラント語訳)バージョン1.0を略しまして、
SASO1.0(サーソ)と申します。
バーコードリーダで簡単に棚番登録、入出庫管理ができ、
どこに何がいくつあるかという、在庫管理システムの基本的な機能のみ実装しました。
アパレル商品を想定しているため、サイズ、色の区分が存在するアイテムに使用できます。
2番目の画像のようにラベルシールにバーコードを含んだ商品ラベルを印刷することが可能です。
その他、入出庫の履歴を記録したり、棚番とそのバーコードを出力したりが可能です。
なお、本来であれば、どのようなソフトウエアなのかを、公開したいのですが、
十分なセキュリティチェックをしておりませんので、公開できません。
いくつかの脆弱性には対応していますが、完全ではありません。
2013年10月10日木曜日
2013年10月8日火曜日
2013年10月7日月曜日
2013年10月4日金曜日
2013年10月3日木曜日
tetote(テトテ)にてコンビニ払い・銀行ATM振込・ネットバンク振込が可能に
2013年10月2日水曜日
2013年10月2日業務報告と10月3日、4日の予定
本日は大掃除を行いました。
明日より、実作業に入ります。
明日、明後日の予定は以下のガントチャートの通りです。
2日間で、ガラフタン・黒を完成させます。
在庫管理システムは引き続き実装を行います。
ウエストフリーパンツは改良版を開発します。
今後とも日本標準機構をよろしくお願いいたします。
明日より、実作業に入ります。
明日、明後日の予定は以下のガントチャートの通りです。
2日間で、ガラフタン・黒を完成させます。
在庫管理システムは引き続き実装を行います。
ウエストフリーパンツは改良版を開発します。
今後とも日本標準機構をよろしくお願いいたします。
登録:
投稿 (Atom)