PHPからJavaScriptへの変数渡し

もはやアプリ化しているホームページですが、プログラム部分で使われる基本的な言語が『PHP』と『JavaScript』かと思います。
それぞれに得意とする部分がありますので、その得意とする部分で言語を分けて書いて行くと異言語間の変数の共有が必要になってくると思います。
今回、PHPとJavaScriptでの変数の受け渡しについてお教えします。
※[××××××.php]ファイルでの記述方法になります。

【PHPからJavaScriptへ 基本 変数編】
PHPで使っている変数の内容をJavaScriptへ渡しjQueryなんかで処理したい事が多いかもしれません。

JavaScript記述内で

var $aa = "<? php echo $bb; ?>;";

とするだけで変数 $bbの内容が$aaへ代入する事ができます。

【PHPからJavaScriptへ 配列変数編】
まず、基本的にJavaScriptが多次元配列に対応していないため、通常の配列の受け渡しについて説明します。

[PHP側での準備] $ab = implode(“,”,$aa);
『implode』をつかって配列をカンマ区切りの文字列情報へ組み替えます。

JavaScript内で

var $bb_csv = ""; // 変数受け渡し。
$bc = bb_csv.split(",", -1); // bb_csvをsplit()でカンマ区切り配列に再編成。

こうすることで、PHPでデーベースなどの処理を行ない、表示部分ではJavaScriptでjQueryなどを使った柔軟な表示がおこなえます。


レスポンシブWebデザインに対応!Slick.jsを使ってスライドの サムネイルの位置を切り替える

年末からの体調不良からいっこうに立ち直れないyasaiです。先日の大寒波からみなさんは立ち直ったでしょうか?

さて僕としては2016年1回目のブログとなります。気合い入れていきます!!なんていうと、あとが続かなくなるので、今回はサラッと軽めに参ります。

160127

みなさんはサイト制作するとき、メインに使うスライダーって決めてますか?僕の本命は bxSliderslickです。この2本の使い分けって感じですねー

先日やらせていただいた案件で、メインのスライドエリアの横にサムネイル表示されるパターンのものがあったので、今回はその時のお話です。スマホの時はサムネイルを下へ移動します。

【DEMO】

今回はslickを使いました。slickの素敵な所は、画面幅にによってオプションを切り替えられるところですね。それと今回の案件でslickを使うことにしたのは、サムネイルの表示が別のHTMLとして書くことができて、CSSでの制御がしやすかったからです。

まずはslick.jsとCSSを読み込みます。jQueryのプラグインですので、お約束jQueryと一緒に。

<script src="jquery.js"></script>
<script src="slick.min.js"></script>
<link rel="stylesheet" href="slick.css">

 

※追記

slick-theme.cssは読み込んでいません。slick-theme.cssを読み込むと縮めたときに「戻る」ボタンの表示がうまくいかないようです。
一応回避方法を考えてみましたのでコメントをご覧ください。

 

スライダー部分のHTMLはこんな感じに。

<div class="slider container">
    <div class="slider-for">
        <div class="sp-slide"><img src="images/01.png" alt=""></div>
        <div class="sp-slide"><img src="images/02.png" alt=""></div>
        <div class="sp-slide"><img src="images/03.png" alt=""></div>
        <div class="sp-slide"><img src="images/04.png" alt=""></div>
        <div class="sp-slide"><img src="images/05.png" alt=""></div>
        <div class="sp-slide"><img src="images/06.png" alt=""></div>
    </div>     
    <div class="slider-nav-wrap">
        <div class="slider-nav">
            <div class="sp-thumbnail"><img src="images/01.png" alt=""></div>
            <div class="sp-thumbnail"><img src="images/02.png" alt=""></div>
            <div class="sp-thumbnail"><img src="images/03.png" alt=""></div>
            <div class="sp-thumbnail"><img src="images/04.png" alt=""></div>
            <div class="sp-thumbnail"><img src="images/05.png" alt=""></div>
            <div class="sp-thumbnail"><img src="images/06.png" alt=""></div>
        </div>
        <div class="slick-nav-arrows">
            <div class="slick-next"></div>
            <div class="slick-prev"></div>
        </div>
    </div>
