SQLの窓

2018年09月09日


WordPress のテーマのテンプレート

wp-content/themes にフォルダを作成して、その中に最低限必要なのが、style.cssindex.php です。

0) index.php
( ここで使用しているテンプレートで、テンプレート階層の最下層です )

単純なサイトならばこれだけでもなんとかなりますが、これ以外に以下の部品を用意するだけで、WordPress のテーマの概要を掴む事ができます。

1) header.php
2) footer.php
3) content.php
( 1〜3 は、index.php から呼び出される部品です )

4) functions.php
( WordPress のオプションを設定したり、テーマで必要な関数を定義します / PHP で記述します )

style.css
@charset "UTF-8";
/*

Theme Name: テーマ名
Theme URI: テーマのサイトのURI
Author: 作者名
Author URI: 作者のサイトのURI
Description: 説明
Version: バージョン
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html

*/


sryle.css は、もちろん css を記述して使用できますが、いろいろなバリエーションのページを作成する場合に必ずしもこのファイルにこだわる必要も無いので、ここでは単なる『テーマのラベル』として認識しておきます。

※ 自動的にこの style.css が必ず設置されるものでは無く、ここでは css は『テーマの構成』には関係ありません

この style.css の中にコメントとして書かれた内容のうち、『テーマ名』が、WordPress 管理画面の『テーマ』で表示されて『有効』にする事ができます



index.php

get_header()get_footer() は、後述の header.phpfooter.php で定義された内容を出力します。

wp_head() は、システムで定義済の ヘッダー部分に出力するべき内容を出力します。例えば、プラグインで登録されたアプリケーションにとって必要なものがここを経由して実装されます。

そして一番重要なのは、get_template_part() で、任意のテンプレートを使用する事ができるという事です。
ここでは、"content.php" が使用されます
<?php
/*

メインテンプレートファイル

これはWordPressのテーマで最も一般的なテンプレートファイルです
テーマに必要な2つのファイルの1つ(style.css)
これは、何も特定のクエリに一致しない場合にページを表示するために使用されます。

*/


get_header();
wp_head();
?>
</head>
<body>
<div id="root">
<h3>Main Template File</h3>
<?php

if ( have_posts() ) :

	// *****************************
	// 投稿がある間ループ
	// *****************************
	while ( have_posts() ) : 

		// *****************************
		// 次の投稿を取得
		// *****************************
		the_post();

		// *****************************
		// フォーマットを取得する
		// (通常は空文字列)
		// *****************************
		$get_post_format = get_post_format();
		print "<span>$get_post_format</span>";

		// *****************************
		// "content-{$get_post_format}.php" を使用
		// *****************************
		get_template_part( 'content', $get_post_format );

	endwhile;

else :
	// 投稿が無い場合に表示したい内容
endif;

?>

</div>
<?php get_footer(); ?>


header.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- ユーザヘッダー -->
<link rel="stylesheet" href="<?= get_stylesheet_uri() ?>" type="text/css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css">


HTML 上の <head> 〜 </head> の共通の部分という認識でいいと思います。
※ ここでは、意図的に style.css を記述しています。


footer.php
<!-- ユーザーフッター -->

</body>
</html>


HTML 上の コンテンツの下部にある共通の部分です。

content.php
<div id="post-<?php the_ID(); ?>">
<a href="<?= esc_url( get_permalink() ) ?>"><?= get_the_title() ?></a>

<?php

	the_content( ); 
?>
</div>


the_content( ) は、現在の投稿の本文を出力し、the_ID() は投稿の ID を出力し、get_permalink() と get_the_title() で投稿のタイトルに単独ページへのリンクを設定しています。

functions.php

システムに対して、オプション設定を行うファイルです。オプションを追加したり、デフォルトで追加されているものを削除したり、PHP として技術的な処理を行ったりします。

ここでは、冒頭でテーマ限定でエラー時にエラー出力をするように設定しています。

さらに、システムで定義済の『投稿フォーマット』を追加して、投稿時に選択できるようにしています。


( ここでは、content-gallery.php が無いので、content.php が使用されます )

