Google Chromeを開いたら「Ctrl」「Shift」「Delete」を同時に押して「閲覧履歴データの削除」を開き削除します。
それだけのこと
投稿者: hashimoto
Ajax Load More(Repeater Templates)
URLをカスタムフィールドとして取り出す場合の例
2行名のURL部分がカスタムフィールドのケース
<li class="load_more_box"> <a href="<?php $hoge = get_post_meta(get_the_ID(),'url',true); echo $hoge;?>" target="_brank"> <h3 class="load_more_img"><?php if ( has_post_thumbnail() ) { the_post_thumbnail('large'); }?></h3> <h4><?php the_title(); ?></h4> </a> </li>
<li class="load_more_box"> <?php $hoge = get_post_meta(get_the_ID(),'url',true); if($hoge != ''){ echo '<a href="'.$hoge.'" target="_brank">'; } ?> <h3 class="load_more_img"><?php if ( has_post_thumbnail() ) { the_post_thumbnail('large'); }?></h3> <h4><?php the_title(); ?></h4> <?php $hoge = get_post_meta(get_the_ID(),'url',true); if($hoge != ''){ echo '</a>'; } ?> </li>
Ajax Load More でカテゴリを指定する
Ajax Load More
Shortcode Builder
↓
Query Parameters
上から3つ目くらいに「Category」欄がある
スマホで横スクロール(はみだし)の対処法
スマホで横スクロールが発生してしまうときの対策
html * { box-sizing: border-box; }
CSSでエフェクトをかける
transition: all 0.1s;
「CSSの変更が反映されない」の予防策
通常であれば「右クリック→ソースの表示→CSSリンクをクリックして再読み込み」
web制作中に何度もやらなければならないのはうっとうしい
解決策
<link rel='stylesheet' href='./style.css?t=<?php echo $_SERVER['REQUEST_TIME']; ?>' type='text/css' media='all' />
cssファイル名にGET変数としてUNIX時刻を付加することで、秒単位で別ファイルとして読み込まれるので、変更更新が随時反映される。
PDOで直前に登録したAI(Auto Increment)の値を得る
$last_id = $pdo->lastInsertId(); echo $last_id;
複数の端末からの同時アクセスがあっても、自分が直前にINSERTしたAI(Auto Increment)の値を取得できる。
重複INSERTの防止等に利用する。
WordPressのカテゴリタイトルから「カテゴリー:」を消す
WordPressのカテゴリページやタグページのタイトルには、タイトルの頭に「カテゴリー:」や「タグ:」
functions.php に下記を追記
add_filter( 'get_the_archive_title', function ($title) { if ( is_category() ) { $title = single_cat_title( '', false ); } elseif ( is_tag() ) { $title = single_tag_title( '', false ); } elseif ( is_author() ) { $title = '' . get_the_author() . '' ; } return $title; });
MySQL8 でベースにする文字コードはutf8mb4_unicode_ci
照合順序(COLLATION)とは
照合順序は文字列の比較やソート順のルールのことです。各キャラクタセットごとに照合順序が定義されています。
-- SHOW COLLATIONS で一覧が見れる mysql> SHOW COLLATIONS; +----------------------------+----------+-----+---------+----------+---------+---------------+ | Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | +----------------------------+----------+-----+---------+----------+---------+---------------+ | armscii8_bin | armscii8 | 64 | | Yes | 1 | PAD SPACE | | armscii8_general_ci | armscii8 | 32 | Yes | Yes | 1 | PAD SPACE | | ascii_bin | ascii | 65 | | Yes | 1 | PAD SPACE | | ascii_general_ci | ascii | 11 | Yes | Yes | 1 | PAD SPACE | | big5_bin | big5 | 84 | | Yes | 1 | PAD SPACE | | big5_chinese_ci | big5 | 1 | Yes | Yes | 1 | PAD SPACE | | binary | binary | 63 | Yes | Yes | 1 | NO PAD | <snip>
MySQL 8.0 で、utf8mb4 の照合順序が増えました。以下の表で太字にしたものが、新規に追加されたものです。各文字列が、同一と扱われる場合は、○としています。
ci/cs
は Case [In]sensitive
の略で、as
は Acent Sensiteve
、ks
は Katakana Sensitive
の略です。
COLLATION | A、a | はは、ぱぱ | はは、ハハ | びょういん、びよういん | 🍣、🍺 | +、+ |
---|---|---|---|---|---|---|
utf8mb4_bin | × | × | × | × | × | × |
utf8mb4_0900_bin | × | × | × | × | × | × |
utf8mb4_unicode_ci | ○ | ○ | ○ | ○ | ○ | ○ |
utf8mb4_general_ci | ○ | × | × | × | ○ | × |
utf8mb4_unicode_520_ci | ○ | ○ | ○ | ○ | × | ○ |
utf8mb4_0900_ai_ci | ○ | ○ | ○ | ○ | × | ○ |
utf8mb4_0900_as_ci | ○ | × | ○ | ○ | × | ○ |
utf8mb4_ja_0900_as_cs | × | × | ○ | × | × | ○ |
utf8mb4_ja_0900_as_cs_ks | × | × | × | × | × | ○ |
アルファベットの大文字・小文字を区別しない要件で、どれが選ばれそうか・・・
utf8mb4_0900_as_ci
は「びょういん」「びよういん」が同一と扱われてしまい、いまいちに感じます。
そもそも、日本語の文字列比較やソート結果を網羅的に精査するのは現実的に可能なんでしょうか(上記の表以外にも考えないといけない、パターンがありそうです)。日本語には異字体・長音記号・漢数字・・・ちょっと思いつくだけでも、扱いに悩みそうな要素が多くあります。
絵文字が区別できないとは言え、utf8mb4_general_ci
にはずっと使ってきた実績と安心があります。
MySQL 8.0 でも utf8mb4_general_ci
を 引き続き使うケースが多いのではないでしょうか。
MySQL 8.0 で utf8mb4_general_ci を使うときの注意点
ALTER TABLE CONVERT TO 時に COLLATION の指定が必要
MySQL 8.0 で utf8mb4 のデフォルトの照合順序が utf8mb4_general_ci
から utf8mb4_0900_as_ci
に変更になりました。
あわせて、従来の3バイトUTF8、utf8(mb3) は deprecated になっています。
utf8mb4 に変換するときに COLLATE
を明示的に指定しないと、utf8_general_ci
から utf8mb4_0900_ai_ci
へとテーブルのデフォルト照合順序になってしまいます。
mysql> SELECT * FROM utf8t WHERE c1 = "ぱぱ"; Empty set (0.00 sec) mysql> ALTER TABLE utf8t CONVERT TO CHARACTER SET 'utf8mb4'; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 -- 「ぱぱ」で「はは」がヒットしてしまう mysql> SELECT * FROM utf8t WHERE c1 = "ぱぱ"; +----+--------+ | pk | c1 | +----+--------+ | 1 | はは | +----+--------+ 1 row in set (0.00 sec) mysql> SHOW CREATE TABLE utf8t \G *************************** 1. row *************************** Table: utf8t Create Table: CREATE TABLE `utf8t` ( `pk` bigint unsigned NOT NULL AUTO_INCREMENT, `c1` varchar(255) DEFAULT NULL, UNIQUE KEY `pk` (`pk`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec)
このように、COLLATE
を指定してALTERする必要があります。
mysql> ALTER TABLE utf8t CONVERT TO CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW CREATE TABLE utf8t \G *************************** 1. row *************************** Table: utf8t Create Table: CREATE TABLE `utf8t` ( `pk` bigint unsigned NOT NULL AUTO_INCREMENT, `c1` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, UNIQUE KEY `pk` (`pk`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci 1 row in set (0.00 sec)
SET NAMES では COLLATE の指定が必要
同様に、SET NAMES
で照合順序を明示的に指定していない場合、MySQL 8.0 からは utf8mb4_0900_as_ci
が使われてしまいます。
# MySQL 8.0 以降は utf8mb4_0900_as_ci が使われる mysql> SET NAMES utf8mb4; # MySQL 8.0 以降は 明示的に utf8mb4_general_ci を指定する必要がある。 mysql> SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;
Seek wisdom, not knowledge. Knowledge is of the past, Wisdom is of the future.
知恵を探せ、知識ではない。
知識は過去だ。
知恵は未来だ。
ラムビー族
Seek wisdom, not knowledge. Knowledge is of the past, Wisdom is of the future.
Basic認証用からログアウトする方法
Basic認証用でログイン中のURLで、ファイル名だけを存在しないURLにしてアクセスする
「Unauthorized」が表示されログアウト成功!
.htaccess は下記のように書く
AuthType Basic AuthName "Input your ID and Password." AuthUserFile /home/www/.htpasswd require valid-user <IfModule mod_headers.c> <IfModule mod_rewrite.c> <Files logout.php> RewriteEngine on RewriteRule '' '' [R=401,L] </Files> </IfModule> </IfModule>
一つ問題がありWordpressの場合は、Wordpressの404が表示されてしまいログアウトできない
ディレクトリを作り、そのディレクトリ配下の存在しないファイルにアクセスすることでログアウトできる。
Mac のショートカット
フォルダ、ファイルのpathをコピー
command + option + c
右クリック → command → ”◯◯”のパスをコピー
隠しファイルを表示
「command」+「shift」+「.」
wordpress の URL関連変数
1.URLの記載方法(HTML、リンク) Wordpressの場合 手打ちの固定URLではなく、Wordpress変数で書くことが基本 誤り例) https://okusuri24.net/login/ 正解例) <?php echo site_url(); ?>/login/ (Wordpressテンプレートの基礎です) 2.URLの記載方法(HTML、Themeディレクトリ配下の”ファイル・画像”のURL) 誤り例) https://okusuri24.net/wp-content/themes/hueman-child/image/icn_4arrow.png 正解例) <?php echo get_parent_theme_file_uri(); ?>/image/icn_4arrow.png (Wordpressテンプレートの基礎です) 3.URLの記載方法(CSS、画像URL) CSSに記載するURLは、「CSSファイルからの相対Pathで記載する」 誤り例) https://okusuri24.net/wp-content/themes/hueman-child/image/icn_4arrow.png 正解例) ./image/icn_4arrow.png (一般CSSの基礎です) いずれも、とりあえずは動きますが、Wordpressの基本機能を潰す行為になり、後々困るので
記事(投稿)のカテゴリIDを取得する
WordPressで記事(投稿)のカテゴリIDを取得する
$category = get_the_category(); $cat_id = $category[0]->cat_ID; echo $cat_id;
WordPress、ショートコードでPHPファイルを読み込む
下記のように、Themeディレクトリの functions.php 末尾に追記する
function shortcode_include_php(){ ob_start(); include(STYLESHEETPATH . "/php/index.php"); return ob_get_clean(); } add_shortcode('include_php', 'shortcode_include_php');
表示したい投稿や固定ページに [include_php] と書けば読み込まれる
Macから受け取った圧縮ファイルが文字化け
Macから受け取った圧縮ファイルが文字化け
以前はMac使いとして、最初に覚えること、できないとパソコン使えないのか? と思われてしまうことでしたが
最近は、文字化けあフィルを送ることが平気な「プロのつもり人間」が多いです
そんなことに、文句を言って、文字化けしないMacの使い方を教えるくらいなら
こちらで対処しようということです
# apt install unar # unar [ファイル名]
ファイル権限(オーナー、www-data)の変更
www-data などで権限を変更したい場合
wordpress が吐き出す .htaccess でよく利用する
# chmod -R 777 ./○○○/* # 62 chmod g+w -R ./○○○/*
※ 末尾の「*(アスタリスク、ワイルドカード)」は隠しファイル(.htaccess)には効かないので、ファイル名を叩くor 「.*」とすると有効
Ubuntuでファイルマネージャを変更する
Ubuntuのデフォルトのファイルマネージャーは Nautilus だ。少々不便である。
Nemoをインストールしてデフォルトのファイルマネージャにすると、作業がしやすくなる。
VirtualHost の設定
ubuntu18 の apache2.4 で バーチャルホストの設定例
/etc/apache2/site-acailable/00-deefault.conf に書くとOKらしい
記載例
<VirtualHost *:80> ServerName ○○○.localhost DocumentRoot /home/hashimoto/www/○○○ </VirtualHost>
※”DocumentRoot” は任意で自分のサーバーに準じてね!
You don’t have permission to access this resource. apache2.conf の書き方
ubuntu18 の apache2.4 で下記のようなエラーが出た場合の対処方法
Forbidden
You don’t have permission to access this resource.
DOCUMENTS_ROOT の設定に問題あり
/etc/apache2/apache2.conf
のDOCUMENTS_ROOT
/etc/apache2/site-acailable/00-deefault.conf
の VirtualHost に ドキュメントルートの内容を書く
↑これって、気付き難いよね!
両方のファイルのを書き換えてから apache の再起動で治った
ファイル、フォルダを管理者権限(root)で開く
# sudo nautilus /root
POST,GETで表示がエラーになる
WordPress の場合、予約変数とかぶるとエラーになる
代表的な予約言
- author
- calendar
- cat
- category
- customized
- day
- fields
- hour
- minute
- more
- name
- order
- page
- post
- preview
- search
- second
- year
Unknown collation: ‘utf8mb4_unicode_520_ci’
原因は移行先サーバーのMySQLがMySQL5.5以下であるためです。例えば某Sサーバーなど..。utf8mb4_unicode_520_ciというcollationはMySQL5.6以上でしか利用できません。
現行のWordPressはutf8mb4_unicode_520_ciが使用できるサーバーではutf8mb4_unicode_520_ciを優先的に使用してインストールを行います。charsetとcollationを決定するwp-db.phpのコードは以下のようになっています。
/** * Determines the best charset and collation to use given a charset and collation. * * For example, when able, utf8mb4 should be used instead of utf8. * * @since 4.6.0 * @access public * * @param string $charset The character set to check. * @param string $collate The collation to check. * @return array The most appropriate character set and collation to use. */ public function determine_charset( $charset, $collate ) { if ( ( $this->use_mysqli && ! ( $this->dbh instanceof mysqli ) ) || empty( $this->dbh ) ) { return compact( 'charset', 'collate' ); } if ( 'utf8' === $charset && $this->has_cap( 'utf8mb4' ) ) { $charset = 'utf8mb4'; } if ( 'utf8mb4' === $charset && ! $this->has_cap( 'utf8mb4' ) ) { $charset = 'utf8'; $collate = str_replace( 'utf8mb4_', 'utf8_', $collate ); } if ( 'utf8mb4' === $charset ) { // _general_ is outdated, so we can upgrade it to _unicode_, instead. if ( ! $collate || 'utf8_general_ci' === $collate ) { $collate = 'utf8mb4_unicode_ci'; } else { $collate = str_replace( 'utf8_', 'utf8mb4_', $collate ); } } // _unicode_520_ is a better collation, we should use that when it's available. if ( $this->has_cap( 'utf8mb4_520' ) && 'utf8mb4_unicode_ci' === $collate ) { $collate = 'utf8mb4_unicode_520_ci'; } return compact( 'charset', 'collate' ); }
対策・解決方法
インポートするSQLファイルをエディタで開き、以下のように置き換えます。
utf8mb4_unicode_520_ci → utf8_general_ci
utf8mb4 → utf8
[参考]
chromeが落ちる、音が出ない
最近chromeが突然落ちたり、Youtubeの音が出なくなったらり
O.S.はUbuntu(Debian系Linux)なのだ
いろいろ試して、やっと原因に辿り着いた
解決方法を調査した結果,試験運用中のQUICというプロトコルを使用していることが原因であることが分かりました.
ということで chromeの検索バーに「chrome://flags」と入力し,設定欄の「試験運用版のQUICプロトコル」を無効にします.
これで解決した。
——————
その2
cheromeでyoutubeを立ち上げる
Firefoxでchromeを立ち上あげる
firefoxを閉じる
chromeを再起動
OKだった
カスタムフィールドの住所からGoogleMAPを表示する
カスタムフィールドの住所からGoogleMAPを表示する
<iframe src="https://maps.google.co.jp/maps?output=embed&q=<?php echo get_post_meta($post->ID , 'フィールド名' ,true); ?>&z=14" width="1000" height="600" frameborder="0" scrolling="no" ></iframe>
カスタムフィールドの値を表示する(チェックボックス、複数選択)
カスタムフィールドでチュエックボックス(複数選択)の値を表示する。
<?php $colors = get_field('detail_lable'); if ($colors): ?> <ul> <?php foreach ($colors as $color) : ?> <?php echo $color; ?> / <?php endforeach; ?> </ul> <?php endif; ?>
カスタムフィールドの値を表示する(繰り返しフィールド、画像)
カスタムフィールドの値を表示する
繰り返しフィールドで、画像の場合
<?php $rows = get_field('フィールド名' ); for($i = 0; $rows[$i] != ''; $i ++){ $row = $rows[$i]; $image = $row['サブフィールド名']; // echo '<pre>'; // var_dump($image); // echo '</pre>'; echo '<div style="margin-top:20px;">'.$image[title].'<div>'; echo '<img src="'.$image[url].'" alt="'.$image[title].'" />'; } ?>
wordpress の変数を PHP に渡すいろいろ
wordpress で何かを表示する情報は多いのですが
PHP変数に渡すというのは、情報が少ないので、ここにまとめていこうと思う
ID(post_ID、記事ID)
<?php $post_id = get_the_ID(); ?>
タイトル
<?php $car_name = the_title('', '', false); ?>
wordpressの管理画面にページを増やす
wordpressの管理画面に「ページ、メニュー」を増やす方法
1つだけ増やす例は沢山公開されているが、複数の場合は下記のように書く
function.php の最後に書きます。
// ページの追加 add_action( 'admin_menu', 'register_my_custom_menu_page' ); function register_my_custom_menu_page() { add_menu_page('管理画面の使い方', '予約管理', 'manage_options', 'yoyaku', 'add_manual_page', 'dashicons-welcome-learn-more', 3); add_menu_page('顧客管理の使い方', '顧客管理', 'manage_options', 'customer', 'add_manual_page2', 'dashicons-welcome-learn-more', 3); } // ページの中身のHTML function add_manual_page() { include('../yoyakukanri.php'); } function add_manual_page2() { include('../customer.php'); }
wordpressで「ログイン状態を保存する」が解除されてしまう
使っている theme の function.php に、下記のコードを追記することで
ログイン状態を維持できるようになる
function wplogin_rememberme_checked() {?> <script src="//code.jquery.com/jquery-1.11.1.js"></script> <script> $(document).ready(function(){ $('#rememberme').prop('checked', true); }); </script> <?php } add_action( 'login_enqueue_scripts', 'wplogin_rememberme_checked' );
WordPressでカテゴリ毎に公開・非公開を変更
<?php include ('./wp-config.php'); $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD); // 該当カテゴリのPOST_IDの配列を生成 $post_id_array = array(); $sql = "SELECT * FROM `mint_term_relationships` WHERE `term_taxonomy_id` = '2'"; // カテゴリIDを指定 foreach($pdo->query($sql) as $item) { array_push($post_id_array, $item[object_id]); } var_dump($post_id_array); // 公開フラグを変更する for($i = 0; $post_id_array[$i] != ''; $i ++){ // 公開 // $sql = "UPDATE `mint_posts` SET `post_status` = 'publish', `comment_status` = 'open', `ping_status` = 'open' WHERE `ID` = '$post_id_array[$i]'"; // 非公開 $sql = "UPDATE `mint_posts` SET `post_status` = 'inherit', `comment_status` = 'closed', `ping_status` = 'closed' WHERE `ID` = '$post_id_array[$i]'"; $statement = $pdo->query($sql); } ?>
特定の位置まで来たらイベントを実行
submit の代わりに aタグを使う
submit の代わりに aタグ、リンクタグを使う。
<a href="javascript:void(0)" onclick="document.formB.submit();return false;">TEXT</a>
「formB」はForm名と同じことに注意
SmartyのテンプレートにCSSを書きたい
CSSのかぎかっこ{}がテンプレートではエラーになる
{literal} {/literal} で囲えば回避できる
css レスポンシブ、背景画像とコンテンツをアスペクト比を保持したまま画面幅に追従する
font-size: 16vw;
width: 50vw;
height: 100vh;
% の代わりに vh,vw を使うと、テキストサイズなども追従するので便利
使い方のコツ
width には vw
height には vh
ということではない
vw 画面幅の何%か?
vh 画面高さの何%か?
ということなので
width にも height にも margin にも vh で指定すれば、アスペクト比(縦横比)を保持できる
指定カテゴリの記事一覧、アイキャッチ有り
<?php $cat = 'カテゴリスラッグ'; $num = '5'; global $post; $term_id = get_category_by_slug($cat)->term_id; $myposts = get_posts('numberposts=' .$num. '&category_name=' .$cat); if ($myposts) { foreach($myposts as $post): setup_postdata($post); echo '<li><div class="blog_thumb"><a href=' .get_permalink(). '>'; if ( has_post_thumbnail() ) { echo ''.get_the_post_thumbnail($page->ID, 'thumbnail'). ''; } else { echo '<span class="no_image"><i class="fa fa-ban fa-2x" aria-hidden="true"></i> No images</span>'; } echo '</a></div><div class="blog_data">'; echo '<div class="blog_date">' .get_the_time('Y/n/j').'</div>'; echo '<div class="blog_tit"><a href='.get_permalink().'>'. the_title("","",false).'</a></div>'; echo '<div class="blog_content">' .mb_substr( strip_tags( $post -> post_content ), 0, 100 ). '...</div></div></li>'; endforeach; echo '</ul><p><a href=' .get_category_link($term_id). '>カテゴリの一覧 ≫</a></p>'; } else { echo '<p>記事がありません。</p>'; } ?>
google 削除
ご連絡いただきありがとうございます。ご報告いただいた情報はページ自体から削除するか、そのページをウェブから削除する必要があります。Google が削除することはできませんが、ウェブマスターやサイト所有者に削除を依頼していただくことはできます。Google からウェブマスターにこのページをウェブから削除するよう依頼することはできませんのでご了承ください。ページの削除を希望する場合は、こちらに記載されている手順で Google からのキャッシュ ページの削除をリクエストできます。
Strict Standards エラーを非表示にできない EC-CUBE2.4系
configファイルで ’error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);’と書いても効果なしでした。
/data/class/SC_Initial.php
102行目付近
function setErrorReporting() { error_reporting(E_ALL & ~E_NOTICE); }
ここを書き換えたら Strict Standards エラー が非表示になった。
function setErrorReporting() { error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT); }
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE);
Gimpでグリットのサイズを変更する。
Gimpでグリットのサイズを変更しても反映せれない。
原因調査の結果
編集 > 設定 > グリットのサイズ変更
これでは反映されない
画像 > グリッドの設定
これだとリアルタイムで反映される
達人プログラマーになるには?
大規模システムを一人で組む機会が多く、毎回思うことがある。 ソースコードをロス無く最小限の文字数で描き、後から見て分かりやすい、動作も軽快。 結果として、短時間で描き上げることができる。
これらは個別の事のように見えますが、全てつながっていて、どれか一つが劣っても「良いプログラム」とはいえません。
そのために、日頃から心がけていることが2つあります。一つは ”ソースコードを日本語で描く” 二つ目は ”自分の愚かさを記録する” ということです。 この二つを心がければ、誰でもプログラムが上手に描けるようになります。
まずはじめに ”ソースコードを日本語で描く” についてお話します。 クライアントや元請けさんから頂く仕様書を見て、毎回感じること。 解りにくい! 何を伝えたいのか不明瞭! 主語が抜けている! 意味を取り違えた専門用語! それが普通の人なんだなって思う。
「意味を取り違えた専門用語!」ってチョー恥ずかしいことですが、けっこう皆さんやってます。 特にディレクションとか専門にしている ”制作しない制作会社” に多いですね〜。 多いというかほぼ全員ですけどね。 そういう人たちが、専門用語を間違った意味で普及しているってのが現実ですかね。
話がそれましたので本題にもどります。 頂いた仕様書は、取り消し線、下線、太文字、色文字、追記、などをフルに活用して、分かりやすい仕様書に仕上げます。 次に、仕様書の項目ごとに、ソースコードを書くのですが、コンピュータ語ではなく、日本語で書きます。 オープンソースのカスタマイズの例をご覧ください。
どのファイルの何行目を編集・追記すればいいか? その場所をどうやって見つけたのか?
具体的に、最小限の文字で、解りやすく、書く それだけなんですが、これが描ければ、プログラムは8割がた完成したようなものです。
上の例を見て、お気づきの方、いらっしゃいますか? これね〜。 数学の試験問題みたいでしょ。 問題が解りやすいと、答えは容易なんです。 プログラムが上手でない人は、この「ソースコードを日本語で描く」という作業をせず、いきなりソースコードを書こうとしているんですね。 あなたは天才ですか?って感じ! だからいつまでたっても上達しない。
「ソースコードを日本語で描く」の意味はこんな感じです。 ご理解いただけたでしょうか?
では、次に「自分の愚かさを記録する」について話してみます。 作業中つまずいたこと、新たに覚えたこと、面倒だと思ったこと、をブログに書いていきます。 ただそれだけです。 そのメリットは大きいです。その後の作業がどんどん早くなります。
理由は、つまずいた時、検索をかけると、自分の過去のミスが出てきます。 脳の無限ループに陥ること無く、瞬時に解決できます。 「自分の愚かさを記録」したサンプルは、お気づきの方もいるかも知れませんが、このサイトそのものです。
ということで、この文章は終わりのタイミングで、達人プログラマになるために大切なこと、もう一つありました。 「知識ではなく、知恵を求めよ。知識は過去の産物だが、知恵は未来をもたらす。」ラムビー族(インディアン)の格言ですね。 プログラマーにはピッタリの言葉なんです。
なぜかというと、自分の知識に執着してハマること多し。 昨日覚えたソースコードや関数、今日描いたら動かないなんてこと日常茶飯事です。 原因はサーバーの仕様がことなっていたり、プログラム言語モジュールがアップデートされたりで、昨日の常識は、今日には通用しないんです。
知識か?知恵か?を理解し 「自分の愚かさを記録」して 自分が原因の、脳の無限ループにはまらないこと。 とても大切です。 ハマりが多いと、メンタル病みますからね〜。 プログラマが体調不良で退社するって、まさにこれなんです。
”ソースコードを日本語で描く” ”自分の愚かさを記録する”
この2つを心がければ、かならず達人プログラマになれるでしょう。
form に複数ボタンで 異る処理をする(その1)
標準的なformボタン
<form>
<input type='submit' value='送信'>
</form>
複数ボタンを設置
<form>
<input type='submit' name='action' value='送信'>
<input type='submit' name='action' value='下書き保存'>
</form>
ボタンごとに異る処理
if ($_POST['action'] == '送信') {
// 送信処理
} else if ($_POST['action'] == '下書き保存') {
// 保存処理
}
2018年以降のサーバーで、EC-CUBE2系を動かすには?
2016〜2018年頃、レンタルサーバーでPHPやSQLのバージョンアップにより
いろんなオープンソースが対応できなくなるケースが多発しています。
EC-CUBE2系の場合、症状は様々ですが
・サイトが表示されない
・インストールが完了できない
・その他
原因の一つとして
SET SESSION storage_engine = InnoDB の実行時に以下のエラーで実行できないケースがあります。
/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php の 末尾付近を編集します。
function initObjQuery(SC_Query &$objQuery) { // $objQuery->exec('SET SESSION storage_engine = InnoDB'); $objQuery->exec('SET SESSION default_storage_engine = InnoDB'); $objQuery->exec("SET SESSION sql_mode = 'ANSI'"); }
Smartyで開発中にキャッシュ問題を回避する
template_c を毎回削除は手間がかかるので
毎回強制的にコンパイルさせます。
方法は Smarty.class.php を編集します。
場所は環境によって異なりますが今回は下記のディレクトリにありました。
/app/framework/lib/Smarty/libs/Smarty.class.php
361行目付近
$force_compile = false;
true にすればOKです。
公式サイトに書いてあります。
https://www.smarty.net/docsv2/ja/variable.force.compile.tpl
EC-CUBE3で設置URLから”/html/”をなくす
EC-CUBE3で設置URLから”/html/”をなくす以外にも、設置URLを変更する場合の方法です。
これで「html/」にアクセスするとデフォルトテンプレートでサイトが展開されているわけですが、やはり気になってしまうのはURLにどうしても「html」が入ってしまうことだと思います。
ファイルの移動
./html/ 配下のファイルを全て、一つ上の階層に移動します。
※ フォルダは移動しない。
「index.php」と「.htaccess」は上書きしてOKです。
ファイルの修正
index.php
Before require __DIR__.’/../autoload.php’;
After require __DIR__.’/autoload.php’;
index_dev.php
require_once __DIR__.’/../vendor/autoload.php’;
$config_dev_file = __DIR__.’/../app/config/eccube/config_dev.yml’;
‘profiler.cache_dir’ => __DIR__.’/../app/cache/profiler’,
この3箇所を同じように「/../」→「/」としておきます。
app/config/eccube/path.yml
root_urlpath の「html」を消す。
以上で完了です。
対処方法 「APC 拡張モジュールが有効になっていません。」
APCモジュールをインストール。
# apt-get install php-apc
有効化。
# php5enmod mcrypt
apache再起動。
対処方法 「mcrypt 拡張モジュールが有効になっていません。」
EC-CUBE その他のPHPシステム等で 「mcrypt 拡張モジュールが有効になっていません。」とエラー表示されることがある。
対処方法
php.ini の”mcrypt”項目を編集する。
extension_dir = "usr/lib/php5/20121212/" extension=mcrypt.so
extension_dir は mcrypt.so を検索して見つける。
WordPressでpathやURLを取得するためのタグと出力例
関数 | 解説 | 出力 |
---|---|---|
ABSPATH | インストールされた場所のパス | C:\xampp\htdocs\xampp\example/(ローカルの場合) /var/www/html/example/(サーバの場合) |
admin_url() | 管理画面のパス | http://www.example.com/wp-admin/ |
content_url() | wp-contentディレクトリのパス | http://www.example.com/wp-content |
get_attachment_link( $id ) | 添付ファイルのIDを渡すと添付ページの URI を返す | http://www.example.com/?attachment_id=$id |
get_author_posts_url( $author ) | 投稿者別のアーカイブページへのリンク。投稿者名を入力する | http://www.example.com/?author=0 |
get_bloginfo( $show ) | デフォルトはnameでサイト名が返ってくる。変数による違いは以下の通り。 | http://localhost/xampp/example |
$show = ‘admin_email’ | admin@example.com | |
$show = ‘atom_url’ | http://www.example.com/home/feed/atom | |
$show = ‘charset’ | UTF-8 | |
$show = ‘comments_atom_url’ | http://www.example.com/home/comments/feed/atom | |
$show = ‘comments_rss2_url’ | http://www.example.com/home/comments/feed | |
$show = ‘description’ | Just another WordPress blog | |
$show = ‘home’ | http://www.example.com/home (DEPRECATED! use url option instead) | |
$show = ‘html_type’ | text/html | |
$show = ‘language’ | en-US | |
$show = ‘name’ | Testpilot | |
$show = ‘pingback_url’ | http://www.example.com/home/wp/xmlrpc.php | |
$show = ‘rdf_url’ | http://www.example.com/home/feed/rdf | |
$show = ‘rss2_url’ | http://www.example.com/home/feed | |
$show = ‘rss_url’ | http://www.example.com/home/feed/rss | |
$show = ‘siteurl’ | http://www.example.com/home (DEPRECATED! use url option instead) | |
$show = ‘stylesheet_directory’ | http://www.example.com/home/wp/wp-content/themes/largo | |
$show = ‘stylesheet_url’ | http://www.example.com/home/wp/wp-content/themes/largo/style.css | |
$show = ‘template_directory’ | http://www.example.com/home/wp/wp-content/themes/largo | |
$show = ‘template_url’ | http://www.example.com/home/wp/wp-content/themes/largo | |
$show = ‘text_direction’ | ltr | |
$show = ‘url’ | http://www.example.com/home | |
$show = ‘version’ | 3.5 | |
$show = ‘wpurl’ | http://www.example.com/home/wp | |
get_category_link( $id ) | カテゴリーアーカイブページヘのリンク | http://www.example.com/?cat=0 |
get_day_link( $year, $month, $day ) | 日別アーカイブページのリンク。デフォルトは現在の日。 | http://www.example.com/?m=20150313 |
get_edit_user_link( $user_id ) | ユーザー情報編集画面用のパス | http://www.example.com/wp-admin/profile.php |
get_feed_link() | FeedのURLを取得 | http://www.example.com/?feed=rss2 |
get_month_link( $year, $month ) td> | 年別アーカイブページのリンク。デフォルトは現在の年度。 | http://www.example.com/?m=201503 |
get_page_link( $id ) | 固定ページのパーマリンクを取得 | http://www.example.com/?page_id=$id |
get_permalink( $id ) | $idを入力するとURLのスラッグを返す。パーマリンク設定によって異なる | http://www.example.com/?p=$id |
get_post_type_archive_link( $posttype ) | カスタム投稿タイプのアーカイブページを返す。get_post_type_archive_link( get_post_type() )など | http://www.example.com/$posttype |
get_stylesheet() | 現在適用されているテーマ(スタイルシート)のディレクトリ | twentyten-child |
get_stylesheet_directory() | 現在適用されているテーマ(スタイルシート)のディレクトリ | /var/www/html/example/wp-content/themes/twentyten-child |
get_stylesheet_directory_uri() | 現在適用されているテーマをURI表記で返す | http://www.example.com/wp-content/themes/twentyten-child |
get_stylesheet_uri() | 現在適用されているテーマ(スタイルシート)のパス | /var/www/html/example/wp-content/themes/twentyten-child/style.css |
get_tag_link( $id ) | タグアーカイブページヘのリンク。IDで指定してスラッグで返ってくる。 | http://www.example.com/?tag=wordpress |
get_template_directory() | 親テーマのディレクトリ | /var/www/html/example/wp-content/themes/twentyten |
get_template_directory_uri() | 親テーマのURI | http://www.example.com/wp-content/themes/twentyten |
get_term_link( $id ) | カスタム分類アーカイブページヘのリンク。タクソノミーが無いとWP_Error Objectを返す | http://www.example.com/custom-taxonomy |
get_theme_root() | テーマのディレクトリ | /var/www/html/example/wp-content/themes |
get_theme_root_uri() | 親テーマのディレクトリ | http://www.example.com/wp-content/themes |
get_year_link( $year ) | 年別アーカイブページのリンク。デフォルトは現在の年度。 | http://www.example.com/?m=2015 |
home_url( $path, $scheme ) | $pathにはホームURLからの相対パス。$schemeはhttpかhttpsもしくはrelative(相対パス) | http://www.example.com/$path |
includes_url() | wp-includesのディレクトリを返す | http://www.example.com/wp-includes/ |
plugin_dir_path( __FILE__ ) | 現在のファイルのディレクトリを返す。pluginファイルに書けばプラグインのパスを返すが、必ずしもpluginのディレクトリを返すとは限らない | /var/www/html/example/wp-content\themes\twentyten-child/ |
plugins_url() | プラグインディレクトのパス | http://www.example.com/wp-content/plugins |
site_url() | サイトのアドレスを表示。スラッシュは付かない | http://localhost/xampp/example |
the_permalink() | 現在のページのパス | http://www.example.com/ |
WP_CONTENT_DIR | wp-contentディレクトリのパス | /var/www/html/example/wp-content |
wp_get_shortlink( $id ) | 短縮URL、ショートリンクを表示する。パーマリンク設定で長いスラッグにしている場合に外部プログラムへ短いURLを渡したい場合などに使う | http://www.example.com/?p=$id |
WP_LANG_DIR | languagesディレクトリのパス | /var/www/html/example/wp-content/languages |
wp_login_url() | ログイン画面のパス | http://www.example.com/wp-login.php |
wp_logout_url() | ログアウト用のパス | http://www.example.com/wp-login.php?action=logout&_wpnonce=0000000000 |
wp_lostpassword_url() | ログアウト用のパス | http://www.example.com/wp-login.php?action=lostpassword |
WP_PLUGIN_DIR | プラグインディレクトのパス | /var/www/html/example/wp-content/plugins |
wp_registration_url() | ユーザー登録用のパス | http://www.example.com/wp-login.php?action=register |
wp_upload_dir($time) | アップロードディレクトリ URL。配列で返ってくる。$timeはデフォルトはnull。$time = ‘path‘ | /var/www/html/example/wp-content/uploads |
$time = ‘url‘ | http://www.example.com/wp-content/uploads | |
$time = ‘subdir‘ | ||
$time = ‘basedir‘ | /var/www/html/example/wp-content/uploads | |
$time = ‘baseurl‘ | http://www.example.com/wp-content/uploads | |
$time = ‘error‘ | bool(false) |
SQLight でSELECT できるが INSERT UPDATE 出来ない を回避した
***.db ファイルのパーミションは777 OK
SQLiteStudio からの INSERT はできる OK
PHP からのINSERET ができない
***.db ファイルがあるディレクトリのパーミッションが原因でした。
WordPressのリビジョン機能を停止する
WordPressのリビジョン機能は、編集するたびに、以前の状態を保存されます。
編集画面を開いていると、数分に一度、自動保存もされます。
1つの記事に対し、数十から数百に及ぶこともあり、データベースの肥大化、動作が重くなる原因となります。
リビジョン削除のプラグインもありますが、プラグインを増やすことも動作が重くなる要因なので
ソースコードで停止する方法です。
wp-config.php に次の一行を追記します。
define('WP_POST_REVISIONS', false);
※ ABSPATH よりも前に記載しないと効きません。
welcart の商品一覧の表示数を変える
[file] /wp-content/plugins/usc-e-shop/classes/itemList.class.php
$this->maxRow = 30;
welcart 商品の並び順をドラッグアンドドロップで変える
商品マスタ(商品一覧)のテンプレートファイル
/wp-content/plugins/usc-e-shop/includes/usces_item_master_list.php
詳細
/home/hashimoto/www/yoga-lien.com/wp-content/plugins/usc-e-shop/js にファイルを追加
jquery-1.8.0.min.js
jquery-ui.js
商品一覧のテンプレート(一覧大規模変更)
/home/hashimoto/www/yoga-lien.com/wp-content/plugins/usc-e-shop/includes/usces_item_master_list.php
// 並び替えページ
”usces_item_popup.php”を追加(新設)した。
”itemList.class.php” にてソート順を変更した
手法:$rows[L:410付近]の並び順を変えることで成功!
DB wp_posts.to_ping 型をtext → int に変更
// Heart-Lab Start //------------------------------------------------- /* echo '<pre>'; var_dump($rows); echo '</pre>';*/ // 商品IDのソート順 $id_array = array(); $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD); $sql = "SELECT * FROM `wp_posts` WHERE `post_mime_type` = 'item' AND `post_type` = 'post' AND `post_status` = 'publish' ORDER BY `to_ping` ASC"; foreach($pdo->query($sql) as $item) { // echo $item[ID].' -- '; array_push($id_array, $item[ID]); } // var_dump($id_array); // $rows の並び順を変える for($i = 0; $id_array[$i] != ''; $i ++){ for($a = 0; $rows[$a] != ''; $a ++){ if($id_array[$i] == $rows[$a][ID]){ $new_rows[$i][ID] = $rows[$a][ID]; $new_rows[$i][item_code] = $rows[$a][item_code]; $new_rows[$i][item_name] = $rows[$a][item_name]; } } } // echo '<pre>'; // var_dump($new_rows); // echo '</pre>'; $rows = $new_rows; // Heart-Lab END //-------------------------------------------------
”usces_item_popup.php”
<html lang="ja" class="no-js"><head><meta charset="UTF-8"> <!-- WR --> <style> a { color: gray; } .wr_menu li { display: inline-block; margin: 0 20px 30px 0; } .ns { display: block; float: left; border: 1px solid silver; width: 500px; height: 60px; background: white; overflow: hidden; margin: 0 0 5px 0; } .w100 { display: block; float: left; width: 80px; } .w200 { display: block; float: left; width: 300px; overflow: hidden; } #tablenavi { display: none; } </style> </head> <body> <?php error_reporting(E_ALL & ~E_NOTICE); $act1 = ''; $act2 = ''; $act3 = ''; if($_GET["wr"] == 'lesson'){ $act1 = ' style="color:red;font-weight: bold"'; }elseif($_GET[wr] == 'shopping'){ $act2 = ' style="color:red;font-weight: bold"'; }else{ $act3 = ' style="color:red;font-weight: bold"'; } echo '<div class="wr_menu">'; echo '<li><a href="?page=usces_itemedit&wr=all"'.$act3.'>All</a></li>'; echo '<li><a href="?page=usces_itemedit&wr=lesson"'.$act1.'>Lesson</a></li>'; echo '<li><a href="?page=usces_itemedit&wr=shopping"'.$act2.'>Shopping</a></li>'; echo '</div>'; ?> <script type="text/javascript"> <!-- function p_reload(){ var pwin=window.opener; pwin.location.reload(); pwin.focus(); window.close(); } //--> </script> <button type="button" onclick="p_reload()" style="float: right;">閉じる</button> <br><br> <form action="" method="post"> <input type="submit" id="submit" value="並び順を保存する" onClick="alert('並べ替え完了です')"/> <ul class="sortable"> <!-- WR --> <?php include("../../../../wp-config.php"); $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD); // 並べ替え if($_POST[result] != ''){ $sort_ids = explode(",", $_POST[result]); for($i = 0; $sort_ids[$i] != ''; $i ++){ if($_GET[wr] == 'shopping'){ $a = $i; }else{ $a = $i + 10000; } $sql = "UPDATE `wp_posts` SET `to_ping` = '$a' WHERE `ID` = '$sort_ids[$i]'"; $statement = $pdo->query($sql); } } $sql = "SELECT * FROM `wp_posts` WHERE `post_mime_type` = 'item' AND `post_type` = 'post' AND `post_status` = 'publish' ORDER BY `to_ping` ASC"; foreach($pdo->query($sql) as $item) { $print_flg = 0; if($_GET[wr] == 'shopping'){ $sql2 = "SELECT * FROM `wp_term_relationships` WHERE `object_id` = '$item[ID]' AND `term_taxonomy_id` = '5'"; $statement2 = $pdo->query($sql2); $item2 = $statement2->fetch(PDO::FETCH_ASSOC); if($item2[object_id] != ''){ $print_flg = 1; } } if($_GET[wr] == 'lesson'){ $sql2 = "SELECT * FROM `wp_term_relationships` WHERE `object_id` = '$item[ID]' AND `term_taxonomy_id` = '3'"; $statement2 = $pdo->query($sql2); $item2 = $statement2->fetch(PDO::FETCH_ASSOC); if($item2[object_id] != ''){ $print_flg = 1; } } if( ($_GET[wr] == '') || ($_GET[wr] == 'all') ) $print_flg = 1; if($print_flg == 1){ // 商品情報取得 $sql2 = "SELECT * FROM `wp_postmeta` WHERE `post_id` = '$item[ID]' AND `meta_key` = '_isku_'"; $statement2 = $pdo->query($sql2); $item2 = $statement2->fetch(PDO::FETCH_ASSOC); $hoge = explode(";", $item2[meta_value]); $wr_array = array(); for($i = 0; $hoge[$i] != ''; $i ++){ $hhh = explode('"', $hoge[$i]); // echo $i.'> '.$hhh[1].'<br>'; array_push($wr_array, $hhh[1]); } $ID = $item["ID"]; ///////idのようなモノ $code = $wr_array[1]; $price = number_format($wr_array[7]); $stock_num = number_format($wr_array[11]); // 在庫有無 if($stock_num == 0){ $stock_text = '<span style="color:red;">在庫切れ</span>'; }else{ $stock_text = '.'; } // 公開状態 if($item[post_status] == 'publish'){ $open_text = '公開'; }else{ $open_text = '<span style="color:red;">非公開</span>'; } // カテゴリ $sql3 = "SELECT * FROM `wp_term_relationships` WHERE `object_id` = '$ID' AND `term_taxonomy_id` != '2'"; $statement3 = $pdo->query($sql3); $item3 = $statement3->fetch(PDO::FETCH_ASSOC); $sql4 = "SELECT * FROM `wp_terms` WHERE `term_id` = '$item3[term_taxonomy_id]'"; $statement4 = $pdo->query($sql4); $item4 = $statement4->fetch(PDO::FETCH_ASSOC); $category = $item4[name]; // 画像 $sql2 = "SELECT * FROM `wp_postmeta` WHERE `post_id` = '$item[ID]' AND `meta_key` = '_thumbnail_id'"; $statement2 = $pdo->query($sql2); $item2 = $statement2->fetch(PDO::FETCH_ASSOC); $sql2 = "SELECT * FROM `wp_posts` WHERE `ID` = '$item2[meta_value]'"; $statement2 = $pdo->query($sql2); $item2 = $statement2->fetch(PDO::FETCH_ASSOC); $img = $item2[guid]; $post_name = $item2[post_title]; // url $sql2 = "SELECT * FROM `wp_options` WHERE `option_name` = 'siteurl'"; $statement2 = $pdo->query($sql2); $item2 = $statement2->fetch(PDO::FETCH_ASSOC); $http_url = $item1[option_value]; $item[post_title] = mb_strimwidth( $item[post_title], 0, 85, '…','UTF-8' ); echo '<li class="ns" id="'.$ID.'"> <div class="w100"><img src="'.$img.'" width="60" alt=" IMG"></div> <div class="w100">'.$ID.'</div> <div class="w200">'.$code.'<br>'.$item[post_title].'</div> <!-- <div class="w100">'.$price.'</div> <div class="w100">'.$stock_num.'</div> <div class="w100">'.$stock_text.'</div> <div class="w100">'.$category.'</div> <div class="w100">'.$open_text.'</div> --> </li><!-- ----リスト---- -->'; } } ?> <?php // url $sql2 = "SELECT * FROM `wp_options` WHERE `option_name` = 'siteurl'"; $statement2 = $pdo->query($sql2); $item2 = $statement2->fetch(PDO::FETCH_ASSOC); $http_url = $item2[option_value]; ?> <!-- WR --> </ul> <input type="hidden" id="result" name="result" /> </form> <script src="<?php echo $http_url; ?>/wp-content/plugins/usc-e-shop/js/jquery-1.8.0.min.js"></script> <script src="<?php echo $http_url; ?>/wp-content/plugins/usc-e-shop/js/jquery-ui.js"></script> <script> $(function() { $(".sortable").sortable(); $(".sortable").disableSelection(); $("#submit").click(function() { var result = $(".sortable").sortable("toArray"); $("#result").val(result); $("form").submit(); }); }); </script> <div style="clear:both;"></div> <!-- <pre> <?php var_dump($_POST); ?> </pre> --> <!-- WR -->
SQLite3 にPHPで接続する
シンプルに接続
// 基本接続 $dsn ="sqlite:yoga.db"; $pdo = new PDO($dsn); // SQL文処理 $sql = "select * from tb_shop"; $statement = $pdo->prepare($sql); $statement->execute();
ループ(レコード)読み込み
// 基本接続 $dsn ="sqlite:yoga.db"; $pdo = new PDO($dsn); // SQL文処理 $sql = "select * from tb_shop"; $rs = $pdo->prepare($sql); $rs -> execute(); foreach ($rs->fetchall() as $key => $value) { echo '<hr>'; var_dump($value); }
エラーチェックなどを行う場合
// SQLite3 に接続 $dsn ="sqlite:yoga.db"; $pdo = new PDO($dsn); $sqltext = "select * from tb_shop"; $sql = $pdo->prepare($sqltext); try{ if(!$sql->execute()){ echo "Failed(SQL文に問題あり)"; } foreach ($sql->fetchall() as $key => $value) { echo "$key:$value[0]<br/>\n"; } } catch(Exception $e){ echo "Failed:(システムエラー)".$e->getMessage(); }
welcart 商品順番をドラッグで変更する
Welcart の商品情報の取り出し方
商品名、説明などは、wp-posts に記録され、その他の情報は wp-postmeta に記録されています。
例)データベース
// 商品情報取得 $sql2 = "SELECT * FROM `wp_postmeta` WHERE `post_id` = '$item[ID]' AND `meta_key` = '_isku_'"; $statement2 = $pdo->query($sql2); $item2 = $statement2->fetch(PDO::FETCH_ASSOC); $hoge = explode(";", $item2[meta_value]); $wr_array = array(); for($i = 0; $hoge[$i] != ''; $i ++){ $hhh = explode('"', $hoge[$i]); // echo $i.'> '.$hhh[1].'<br>'; array_push($wr_array, $hhh[1]); }
上記のような方法で整形したデータ
0> code 1> L-20170926 2> name 3> 4> cprice 5> 6> price 7> 1500 8> unit 9> 10> stocknum 11> 8 12> stock 13> 0 14> gp 15> 0 16> sort 17> 0 18>
クラウドワークスのお問い合せ電話番号
CrawdWorks への サポート お問い合わせ 電話番号
03-6450-3088 は混んでいてつながらない
03-6450-2926(代表)へ電話すると、サポートからおりかえしてくれるらしい。
MySQL カラムのコメントを取得する
SQL文の半自動化に、さらなる進化がありました。
MySQLのカラムコメントを抽出することで
フォームの半自動化→7割自動化 を実現しました。
//構文設定 $stmt = $pdo->prepare('SHOW FULL columns FROM ' . wr_user); //実行 $stmt->execute(); $array_comment = array(); $i = 0; foreach($stmt->fetchAll() as $result): array_push($array_comment, $result['Comment']); $i ++; endforeach; var_dump($array_comment);
Thunderbird でgmailが 突然エラーになった
google アカウントの設定
ログインとセキュリティ → 接続済みのアプリとサイト → 安全性の低いアプリの許可: 有効
何度設定しても、無効になっていた。 有効が完全に反映されたらメールアクセスできるようになった
potision: absolute; と親要素の関係
potision: absolute; top: 0; left: 0;
これだけだと、画面全体の左上に配置されてしまいます。
親要素に’position: relative;’を指定すると、親要素の左上に表示されます。
画像をブロック(要素)に合わせてフィットさせる
object-fit: cover; object-position: 50% 0%;
object-position: 50%(横中央) 0%(縦上);
SQL文 を半自動で生成する
$statement = $pdo->query($sql); $item = $statement->fetch(PDO::FETCH_ASSOC); $i = 0; foreach($item as $key => $val){ if($i == 0){ $kanma = ''; }else{ $kanma = ','; } $key_text .= $kanma."`".$key."`"; $val_text .= $kanma."'".$_POST[$key]."'"; $i ++; } echo '<hr>'.$key_text.'<hr>'; echo $val_text.'<hr>'; $sql = "INSERT INTO `tb_staff` ($key_text) VALUES($val_text)"; echo $sql; $statement = $pdo->query($sql);
$pdo = new PDO('mysql:host = '.DB_SERVER.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD); $sql = "SELECT * FROM `wr_user` LIMIT 1"; $statement = $pdo->query($sql); $item = $statement->fetch(PDO::FETCH_ASSOC); $i = 0; foreach($item as $key => $val){ if($i == 0){ $kanma = ''; }else{ $kanma = ','; } $key_text .= $kanma."`".$key."`"; $val_text .= $kanma."'$".$key."'"; $i ++; } echo '<hr>'.$key_text.'<hr>'; echo $val_text.'<hr>'; $sql = "INSERT INTO `wr_user` ($key_text) VALUES($val_text)"; echo $sql;
$db = mysql_connect(DB_HOST.":".DB_PORT,DB_USER,DB_PASSWORD); // mysql_query("SET NAMES utf8"); mysql_set_charset('utf8'); mysql_select_db(DB_NAME, $db); $sql = "SELECT * FROM wr_posts LIMIT 1"; $rs = mysql_query($sql,$db); $item = mysql_fetch_assoc($rs); var_dump($item); $i = 0; foreach($item as $key => $val){ if($i == 0){ $kanma = ''; }else{ $kanma = ','; } $key_text .= $kanma."`".$key."`"; $val_text .= $kanma."'$".$key."'"; $i ++; } echo '<hr>'.$key_text.'<hr>'; echo $val_text.'<hr>';
自動生成の例
INSERT INTO `wr_user`
(`user_id`,`f1`,`f2`,`f3`)
VALUES
(‘exampleuser_id’,’examplef1′,’examplef2′,’examplef3′)
レスポンシブデザインのブレークポイントを考える
主な機種の画面サイズ
ブラウザ表示は下記のようになります。
320px iPhone
375px iPhone
360px Android
414px iPhone6 Plus
600px Nexus 7
768px iPad iPad mini Nexus9
800px Nexus10
PC用には、800px〜1000px、100px以上があればいい感じです。
全部のサイズに対応する必要はないので
360,600,800,1000,over あたりをブレイクポイントとする。
ec-cube3系のディレクトリ構成
Config
/app/config/eccube/path.yml
CSS,IMG
/html/template/default
Template
/src/Eccube/Resource/template/
EC-CUBE 旧バージョンのダウンロードサイト
WordPressでログインURLを変える
1) TOPディレクトリに「heart-lab-login.php」というファイルを作る。
内容は下の通り。
<?php define( 'ANYWHERE_LOGIN', sha1( 'keyword' ) ); require_once './wp-login.php'; ?>
2) テーマファイルのfunction.php に下記を追記する
define( 'ANYWHERE_LOGIN_PAGE', 'heart-lab-login.php' ); add_action( 'login_init', 'heart_lab_login_init' ); add_filter( 'site_url', 'heart_lab_login_site_url', 10, 4 ); add_filter( 'wp_redirect', 'heart_lab_login_wp_redirect', 10, 2 ); if ( ! function_exists( 'heart_lab_login_init' ) ) { function heart_lab_login_init() { if ( !defined( 'ANYWHERE_LOGIN' ) || sha1( 'keyword' ) != ANYWHERE_LOGIN ) { status_header( 403 ); exit; } } } if ( ! function_exists( 'heart_lab_login_site_url' ) ) { function heart_lab_login_site_url( $url, $path, $orig_scheme, $blog_id ) { if ( ( $path == 'wp-login.php' || preg_match( '/wp-login\.php\?action=\w+/', $path ) ) && ( is_user_logged_in() || strpos( $_SERVER['REQUEST_URI'], ANYWHERE_LOGIN_PAGE ) !== false ) ) $url = str_replace( 'wp-login.php', ANYWHERE_LOGIN_PAGE, $url ); return $url; } } if ( ! function_exists( 'heart_lab_login_wp_redirect' ) ) { function heart_lab_login_wp_redirect( $location, $status ) { if ( strpos( $_SERVER['REQUEST_URI'], ANYWHERE_LOGIN_PAGE ) !== false ) $location = str_replace( 'wp-login.php', ANYWHERE_LOGIN_PAGE, $location ); return $location; } }
3) その結果
「wp-admin」「wp-login.php」は403になるので安全です。
モーダルウィンドウの実装方法
<!DOCTYPE html> <html lang="ja-JP"> <meta charset="UTF-8"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> <script src="./js/modal-multi.js"></script> <style> .modal-content { width: 50% ; margin: 0 ; padding: 10px 20px ; border: 2px solid #aaa ; background: #fff ; position: fixed ; display: none ; z-index: 2 ; } #modal-overlay { z-index: 1 ; display: none ; position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 120% ; background-color: rgba( 0,0,0, 0.75 ) ; } .button-link { color: #00f ; text-decoration: underline ; } .button-link:hover { cursor: pointer ; color: #f00 ; } </style> </head> <body> <!-- 1つ目のコンテンツ [開始] --> <div id="modal-content-01" class="modal-content"> <!-- モーダルウィンドウのコンテンツ開始 --> <p>1つ目のモーダルウィンドウです。全体を囲むdiv要素に[id="modal-content-01"]が設定されています。</p> <p>「閉じる」か「背景」をクリックするとモーダルウィンドウを終了します。</p> <p><a id="modal-close" class="button-link">閉じる</a></p> <!-- モーダルウィンドウのコンテンツ終了 --> </div> <!-- 1つ目のコンテンツ [終了] --> <!-- 2つ目のコンテンツ [開始] --> <div id="modal-content-02" class="modal-content"> <!-- モーダルウィンドウのコンテンツ開始 --> <p>2つ目のモーダルウィンドウです。全体を囲むdiv要素に[id="modal-content-02"]が設定されています。</p> <p>「閉じる」か「背景」をクリックするとモーダルウィンドウを終了します。</p> <p><a id="modal-close" class="button-link">閉じる</a></p> <!-- モーダルウィンドウのコンテンツ終了 --> </div> <!-- 2つ目のコンテンツ [終了] --> <!-- 3つ目のコンテンツ [開始] --> <div id="modal-content-03" class="modal-content"> <!-- モーダルウィンドウのコンテンツ開始 --> <p>3つ目のモーダルウィンドウです。全体を囲むdiv要素に[id="modal-content-03"]が設定されています。</p> <p>「閉じる」か「背景」をクリックするとモーダルウィンドウを終了します。</p> <p><a id="modal-close" class="button-link">閉じる</a></p> <!-- モーダルウィンドウのコンテンツ終了 --> </div> <p><a class="modal-syncer button-link" data-target="modal-content-01">クリックすると、1つ目のモーダルウィンドウを開きます。</a></p> <p><a class="modal-syncer button-link" data-target="modal-content-02">クリックすると、2つ目のモーダルウィンドウを開きます。</a></p> <p><a class="modal-syncer button-link" data-target="modal-content-03">クリックすると、3つ目のモーダルウィンドウを開きます。</a></p> <!-- 3つ目のコンテンツ [終了] --> </body> </html>
フローティングメニューのベストバージョン
初期状態は、ヘッダーの下のサイドバーに表示される。
ヘッダーが見えなくなると、フローティング開始。
これが一番自然でベストだと思う。
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/start/jquery-ui.css" type="text/css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script> <script type="text/javascript" src="//www.softel.co.jp/blogs/tech/wordpress/wp-content/themes/sfm/js.php"></script> <script>$(function(){$("#source-viewer").text($("#source").html());});</script> <script id="source"> $(function(){ var o = $("#menu_left"); var offset = o.offset(); var topPadding = 30; $(window).scroll(function() { if ($(window).scrollTop() > offset.top) { o.stop().animate({ marginTop: $(window).scrollTop() - offset.top + topPadding }); } else { o.stop().animate({ marginTop: 0 }); }; }); }); </script>
position: relative;でできた空白を消す
スタイルシート(CSS)の position: relative; でできた空白を消す方法。
ボトムにネガティブマージンをとってやると、余白がなくなります。
margin-bottom: -123px;
カテゴリの表示順を逆にする(EC-CUBE)
デフォルトでは、後から登録したカテゴリが上になってしまう。
通常、登録するときは、上から入力していくと、全てが逆順に表示され、順番の入れ替えがとても面倒になる。
対策として、SQLのソート順を逆にする。
(フロント表示、管理画面の左のカテゴリディレクトリ表示)
/data/class/helper/SC_Helper_Category.php [line:544]
// $where = "del_flg = 0 AND $pid_name = ? ORDER BY rank DESC"; $where = "del_flg = 0 AND $pid_name = ? ORDER BY rank ASC";
(カテゴリの追加変更ツリー)
/data/class/pages/admin/products/LC_Page_Admin_Products_Category.php
上記に習い、カテゴリのソート順を変更する
ORDER BY rank DESC ⇒ ORDER BY rank ASC
とても簡単なカスタマイズだが、少しづつ使いやすくするには、EC-CUBEのバカ機能を沢山直さなければならない。
gimp 定規(ガイド)を移動する
Shift + ドラッグ
gimpのカスタマイズ
矢印を描く
http://gazocustomize.blog.fc2.com/blog-entry-40.html
twentysixteen の要なファイルのありか
twentysixteen/template-parts に重要なファイルがある。
biography.php
content.php
content-none.php
content-page.php
Includeタグ
get_template_part('content');
WordPress[twentysixteen] テーマのリセットCSS
twentysixteen
html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video { margin:0; padding:0; border:0; outline:0; font-size:100%; vertical-align:baseline; background:transparent; } body { line-height:1; } article,aside,details,figcaption,figure, footer,header,hgroup,menu,nav,section { display:block; } nav ul { list-style:none; } blockquote, q { quotes:none; } blockquote:before, blockquote:after, q:before, q:after { content:''; content:none; } a { margin:0; padding:0; font-size:100%; vertical-align:baseline; background:transparent; } / change colours to suit your needs / ins { background-color:#ff9; color:#000; text-decoration:none; } / change colours to suit your needs / mark { background-color:#ff9; color:#000; font-style:italic; font-weight:bold; } del { text-decoration: line-through; } abbr[title], dfn[title] { border-bottom:1px dotted; cursor:help; } table { border-collapse:collapse; border-spacing:0; } /* change border colour to suit your needs */ hr { display:block; height:1px; border:0; border-top:1px solid #cccccc; margin:1em 0; padding:0; } input, select { vertical-align:middle; } .skip-link, .menu-toggle, .site-header-menu { display: none; } /* カラム設定 -------------------------------------------------*/ #masthead { width: 100%; } .site-header-main { max-width: 1000px; margin: 0 auto; border: 1px solid silver; } #content { width: 100%; margin: 20px 0 40px 0; } #content_inner { max-width: 1000px; margin: 0 auto; border: 1px solid silver; } #footer { width: 100%; } #footer_inner { max-width: 1000px; margin: 0 auto; border: 1px solid silver; }
”perth” WordPress テーマ編集のコツ
メイン画像のサイズ変更
要は、TP_DIR/inc/style.php Line:42付近
//Body size $header_height = get_theme_mod( 'header_height', '600' );
MySQLのフィールド名をSQL文用に自動で整形する。
MySQLのフィールド名(カラム名)をSQL文用に自動で整形する。
$sql = "SELECT * FROM `dtb_customer` LIMIT 1"; $rs = mysql_query($sql,$db); $item = mysql_fetch_assoc($rs); // Key を配列化 $key_arr = array(); foreach($item as $key => $val){ echo $key."<br>"; }
$sql = "SELECT * FROM `dtb_products` LIMIT 1"; $rs = mysql_query($sql,$db); $item = mysql_fetch_assoc($rs); // Key を配列化 $key_arr = array(); foreach($item as $key => $val){ // echo $key."=>".$val."<br>"; // 試験表示 // array_push($key_arr, $key); echo "`".$key."`,"; }
mint apache2 cgi 設定
見落としがちなCGIを有効にする設定
設定ファイルに絶対間違いはないのにCGIプログラムが動かず、そのソースが表示されるときにはどうしたら良いんだろう?
その場合は、ApacheにCGIを実行するモジュールが組み込まれているか確認します。
$ sudo apache2ctl -M|grep cgi
cgi_module (shared)
このコマンドでcgi_moduleが表示されない時には、ApacheにCGIモジュールが組み込まれていません。
UbuntuのApacheパッケージでCGIモジュールを読みこませるには、/etc/apache2/mods-available/cgi.loadをmods-enabledにコピーまたはリンクを作成します。
$ cd /etc/apache2/mods-enabled
$ sudo ln -s ../mods-available/cgi.load .
$ ls -l | grep cgi
lrwxrwxrwx 1 root root 26 11月 3 11:58 cgi.load -> ../mods-available/cgi.load
これでApacheを再起動するとCGIプログラムが動くようになるはずです。
configはこんな感じ
<Directory /home/hashimoto/www/> # Options Indexes FollowSymLinks AllowOverride All Require all granted Order allow,deny allow from all Options +ExecCGI AddHandler cgi-script .cgi </Directory>
CSS,画面中央に配置する
#top_main_box { position: absolute; top: 0px; right: 0px; bottom: 0px; left: 0px; margin: auto; width: 128px; height: 64px; border: 1px solid red; }
背景画像を画面サイズに合わせる。
html { background: url(top_bg.png) center center / cover no-repeat fixed; }
PHP + MySQL で登録時に重複チェックをしたいです。【の対策】
フォームから投げたデータをデータベースに登録する。
多くの人は、リロードすると重複登録されてしまう対策に苦労しています。
いろんな方のお話を聞いていると
いろいろむずかしいことをしている感じです。
でも、本当はとても簡単です。
POSTを消してしまえばいいのです。
$_POST = array();
下記でも消えるはずですが、unset は挙動不審なので、上のようにからの配列にしてしまうと確実で簡単です。
unset($_POST);
EC-CUBEで管理画面にログインできない時
data/class/pages/admin/LC_Page_Admin_Index.php
// if (SC_Utils_Ex::isBlank($this->arrErr)) { // $this->lfDoLogin($objFormParam->getValue('login_id')); // // SC_Response_Ex::sendRedirect(ADMIN_HOME_URLPATH); // } else { // // ブルートフォースアタック対策 // // ログイン失敗時に遅延させる // sleep(LOGIN_RETRY_INTERVAL); // // SC_Utils_Ex::sfDispError(LOGIN_ERROR); // } if (true) { $this->lfDoLogin($objFormParam->getValue('login_id')); SC_Response_Ex::sendRedirect(ADMIN_HOME_URLPATH); }else{ SC_Utils_Ex::sfDispError(LOGIN_ERROR); }
css で文字を装飾する。GoogleFonts
HTMLヘッダー
<link href='http://fonts.googleapis.com/css?family=Oswald:700' rel='stylesheet' type='text/css'>
CSS
letter-spacing: -4px; font-family: 'Oswald', sans-serif;
EC-CUBEで商品一覧からカートに入らない
対象ファイル products/list.php(.tpl)
<form name="product_form<!--{$id|h}-->" action="?" onsubmit="return false;">
「onsubmit=”return false;”」を削除すると動くケースがある。
新規ウインドウを開く(位置指定)
JavaScriptで小窓を開く
<SCRIPT language="JavaScript"> <!-- // サブウィンドウの大きさと開く位置の指定 w = 640; // 横幅 h = 480; // 縦幅 // 中央に開く function openWindowC() { x = (screen.width - w) / 2; y = (screen.height - h) / 2; subWin = window.open("開くURL","OpenWindow", "screenX="+x+",screenY="+y+",left="+x+",top="+y+",width="+w+",height="+h); } //--> </SCRIPT> <div class="exit"><INPUT type="button" value="お気に入り" onClick="openWindowC()"></div>
子ウインドウを閉じるときに、元ウインドウを更新する。
たとえば、
会員一覧ページで、一部を変更するために子窓を立ち上げます。
更新登録して閉じると、
元ウインドウ(親ウインドウ)の会員データはそのままです。
自動で更新できたらといいなということで、書いてみました。
だれが書いても似たコードになると思います。
<script type="text/javascript"> <!-- function p_reload(){ var parent=window.opener; parent.location.reload(); parent.focus(); window.close(); } //--> </script> <button type="button" onclick="p_reload()">閉じる</button>
「parent」は変数名なので変えてもOKです。
EC-CUBE の商品登録でタイムアウトになる
EC-CUBE の商品登録でタイムアウトになる、しかし登録できている。
categori_id は1から始まるが
0(ゼロ)で登録したら商品登録がタイムアルトになる。
大した問題ではないが。。。
CORESERVER に EC-CUBEを設置する 2.*系
1..htaccess ファイル
AddHandler application/x-httpd-phpcgi .php
———-
2..user.ini ファイルを作成し、以下の一行を記述
magic_quotes_gpc = on
———-
3..user.ini ファイルを .htaccess と同階層にアップロード
Formで入力されたデータを反映する。 ページはリロードさせない。
手法1
<script> $('#submitBtn').click(function(e) { alert('押されたけどページの更新はしないよ。'); return e.preventDefault(); }); </script>
↑たったこれだけでOK
手法2
form タグに onsubmit=”doSomething();return false;” を追記するだけ。
<form id="fep-submission-form" method="post" onsubmit="doSomething();return false;">
下記のような書き方もある
<script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript">google.load("jquery", "1.3");</script> <script type="text/javascript"> $(document).ready(function(){ $("#form00").submit(function(){ $.post( "postsample.php", $(this).serialize(), function(response){ alert(response); } ); return false; }); }); </script> <form id="form00"> <input type="text" name="hogehoge"> <input type="submit" value="送信"> </form>
ファイルリスト取得PHP
<html xmlns="http://www.w3.org/1999/xhtml" class="wp-toolbar" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <?php $dir = './'; $files = scandir($dir); $files = array_filter($files, function ($file) { return !in_array($file, array('.', '..')); }); $list = array(); $text = ''; foreach ($files as $file) { $fullpath = rtrim($dir, '/') . '/' . $file; if (is_file($fullpath)) { $list[] = $fullpath; } if (is_dir($fullpath)) { $list = array_merge($list, getFileList($fullpath)); } } function getFileList($dir) { $files = glob(rtrim($dir, '/') . '/*'); $list = array(); foreach ($files as $file) { if (is_file($file)) { $list[] = $file; } if (is_dir($file)) { $list = array_merge($list, getFileList($file)); } } return $list; } for($i = 0; $list[$i] != ''; $i ++){ $list[$i] = preg_replace("$\.\/$", "", $list[$i]); $list[$i] = preg_replace("$\/$", ",", $list[$i]); echo $list[$i].'<br>'; } ?>
php(ImageMagick)で EPS, AI 画像に変換する(その3)
EPS, AI をPHPなどプログラムで変換するときのコツを書きます。(その2)
イラストレーター(.ai)
「PDF互換」で透過されていれば、そのまま透過されます。
「PDF互換」で透過されていなければ、そのまま透過されません。
※ ちなみに、「PDF互換なし」で入稿すると、データがありませんと返ってきます。
イラレ入稿には、レイヤは関係ないのです。
レイヤで透かしを入れたとか、レイヤで透過していたとか、印刷ができてから言っても無理なので、ご注意ください。
イラレの場合「レイヤに透過情報が入っている」は無効です。
イラレの場合「PDF互換レイヤに透過情報」が入っていることが重要です。
フォトショップ(.eps)
各レイヤが画像ですので、レイヤごとに一枚の画像ファイルとして出力されます。
吐き出しファイル名を「output.png」と指定すると
output-0.png
output-1.png
output-2.png
output-3.png
output-*.png
というように、沢山のファイルが吐出されます。
ゼロは全レイヤを統合した画像ファイル
それ以降は、レイヤごとに画像化したファイル
です。
レイヤが独立した画像として認識されるので「透過情報」も引き継がれます。
DTP印刷でも、プログラムの自動処理でも、入稿したとおりに透過情報も反映されます。
※ イラレ入稿で透過されないのは、入稿データが透過されていないのです。
試しに
私も、入稿データを作ってみました。
フォトショでは透過情報を簡単にきちんと保存できます。
イラレで透過情報をきちんと保存することは、神業くらい難しいようです。
(イラレでレイヤ単位で透過しているのは、大概はベクトル情報です。(←NG) 画像情報としてきちんと透過しなければ入稿には反映されません)
↑確認方法は
イラレで保存したデータを、他のソフトで開いてみてください。
それで透過していたら成功です!
php(ImageMagick)で EPS, AI 画像に変換する(その2)
EPS, AI をPHPなどプログラムで変換するときのコツを書きます。(その2)
イラストレーター(.ai)
透過しているか? 透過していないか?(←ここは自己責任)
一枚の画像化されたレイヤ(PDF互換レイヤ)が印刷対象です。
(イラレでしか見れない他のレイヤは無意味ということです)
フォトショップ(.eps)
各レイヤが画像ですので、レイヤごとに一枚の画像ファイルとして出力されます。
レイヤごとに、印刷に使用されます。
ここで、よくあるトラブルが
イラレで透過していたのに、透過していないポスターが何百枚も出来上がってきた。
イラレは「PDF互換の1レイヤ」のみが利用されます。
それが透過していなかったのなら、入稿した人の原因です。
そういう理由で
イラレで入稿した場合「png」で入稿し直してくださいと言われることも多いです。
「イラレのPDF互換」できちんと透過できている場合は、言われません。
「イラレのPDF互換で透過」の難しさを知っている人は、EPSかpngで入稿しています。
なんでイラレはダメなの?
そんな印刷トラブルが多いようです。
php(ImageMagick)で EPS, AI 画像に変換する(その1)
EPS, AI をPHPなどプログラムで変換するときのコツを書きます。
イラストレーター(.ai)
レイヤは、画像ではなくベクトルデータです。
保存の時に「PDF互換」にチェックを入れると、全レイヤを統合した画像データが
一枚目のレイヤとして保存されます。
この一枚のレイヤのみが、印刷に使用されます。
(イラレでしか見れない他のレイヤは無意味ということです)
フォトショップ(.eps)
各レイヤが画像ですので、レイヤごとに一枚の画像ファイルとして出力されます。
レイヤごとに、印刷に使用されます。
みなさんお気づきと思いますが(←そんなこと、知ってるよという人がほとんどだと思います)
↓イラレは画像処理ソフトではないのです。PDF互換の一枚のレイヤ画像のみが利用されます。
http://d.hatena.ne.jp/akane_neko/20130418/1366236806
印刷屋さんが扱う場合も、プログラムで自動処理を行う場合も
全く同じことができます。
印刷屋さんも(.ai)のソフト上で透過していても
『イラレの「PDF互換」で透過』していないものは、透過しないまま印刷されます。
(当然です)
css TOPへ戻るボタン(フローティング、フェード)
HTML
<p id="page-top"><a href="#page">PAGE TOP</a></p>
javascript
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script> <script type="text/javascript"> $(function() { var topBtn = $('#page-top'); topBtn.hide(); $(window).scroll(function () { if ($(this).scrollTop() > 500) { topBtn.fadeIn(); } else { topBtn.fadeOut(); } }); //スクロールしてトップ topBtn.click(function () { $('body,html').animate({ scrollTop: 0 }, 500); return false; }); }); </script>
CSS
#page-top { position: fixed; bottom: 20px; right: 20px; font-size: 77%; } #page-top a { background: #666; text-decoration: none; color: #fff; width: 100px; padding: 30px 0; text-align: center; display: block; border-radius: 5px; } #page-top a:hover { text-decoration: none; background: #999; }
position: absolute;親要素の左上にする
親要素に
posision: relative;
があれば、親要素の左上が基準になる
なければ、ブラウザの左上が基準になる。
CORESERVER でImageMagickを動かす
coreserver では、次の2点で Imagick が使えるようになる。ち
.htaccess
AddHandler application/x-httpd-phpcgi .php
/public_html/.fast-cgi-bin/php.ini に次の行を追加する
extension = imagick.so
PSD/AI をPHPで画像に変換する
//例えば, SVGをPNGに変換する $psd = 'sample.psd'; $png = 'sample.png'; $im = new Imagick(); $im->readImage($osd); $im->setImageFormat('png'); $im->writeImage($png); //後処理 $im->clear(); $im->destroy();
css 画像を親要素の枠に収まる最大限で拡大縮小
#shop_detail .img1 { display: block; width: 400px; height: 300px; padding: 10px; border: 1px solid silver; display: table-cell; } #shop_detail .img1 .img1_box { display: block; width: 380px; height: 280px; text-align: center; object-fit: cover; } #shop_detail .img1 .img1_box img { width: 380px; height: 280px; object-fit: contain; }
EC-CUBEをログイン状態にする
EC-CUBEをログイン状態にする(2.11系)
他のシステムでログイン中のユーザーが
連動したEC-CUBEにログイン状態を維持する場合などに利用。
data/class/CS_Customer.php
186行目付近
function isLoginSuccess($dont_check_email_mobile = false) { // ログイン時のメールアドレスとDBのメールアドレスが一致している場合 if (isset($_SESSION['customer']['customer_id']) && SC_Utils_Ex::sfIsInt($_SESSION['customer']['customer_id']) ) { $objQuery =& SC_Query_Ex::getSingletonInstance(); $email = $objQuery->get('email', 'dtb_customer', 'customer_id = ?', array($_SESSION['customer']['customer_id'])); if ($email == $_SESSION['customer']['email']) { // モバイルサイトの場合は携帯のメールアドレスが登録されていることもチェックする。 // ただし $dont_check_email_mobile が true の場合はチェックしない。 if (SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE && !$dont_check_email_mobile) { $email_mobile = $objQuery->get('email_mobile', 'dtb_customer', 'customer_id = ?', array($_SESSION['customer']['customer_id'])); return isset($email_mobile); } return true; } } return false; }
上をコメントアウトして、下のように希望のコードに変える。
この処理でログイン状態にはなるが、擬似ログインとも言える。
決済に必要な情報がセッションにあるかどうかは、確認し適宜補填すること。
下の例は、他のシステムにログインしていると「$_SESSION[‘member_id’]」がNULLでない。
その場合、EC-CUBEでもログイン状態と認めるケース。
function isLoginSuccess() { if($_SESSION['member_id'] != ''){ return true; }else{ return false; } }
フォームの入力文字の型をチェック(エンコードで違いあり)
カタカナその他2バイト文字の正規表現はエンコードによって異なるので注意が必要。
正規表現の末尾の「u」があるので、UTF8の場合の例です。
// check $error = 0; // email if(preg_match('/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/iD', $_SESSION['f5'])){ }else{ $error = 1; $error_email = '<div class="red">メールアドレスが不正です。</div>'; } if(!preg_match( "/[\@-\~]/" , $_SESSION[f6])) { $error = 1; $error_email = '<div class="red">パスワードが不正です。</div>'; } // password if($_SESSION[f6] != $_SESSION[f6a]){ $error = 1; $error_pw = '<div class="red">パスワードが一致しません。</div>'; } if($_SESSION[f6] == ''){ $error = 1; $error_pw = '<div class="red">パスワードを入力してください。</div>'; } // zip-code 半角数字以外を削除 if($_SESSION[f7] != ''){ $_SESSION[f7] = preg_replace("/ー|−|―/", "-", $_SESSION[f7]); $_SESSION[f7] = preg_replace("/--/", "-", $_SESSION[f7]); $_SESSION[f7] = preg_replace('/[^0-9_-]/', '', $_SESSION[f7]); $_SESSION[f7] = preg_replace('/[^0-9a-zA-Z]/', '', $_SESSION[f7]); } // tel if($_SESSION[f11] != ''){ $_SESSION[f11] = preg_replace("/ー|−|―/", "-", $_SESSION[f11]); $_SESSION[f11] = preg_replace("/--/", "-", $_SESSION[f11]); $_SESSION[f11] = mb_convert_kana($_SESSION[f11], "a", "utf-8"); $_SESSION[f11] = preg_replace('/[^0-9_-]/', '', $_SESSION[f11]); } // 名前カナ $error_name_kana = ''; if($_SESSION[f3] != ''){ if(!preg_match("/^[ァ-ヶー]+$/u",$_SESSION[f3])){ $error = 1; $error_name_kana = '<div class="red">カタカナで入力してください。</div>'; } } if($_SESSION[f4] != ''){ if(!preg_match("/^[ァ-ヶー]+$/u",$_SESSION[f4])){ $error = 1; $error_name_kana = '<div class="red">カタカナで入力してください。</div>'; } } // shop_name if($_SESSION[f13] != ''){ if(!preg_match("/^[ァ-ヶー]+$/u",$_SESSION[f13])){ $error = 1; $error_shopname_kana = '<div class="red">カタカナで入力してください。</div>'; } }
メールアドレスかどうかをチェックする
フォームに入力されたメールアドレスをチェックする
個人的には正規表現を使うのがおすすめ
むやみに便利な関数を使うと、phpのバージョンアップで動かなくなく可能性が高い
正規表現のパターンマッチで
f(preg_match('/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/iD', $mailaddress)){ return '正しいメールアドレスです'; }else{ return '正しくないメールアドレスです'; }
filter_var関数で
if(filter_var($mailaddress, FILTER_VALIDATE_EMAIL)){ return '正しいメールアドレスです'; }else{ return '正しくないメールアドレスです'; }
filter_var関数の方がソースコードが短縮できるように見えるが、
関数を読み込んで処理されるまでの見えない部分を考慮すれば
圧倒的に正規表現のほうがロスが少ない。
phpのエラーでブラウザ画面がインターナルエラーになる
phpのエラーでブラウザ画面がインターナルエラーになる
開発時にはとても困ります。
PHPのエラーを表示するには
php.ini で display_errors が Off になっていないか確認する。
display_errors = On
ならばOK
SQLデータベースに接続の基本コード
php5〜php7
Database に接続
$pdo = new PDO('mysql:host='.DB_SERVER.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD);
ヒットがユニークの場合
$sql = "SELECT * FROM `tb_hogehoge`"; $statement = $pdo->query($sql); $item = $statement->fetch(PDO::FETCH_ASSOC); var_dump($item);
Roop の場合
$sql = "SELECT * FROM `tb_hogehoge`"; foreach($pdo->query($sql) as $item) { var_dump($item); }
↓php7 から使えなくなる。
$db = mysql_connect(DB_SERVER.":".DB_PORT,DB_USER,DB_PASSWORD); // mysql_query("SET NAMES utf8"); mysql_set_charset('utf8'); mysql_select_db(DB_NAME, $db); $sql1 = "SELECT * FROM `dtb_category` WHERE `category_id` = '$_GET[category_id]'"; $rs1 = mysql_query($sql1,$db); $item1 = mysql_fetch_assoc($rs1);