</div>

スライダーのメイン部分を.slide-for、サムネイル部分を.slider-nav、矢印を.slick-nav-arrowsでマークアップしています。ひとつポイントなのが、.slider-navと.slick-nav-arrowsを.slider-nav-wrapでひとくくりにしているところでしょうか。

 

動作のためのJavascriptをこんな感じです。

$(document).ready(function(){
    $('.slider-for').slick({
        slidesToShow: 1,
        slidesToScroll: 1,
        arrows: false,
        fade: false,
        asNavFor: '.slider-nav'
    });
    $('.slider-nav').slick({
        slidesToShow: 4,
        slidesToScroll: 1,
        asNavFor: '.slider-for',
        dots: false,
        centerMode: true,
        focusOnSelect: true,
        vertical: true,
        arrows:  true,
        prevArrow: $('.slick-prev'),
        nextArrow: $('.slick-next'), 
        responsive: [
            {
                breakpoint: 768,
                settings: {
                    centerMode: true,
                    vertical: false
                }
            }
        ]
    });
});

メイン.slider-forとサムネイル.slider-navの両方ともスライダーとして動作させます。
メインである.slider-forのオプションで「asNavFor : ‘.slider-nav’」として、.slider-navがサムネイルボタンとして機能するようにします。

サムネイルの方は、今回は4枚並ぶ形にしました。「slidesToShow: 4」
「the last carousel 」なんていうサブタイトルがついてるくらい、使いやすいカルーセルスライダーですなんですよね。

そしてslickのよいところ、オプション「responsive」でブレイクポイントを設定し、表示を切り替えます。今回は768pxをブレイクポイントとし、縦型のスライダーにするかどうかを切り替えています。その他詳しいオプションなどは、本家サイトをご覧ください。

 

見た目の方のCSSはこんなです。

.slider{
    position: relative;
    max-width: 960px;
}
.slider img{
    max-width: 100%;
    height: auto;
}
.slider .slider-nav-wrap{
    position: relative;
}
.slider .slider-nav-wrap .slider-nav .slick-list{
    padding: 0 !important;
}
.slider .slider-nav-wrap .slider-nav .slick-track{
    left: 0 !important;
    width: 100%;
    opacity: 1;
}
.slider .slider-nav-wrap .slider-nav .slick-slide{
    -webkit-transition: opacity .3s ease;
    transition: opacity .3s ease;
    opacity: 1;
    padding: 5px;
}
.slider .slider-nav-wrap .slider-nav .slick-slide:hover{
    opacity: .5;
}
.slider .slider-nav-wrap .slick-arrow{
    position: absolute;
    top: 50%;
    width: 0;
    height: 0;
    border-style: solid;
    -webkit-transform: translateY(-50%);
    transform: translateY(-50%);
}
.slider .slider-nav-wrap .slick-prev{
    right: 0;
    border-width: 6px 0 6px 12px;
    border-color: transparent transparent transparent #444444;
}
.slider .slider-nav-wrap .slick-next{
    left: 0;
    border-width: 6px 12px 6px 0;
    border-color: transparent #444444 transparent transparent;
}
@media (min-width: 768px){
    .slider .slider-for{
        float: left;
        width: 79.1666%;
    }
    .slider .slider-nav-wrap{
        position: absolute;
        top: 50%;
        right: 0;
        width: 16.6666%;
        padding: 0;
        -webkit-transform: translateY(-50%);
        transform: translateY(-50%);
    }
    .slider .slider-nav-wrap .slider-nav .slick-list{
        padding: 0 0 !important;
    }
    .slider .slider-nav-wrap .slider-nav .slick-track{
        left: 0 !important;
    }
    .slider .slider-nav-wrap .slider-nav .slick-slide{
        padding: 0;
    }
    .slider .slider-nav-wrap .slick-arrow{
        left: 50%;
        -webkit-transform: translateX(-50%);
        transform: translateX(-50%);
    }
    .slider .slider-nav-wrap .slick-prev{
        top: auto;
        bottom: -1.5em;
        border-width: 18px 9px 0 9px;
        border-color: #444444 transparent transparent transparent;
    }
    .slider .slider-nav-wrap .slick-next{
        top: -1.5em;
        border-width: 0 9px 18px 9px;
        border-color: transparent transparent #444444 transparent;
    }
}