<?php
// ***********************************************
// このテーマでエラーの場合表示
// ***********************************************
error_reporting( E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_WARNING );
ini_set('display_errors', '1');

// ***********************************************
// 投稿フォーマットを追加
// ***********************************************
add_theme_support('post-formats', array( 'gallery' ));

// ▼ wp_head() から排除
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'wp_generator' );

// ***********************************************
// rsd_link は、general-template.php 内で定義
// ***********************************************
remove_action( 'wp_head', 'rsd_link' );


// ***********************************************
// emoji 関連削除
// ***********************************************
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );

// ***********************************************
// wp-json 削除
// https://developer.wordpress.org/reference/functions/rest_output_link_wp_head/
// ***********************************************
remove_action('wp_head','rest_output_link_wp_head');

// ***********************************************
// dns-prefetch 削除
// wp-includes/default-filters.php
// ***********************************************
remove_action('wp_head','wp_resource_hints',2);

// ***********************************************
// フィード 削除
// ***********************************************
remove_action('wp_head', 'feed_links_extra', 3);

// ***********************************************
// prev & next  削除
// ***********************************************
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');

// ***********************************************
// canonical 削除
// ***********************************************
remove_action('wp_head', 'rel_canonical');

// ***********************************************
// shortlink 削除
// ***********************************************
remove_action('wp_head', 'wp_shortlink_wp_head');

// ***********************************************
// oembed 削除
// ***********************************************
remove_action('wp_head','wp_oembed_add_discovery_links');
remove_action('wp_head','wp_oembed_add_host_js');

// ***********************************************
// 管理バー 削除
// ***********************************************
add_filter( 'show_admin_bar', '__return_false' );

?>


二つの投稿の表示結果

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- ユーザヘッダー -->
<link rel="stylesheet" href="http://ドメイン/lightbox/wp-content/themes/lightbox/style.css" type="text/css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css">





</head>
<body>
<div id="root">
<h3>Main Template File</h3>
<span>gallery</span><div id="post-35">
<a href="http://ドメイン/lightbox/template/2018/08/29/next-post/">ふたつめ</a>

<p>the_post_navigation の確認</p>
</div>
<span></span><div id="post-1">
<a href="http://ドメイン/lightbox/none/2018/08/29/hello-world/">Hello world!</a>

<p>WordPress へようこそ。これは最初の投稿です。編集もしくは削除してブログを始めてください !</p>
</div>

</div>
<!-- ユーザーフッター -->

</body>
</html>






posted by lightbox at 2018-09-09 21:22 | PHP + WEBアプリ | このブログの読者になる | 更新情報をチェックする

2018年08月30日


GD で画像縮小。『1) 単純縮小、2) 幅にあわす 3) 高さにあわす 4) 任意の幅と高さ』をその他の処理も含めてクラスでまとめ( class GD )

読み出す画像は、短縮 URL で動作確認しています。使用目的としては、画像をアップロードして縮小して保存する事ですが、保存前に必要ならば GD を使って修正をする事も想定しています。

デモページ
<?php
# 新しいオブジェクト
$GD = new GD();

# WEB よりイメージを作成
# 短縮url で動作します
$GD->LoadJpeg( "https://bit.ly/2MCYPI0" );

# 赤のパレットを作成
$red = $GD->CreateColor( 255, 0, 0 );

# 線の太さを設定
$GD->SetLineWidth( 3 );

# パラメータの処理
if ( ctype_digit( $_GET['x'] ) ) {
	$x = $_GET['x'];
}
else {
	$x = 135;
}
if ( ctype_digit( $_GET['y'] ) ) {
	$y = $_GET['y'];
}
else {
	$y = 118;
}

# 楕円を描画
$GD->Arc( $x, $y, 60, 35, $red );

# 黒のパレットを作成
$black = $GD->CreateColor( 0, 0, 0 );

# 白のパレットを作成
$white = $GD->CreateColor( 255, 255, 255 );

# 点線のスタイルを作成
$style = array(
	$black,$black,$black,$black,$black,
	$white,$white,$white,$white,$white
);

# 線の太さを設定
$GD->SetLineWidth( 1 );

# スタイルを使用して斜め線を描画
$GD->Line( 20, 30, 200, 100, $style );

# 指定の大きさで新しいオブジェクトを作成
//@$GD->Copy( $GD2, 0.3 );
//@$GD->CopyW( $GD2, 100 );
//@$GD->CopyH( $GD2, 200 );
@$GD->CopyWH( $GD2, 600, 400 );

# 縮小画像をファイルとして保存
$GD2->SaveJpeg( "uf3_001.jpg" );

# ブラウザに表示
$GD2->Response( );

# 後処理
$GD->DestroyColor( $red );
$GD->Destroy( );
$GD2->Destroy( );


# ***********************
# クラス
# ***********************
class GD {

	var $im;
	var $type;

# ***********************
# コンストラクタ
# ***********************
	function GD( ) {
	}

# ***********************
# キャンバス作成
# ***********************
	function CreateCanvas( $Width, $Height, $Type="PNG" ) {
		$this->type = $Type;
		$this->im = imagecreatetruecolor($Width, $Height);
	}

# ***********************
# PNG ロード
# ***********************
	function LoadPng( $Target ) {
		$this->type = "PNG";
		$this->im = @ImageCreateFromPng($Target);
	}
 
# ***********************
# JPEG ロード
# ***********************
	function LoadJpeg( $Target ) {
		$this->type = "JPEG";
		$this->im = @ImageCreateFromJpeg($Target);
	}

# ***********************
# 色リソース作成
# ***********************
	function CreateColor( $Red, $Green, $Blue ) {
		$ret = ImageColorAllocate (
			$this->im,
			$Red, $Green, $Blue );
		return $ret;
	}

# ***********************
# 線幅設定
# ***********************
	function SetLineWidth( $Width ) {
		ImageSetThickness( $this->im, $Width );
	}

# ***********************
# 直線の描画
# ***********************
	function Line( $x1, $y1, $x2, $y2, $Option ) {
		if ( is_array( $Option ) ) {
			ImageSetStyle( $this->im, $Option );
			ImageLine(
				$this->im, $x1, $y1, $x2, $y2, IMG_COLOR_STYLED );
		}
		else {
			ImageLine(
				$this->im, $x1, $y1, $x2, $y2, $Option );
		}
	}

# ***********************
# 矩形の描画
# ***********************
	function Box( $x, $y, $w, $h, $Color, $fill=FALSE ) {
		if ( $fill ) {
			imageFilledRectAngle(
				$this->im, $x, $y, $x+$w, $y+$h, $Color );
		}
		else {
			ImageRectAngle(
				$this->im, $x, $y, $x+$w, $y+$h, $Color );
		}
	}

# ***********************
# 楕円の描画
# ***********************
	function Arc( $x, $y, $w, $h, $Color ) {
		ImageArc( $this->im, $x, $y, $w, $h, 0, 359, $Color );
	}

# ***********************
# ブラウザへ出力
# ***********************
	function Response( ) {
		switch( $this->type ) {
			case "PNG":
				header('Content-Type: image/png');
				ImagePng( $this->im );
				break;
			case "JPEG":
				header('Content-Type: image/jpeg');
				ImageJpeg( $this->im );
				break;
		}
	}

# ***********************
# PNG 保存
# ***********************
	function SavePng( $FilePath ) {
		ImagePng( $this->im, $FilePath );
	}

# ***********************
# JPEG 保存
# ***********************
	function SaveJpeg( $FilePath, $Quality=75 ) {
		ImageJpeg( $this->im, $FilePath, $Quality );
	}

# ***********************
# 色リソース開放
# ***********************
	function DestroyColor( $Color ) {
		ImageColorDeallocate( $this->im, $Color );
	}

# ***********************
# イメージの破棄
# ***********************
	function Destroy( ) {
		ImageDestroy ( $this->im );
	}

# ***********************
# 伸縮された新しいイメージの作成
# ***********************
	function Copy( &$New, $rate ) {
		$w = ImageSx( $this->im );
		$h = ImageSy( $this->im );
		$New = new GD();
		$New->im = ImageCreateTrueColor( $w * $rate, $h * $rate );
		$w2 = ImageSx( $New->im );
		$h2 = ImageSy( $New->im );
		ImageCopyResampled(
			$New->im,
			$this->im,
			0,0,0,0,
			$w2, $h2,
			$w, $h
		);
		$New->type = $this->type;
	}