ちょっと長いですけど、基本的にはたいしたことしてないですね。

メディアクエリで768px以上の場合はメイン部分を左に寄せて、サムネイル部分は天地のセンターをとりたかったので、絶対配置で右寄せにしているだけです。この時に幅を%で指定してあるから縮んでいくよ、というからくり。(imgをmax-width:100%にしています)
.slider-navと.slick-nav-arrowsを.slider-nav-wrapでひとくくりにしたのは.slick-nav-arrowsをうまいこと配置したかったから、ということです。(.slider-navの位置に合わせて天地or左右のセンターをとりたかった)

スマホのときは特にfloatも絶対配置もしていないので、メインの下にサムネイルがやってくるという仕掛けになってます。
DEMOのブラウザ幅を広げたり縮めたりするを動作を確認いただけると思います。

 

今回はコードばかりでいつも以上にとっつきにくいですね。スイマセン・・・

 

追記(2016/04/25)

サンプルその2も作ってみました。よろしければこちらもどうぞ!

Slick.jsを使ってカルーセルスライダーの中央の画像を大きくする【レスポンシブWebデザインでもOK】


『openWYSIWYG』使ってみた

お客さまのホームページをリニューアルする際に、『お知らせ』部分をWYSIWYGエディタで書き込めるようにしました。
その時に使ったのが『openWYSIWYG』というWYSIWYGエディタ。
JavaScriptで開発されているエディタです。
この使い方とカスタマイズ、画像使用不可ですがChromeで使う際の修正を書いて行きます。

まずは、基本プログラムのダウンロード。
openWYSIWYG (ライセンス:LGPL)

Home

非公式で日本向けカスタム版もあるようですが、使用前にご確認ください。

設置は簡単。ヘッダー内で「wysiwyg.js」と「wysiwyg-settings.js」を読み込み
使用するIDの定義はWYSIWYG.attachとして (‘要素ID’,’ツールバー設定’) で完了。

<script type=”text/javascript” src=”scripts/wysiwyg.js”></script>
<script type=”text/javascript” src=”scripts/wysiwyg-settings.js”></script>
<script type=”text/javascript”> WYSIWYG.attach(“txw1”, full);</script>

ツールバーの設定は『wysiwyg-settings.js』に書き込みます。

基本的な設定として

要素の幅  [セット名].Width = “100%”;
要素の高さ [セット名].Height = “250px”;
要素内の基本スタイル [セット名].DefaultStyle = “font-family: sans-serif; font-size: 14px;”

ツールバーのカスタマイズ。
デフォルトのツールバーは上から[0]、[1]の2段になっています。
それぞれの段に入るツールは『wysiwyg.js』内に『this.Toolbar = new Array();』として書いてあります。
区切り線も入れられるようで、”seperator”と入れれば縦線が入ります。

そして、これを踏まえて「wysiwyg-settings.js」に書き込めば専用のツールセットが出来上がります。