	function CopyW( &$New, $w_new ) {
		$w = ImageSx( $this->im );
		$rate = $w_new / $w;
		$h = ImageSy( $this->im );
		$New = new GD();
		$New->im = ImageCreateTrueColor( $w_new, $h * $rate );
		$w2 = ImageSx( $New->im );
		$h2 = ImageSy( $New->im );
		ImageCopyResampled(
			$New->im,
			$this->im,
			0,0,0,0,
			$w2, $h2,
			$w, $h
		);
		$New->type = $this->type;
	}

	function CopyH( &$New, $h_new ) {
		$w = ImageSx( $this->im );
		$h = ImageSy( $this->im );
		$rate = $h_new / $h;
		$New = new GD();
		$New->im = ImageCreateTrueColor( $w * $rate, $h_new );
		$w2 = ImageSx( $New->im );
		$h2 = ImageSy( $New->im );
		ImageCopyResampled(
			$New->im,
			$this->im,
			0,0,0,0,
			$w2, $h2,
			$w, $h
		);
		$New->type = $this->type;
	}

	function CopyWH( &$New, $w_new, $h_new ) {
		$w = ImageSx( $this->im );
		$h = ImageSy( $this->im );
		$New = new GD();
		$New->im = ImageCreateTrueColor( $w_new, $h_new );
		$w2 = ImageSx( $New->im );
		$h2 = ImageSy( $New->im );
		ImageCopyResampled(
			$New->im,
			$this->im,
			0,0,0,0,
			$w2, $h2,
			$w, $h
		);
		$New->type = $this->type;
	}
}




タグ:gd PHP
posted by lightbox at 2018-08-30 12:05 | PHP + WEBアプリ | このブログの読者になる | 更新情報をチェックする

2018年08月29日


PHP : 超簡易ログ

複雑な処理ですと、画面に表示しづらい場合があります。そんな時、その場限りのログです
file_put_contents( uniqid().".log", $vaiue );

// 以下は配列やオブジェクトを出力したい場合

file_put_contents( uniqid().".log", print_r( $_POST, true ) );







posted by lightbox at 2018-08-29 12:56 | PHP + WEBアプリ | このブログの読者になる | 更新情報をチェックする

2018年07月15日


PHP + MySQL + IFRAME + Bootstrap : 問い合せ WEB アプリテンプレート



デモページ


JavaScript は jQuery を使用します。

テンプレート構造

IFRAME 内の処理( req フォルダ内 )が実際の問い合わせ処理になります。メインページの下部に CSS の calc 関数を使用してフィットさせています。



メインの control.php( エントリポイント )

更新等を行う場合は、ここに入力値のコントロールが入ります。ここでは画面を表示するだけなので、共通処理と画面のみを require_once しています。

※ コメントに # を使用しているのは、Ruby と Python に合わすためです( テンプレート )
<?php
# ***************************
# ソースベースの取り込み
# ***************************
require_once('settings.php');

# ***************************
# 画面定義
# ***************************
require_once('view.php');
?>


settings.php ( 共通処理 )

PHP としての設定と、アプリとしての初期設定と、デバッグ用のログ関数の定義を行っています。この処理は、問い合わせ処理側( req フォルダ内 )からも読み込まれて使用されます。
<?php
# ***************************
# 共通処理( UTF8N で保存 )
# ***************************
error_reporting( E_ALL & ~E_NOTICE & ~E_STRICT );
ini_set('display_errors', '1');
ini_set('date.timezone', 'Asia/Tokyo');
ini_set('default_charset', 'utf-8');
session_cache_limiter('nocache');
session_start();
header( "Content-Type: text/html; charset=utf-8" );


foreach( $_REQUEST as $key => $value ) {

	# ここで $_REQUEST 内の(入力された)文字列の処理

}

# ***************************
# デバッグログの初期化
# ***************************
file_put_contents("debug.log", "開始\n" );

# ***************************
# メッセージ
# ***************************
$check_message = "";

# ***************************
# クライアント会話コントロール
# 1 は第一会話
# ***************************
$gpass = "1";

# ***************************
# デバッグログ関数(テキスト)
# ***************************
function txlog($message) {

	file_put_contents("debug.log", "{$message}\n" , FILE_APPEND );

}

# ***************************
# デバッグログ関数
# (オブジェクト等)
# ***************************
function pplog($data) {

	file_put_contents("debug.log", print_r($data, true) , FILE_APPEND );

}
?>


view.php ( メイン画面定義 )

画面定義は、PHP の HTML モードでは無くヒアドキュメントで行っています( これも、Ruby と Python に合わす為です )。変数のパースも {} を必ず使用するようにして、Ruby と Python との差異をできるだけ小さくしようとしています。

JavaScript の外部ファイルの読み込み時のキャッシュ制御を行う為、ページが表示された時間を URL に付加しています。
<?php
require_once('view_config.php');

# **************************************
# js キャッシュ用
# **************************************
$tm = mktime();

# **************************************
# 画面定義
# ( Ruby や Python に合わせた画面形式 )
# **************************************
$out_client = <<<HTML
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css" />

<script src="{$view_js}?{$tm}"></script>

<style>
/* ブロックを左右に表示  */
.ttl {
	display: inline-block;
	width: 150px;
}
.entry {
	display: inline-block;
}
.line {
	margin-bottom: 0;
}


/* IFRAMEコントロール用  */
html,body {
	height: 100%;
}

body {
	margin: 0;
}

/* IFRAMEコントロール用  */
#head {
	padding: 16px;
	width: 100%;
	height: {$view_head_height}px;
	background-color: #e0e0e0;
}
#extend {
	display: block;
	margin-left: auto;
	margin-right: auto;
	width: calc( 100% - 3px );
	height: calc( 100% - {$view_head_height}px - 2px );
	border: solid 2px #c0c0c0;
}
</style>
</head>
<body>

<div id="head">
	<p class="ttl">
		氏名で検索
	</p>
	<p class="entry">
		<input
			id="cond"
			type="text">
		<input
			class="ml-4 btn btn-success"
			id="btn"
			type="button"
			value="問合せ">

		<a
			class="ml-4 btn btn-info btn-sm"
			href="{$_SERVER["PHP_SELF"]}">GET 再読み込み</a>
	</p>
	<p class="line"></p>

	<h4 class="text-danger">{$check_message}</h4>

</div>

<iframe id="extend" name="extend" class="iframe-option" src="req/control.php"></iframe>

</body>
</html>
HTML;

print $out_client;


?>

※ 画面上のスペーシングに Bootsrtap のクラスである ml-4( margin-left: 1.5rem !important; ) を使用しています。
※ btn btn-success、btn btn-info btn-sm は、ボタン用の Bootsrtap のクラス

view_config.php ( 画面用定数の定義 )

PHP の変数を使用して、画面に必要な文字列や数値を定義しています。
<?php
# ***************************
# 画面に埋め込む定数用変数
# ***************************
$view_js = "entry.js";

$view_head_height = "100";


?>


entry.js

1) Bootstrap のボタンの表示位置の調整を行っています。
2) 問い合わせの条件を JavaScript 側で作成して IFRAME の src にセットしています。
// ロードイベント
$(function(){

	// ***************************
	// ボタン表示位置微調整
	// ***************************
	$( ".btn" ).css({
		"margin-top": "-4px"
	});

	// ***************************
	// IFRAME に問合せを表示
	// ***************************
	$( "#btn" ).click(function() {
		$("#extend").prop("src","req/control.php?nm=" + encodeURIComponent($("#cond").val()));
	});

});


control.php ( 問い合わせのエントリポイント )

単独で動作する問い合わせアプリケーションです。GET メソッドで QueryString を受け取って内部の SQL 処理に引き渡すので、real_escape_string でエスケープして専用の連想配列を作成しています。( オリジナルはそのままです )