書き方は
[セット名].full.Toolbar[[段数]] = new Array([ここに””と”,”区切りでツール名を書く]

たとえば、fullと言うセット名の場合
full.Toolbar[0] = new Array(“font”,”fantasize”,”headings”, … );

デフォルトのツールバーに対して、任意の段・任意の並びに表示したい場合
[セット名].addToolbarElement(“[ツール名]”, [段], [並び(右から何番目)]);

たとえば、fullと言うセット名で3段目の一番右に『フォントサイズ』を置く場合
full.addToolbarElement(“fontsize”, 3, 1);
とすればOKです。

さて、このエディタ、1つ大きな欠点があります。
Chromeに非対応です。

画像の挿入など画像に関わる部分を使用しないのであれば
2020行目付近にある

if ((navigator.userAgent.indexOf(‘Safari’) != -1 ) || !document.getElementById || !document.designMode){

をコメントアウトして

if (!document.getElementById || !document.designMode) {

を新しく追加すると”エラーは出なくなります”


特定のユーザーの場合にはカテゴリをあらかじめチェックする【WordPress】

すっかり春めいてきまして。みなさんの花粉症の具合はいかがですか?

私自身は平気なのですが、まわりの花粉症の人たちをみると辛そうで・・・

それよりも私は春先特有の猛烈な眠気に困っています。間断なく春の眠気が襲ってくるのです。強敵です。手強いです。眠いです。

いつものことじゃないのかって?いやー、まぁ。。。

150327

さて、今日はWordpressのお話で。

現在投稿するユーザーが複数入るポータルサイトみたいのを作ってまして。

記事書く時にカテゴリーのつけ忘れって、結構あると思うのですよね。それで、特定のユーザーの場合は、必ずあるカテゴリに初めからチェックが入った状態にしたいな、と。

ユーザー権限で分岐できればもっとカンタンだったかもなのですが、今回はjQueryで処理しました。

 

条件

  1. ユーザーのプロフィール項目にカスタムフィールド(ACF使用)でタイプ別のチェック項目を作っている。
  2. 前記チェック項目とslugが対応したカテゴリを作ってある。

 

処理

  1. ユーザーのプロフィール情報から該当するチェックボックを配列に入れる。
  2. slugのカテゴリIDを取得する。
  3. ダッシュボードのカテゴリのチェックボックスには「in-category-カテゴリID」のIDが付与されるのを利用し、対応する「in-category-カテゴリID」のチェックボックスの’checked’を’checked’にする。
  4. 2、3の処理をforeachでプロフィール情報のチェックボックス分行う。

 

コード

※function.phpに記述

function check_cat_type() {
    //ユーザーID取得
    $user = wp_get_current_user();
    $userID = $user->ID;
        
    //type 
	/* プロフィール情報とカテゴリの共通するスラッグ */
    $type01 = 'type01';  
    $type02 = 'type02'; 
    $type03 = 'type03'; 
    $type = 'profile_type';
	/*  'profile_type'はプロフィール情報のカスタムフィールドのslug */
    //ユーザーのタイプ取得
    $profile_type = get_the_author_meta( $type, $userID);
    
    if($profile_type != ''){
        foreach ($profile_type as $thistype){
            //カテゴリーIDの取得
            if($thistype == $type01){
                $idObj = get_category_by_slug( $type01 );
            }elseif($thistype == $type02){
                $idObj = get_category_by_slug( $type02 );
            }elseif($thistype == $type03){
                $idObj = get_category_by_slug( $type03 );
            }
            $cat_id = $idObj->term_id;
            
            //jQueryでチェックボックスに該当するチェックボックスにチェックを入れる
            $script_type = '<script type="text/javascript">';
            $script_type .= 'jQuery(document).ready(function($){';
            $script_type .= 'jQuery("input#in-category-' .$cat_id  .'").attr("checked", "checked");';
            $script_type .= '});';
            $script_type .= '</script>';
            echo $script_type;
        }
    }
}
add_action('admin_head', 'check_cat_type');

 

今回はコチラを参考にさせていただきました。ありがとうございます!

記事投稿時に指定したカテゴリーのチェックボックスを選択済みにする

 

今の所これだと、編集時にも必ずチェックが入るんですよね。

あえてチェック外したいなっていうときは忘れないようにですねー