データベースの接続に必要な値は、include_path に設定されたディレクトリに config.php を作成してセットします
<?php
$host = "MySQLサーバ";
$user = "ユーザ";
$pass = "パスワード";
$db = "データベース";
?>
<?php
# ***************************
# ソースベースの取り込み
# ***************************
require_once('../settings.php');
require_once('../model.php');
require_once('config.php');

# ***************************
# MySQL 接続
# ***************************
$con = @new mysqli($host, $user, $pass, $db);
$con->set_charset("utf8");

# ***************************
# MySQL 用特殊文字エスケープ
# ***************************
foreach( $_REQUEST as $key => $value ) {
	$_REQUEST["db"][$key] = $con->real_escape_string($value);
}

# ***************************
# テーブル表示
# ***************************
build_table($con);

# ***************************
# MySQL 接続解除
# ***************************
$con->close();

# ***************************
# 画面定義
# ***************************
require_once('view.php');
?>


view.php ( 問い合わせ用画面 )

テーブル表示時のカーソルを常にデフォルトに固定して、テーブルのデータが折り返さないように以下の CSS が追加定義されています

table 部分の行データの埋め込み部分に tbody を明示しているのは、行を jQuery で動的に作成した時に tbody が無いと Bootstrap の css が動作しないからです( 他のテンプレートと差異を少なくする為 )。
td,th {
	cursor: default!important;
	white-space: pre;
}
<?php
require_once('view_config.php');

# **************************************
# js キャッシュ用
# **************************************
$tm = mktime();

# **************************************
# 画面定義
# ( Ruby や Python に合わせた画面形式 )
# **************************************
$out_client = <<<HTML
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.1/css/bootstrap.css" />

<script src="{$view_js}?{$tm}"></script>

<style>
td,th {
	cursor: default!important;
	white-space: pre;
}

body {
	margin: 0;
	padding: 16px;
}

#tbl {
	user-select: none;
	-moz-user-select: none;
	-webkit-user-select: none;
	-ms-user-select: none;
}

</style>
</head>
<body>

	<table class="table table-hover">
		<tbody id="tbl">
			{$GLOBALS['table']}
		</tbody">
	</table>

</body>
</html>
HTML;

print $out_client;

?>


model.php ( テーブル作成部分 )

1) 列データの文字列をまずループで作成しています( SQLを変更するだけで違った問い合わせを表現できます )
2) 列データが完成する毎に、行データを作成して全体の文字列に追加していきます。
<?php
# ***************************
# モデル用関数を定義する
# ***************************

# ***************************
# テーブル表示
# ***************************
function build_table($con) {

	// デバッグ用
	txlog( "build_table:開始" );
	pplog( $con );

	// TR 内の HTML 文字列
	$lines = "";
	$sql= <<<SQL
		select 
			社員コード,
			氏名,
			フリガナ,
			所属,
			性別,
			作成日,
			更新日,
			給与,
			手当,
			管理者,
			DATE_FORMAT(生年月日,'%Y/%m/%d') as 生年月日
		from 社員マスタ
		where 氏名 like '%{$_REQUEST["db"]["nm"]}%'
SQL;

	$rs = $con->query($sql);	// エラー処理省略(本当は必要)
	//  デバッグ用
	pplog( $rs );

	// 列情報を取得( タイトル用 )
	$fields_data = $rs->fetch_fields();
	foreach( $fields_data as $field ){
		$lines .= "<th>{$field->name}</th>";
	}

	// 列データを取得
	while( $row = $rs->fetch_array(MYSQLI_BOTH) ) {
	
		$cells  = "";
		for( $i = 0; $i < $rs->field_count; $i++ ) {
			$cells .= "<td>{$row[$i]}</td>";
		}
	
		$lines .= "<tr>{$cells}</tr>" . "\n";
	}

	// 埋め込み用グローバル変数へセット	
	$GLOBALS['table'] = $lines;

	//  デバッグ用
	txlog( "build_table:終了" );

}

?>


関連する記事

Ruby + MySQL + IFRAME + Bootstrap : 問い合せ WEB アプリテンプレート

Python + MySQL + IFRAME + Bootstrap : 問い合せ WEB アプリテンプレート

CSS の calc 関数を使って、IFRAME を画面下半分にフィットさせる




posted by lightbox at 2018-07-15 12:27 | PHP + WEBアプリ | このブログの読者になる | 更新情報をチェックする

2017年05月19日


Windows で Laravel を試す際、PHP の Windows バージョンが 5.6.30 なので、Laravel 5.2 をインストールします

おそらくは、5.4 でも動作するのでは無いかと思いますが、世の中の情報がそれほど最新に対応してるわけでも無く、最新だと、ルーティングするファイルも違うので Laravel 5.2 でテストを行いました。

Laravel 5.2 公式ページ(英文)
バージョン対象PHP バージョンBladeテンプレートルーティングリリース
5.4PHP >= 5.6.4OKroutes/web.php2017/1/24
5.3PHP >= 5.6.4OKroutes/web.php2016/8/23
5.2PHP >= 5.5.9OKapp/Http/routes.php2015/12/21
5.1PHP >= 5.5.9OKapp/Http/routes.php2015/6/9
5.07 > PHP >= 5.4なしapp/Http/routes.php2015/2/4
Laravel 5.2 日本語ドキュメントページ

composer global ... による Laravel のインストール

試してみましたが、これは最新の Larvel がインストールされるため、laravel new ... でプロジェクトを作成する方法はできません。以下のように Composer で行う必要があります。
composer create-project --prefer-dist laravel/laravel プロジェクト名 "5.2.*"
※ プロジェクト名は英数字 上記コマンドは長いので、以下のようなバッチファイルにして php がインストールされているフォルダに保存するといいでしょう ( Composer のインストールで、php インストールフォルダにパスが通っているはずなので )
@echo off
composer create-project --prefer-dist laravel/laravel %1 "5.2.*"

※ laravelx.bat だとすると、laravelx プロジェクト名 で実行できます

それ以降は、一般的な情報通りに、プロジェクトディレクトリでコマンドプロンプトを開いて、以下のコマンドを実行します。
php artisan serve
※ Larvel のインストールされたバージョンの確認は、php artisan -V で確認 ※ Composer のインストールで、PHP のディレクトリが検索パスに追加されています Larvel 5.2 のドキュメントでは、php artisan serve の記述がなくなっていますが、5.3 では復活しています。5.3 では、Homestead も使えますよと一行だけ書かれていますが、Homestead が主流にはなりえなかったのでしょう。 関連する記事 Laravel を試す為に Windows に Composer をインストール
タグ:PHP Laravel
posted by lightbox at 2017-05-19 09:34 | PHP + WEBアプリ | このブログの読者になる | 更新情報をチェックする

2017年05月09日


Laravel を試す為に Windows に Composer をインストール

Composer をインストールする

ちゃんと、『プログラムと機能』に登録されるのをインストール後に確認して下さい。



ダウンロード

ダウンロードは、Dependency Manager for PHP からダウンロードボタンをクリックして Composer-Setup.exe よりダウンロードします。



インストール事前チェック

インストーラを実行前に、php の場所を確認して、php.ini の extension=php_openssl.dll を有効にしておいてください。





インストール後チェック

インストール終了すると、システム用パス環境変数の最後にインストール場所が追加されているので確認して下さい。(後々の都合上、php のパスも登録されるので、既に登録している場合はどちらかを削除するといいです)

ユーザのほうにも登録されますが、vendor\bin というフォルダは最初は存在しません。しかし、Conposer でインストールした Laravel がここにインストールされる予定(最新版しかここには登録できないようなので、Laravel のインストールは毎回 Conposer を使うしかありません)です。

※ pathx コマンドはこちらを参照して下さい



C:\ProgramData\ComposerSetup\bin にインストールされ、composer.bat と composer.phar と composer という3つのファイルが保存され、composer.bat が windows から呼び出されます。

最終確認

コマンドプロンプトを開いて、composer と入力して以下のようになれば OK です



関連する記事

Windows で Laravel を試す際、PHP の Windows バージョンが 5.6.30 なので、Larvel 5.2 をインストールします




タグ:PHP Laravel Conposer
posted by lightbox at 2017-05-09 21:50 | PHP + WEBアプリ | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり