EC-CUBE3にて価格は会員のみ表示する

【参考】

セキュリティ

会員ユーザーがログイン中かどうかチェックする方法

【実施】

商品リスト

「app/template/test/Product/list.twig」の

{% if Product.hasProductClass %} から {% endif %} 値段(Price)が書いてあるあたりを

{% if is_granted(‘ROLE_USER’) %} から {% endif %}で囲む。

 

会員じゃない人へのメッセージと、会員登録へ誘導するのが親切なので

<dl id="result_list__detail--{{ Product.id }}">
    <dt id="result_list__name--{{ Product.id }}" class="item_name">{{ Product.name }}</dt>
    {% if Product.description_list %}
        <dd id="result_list__description_list--{{ Product.id }}" class="item_comment">{{ Product.description_list|raw|nl2br }}</dd>
    {% endif %}
    {% if is_granted('ROLE_USER') %}
    {% if Product.hasProductClass %}
        {% if Product.getPrice02Min == Product.getPrice02Max %}
        <dd id="result_list__price02_inc_tax--{{ Product.id }}" class="item_price">
            {{ Product.getPrice02IncTaxMin|price }}
        </dd>
        {% else %}
        <dd id="result_list__price02_inc_tax--{{ Product.id }}" class="item_price">
            {{ Product.getPrice02IncTaxMin|price }} ~ {{ Product.getPrice02IncTaxMax|price }}
        </dd>
        {% endif %}
    {% else %}
        <dd id="result_list__price02_inc_tax--{{ Product.id }}" class="item_price">{{ Product.getPrice02IncTaxMin|price }}</dd>
    {% endif %}
    {% else %}
        <dd>価格は会員のみ公開しています。<br />
		登録済みの方は<a href="{{ url('mypage_login') }}">ログイン</a>を行ってください。<br />
		登録がまだの方は<a href="{{ url('entry') }}">会員登録</a>を行ってください。</dd>
    {% endif %}
</dl>

などと記載すると親切かと思います。

詳細ページ

「app/template/test/Product/detail.twig」の

価格部分
{% if is_granted('ROLE_USER') %}
<!--★通常価格★-->
{% if Product.hasProductClass -%}
    {% if Product.getPrice01Min is not null and Product.getPrice01IncTaxMin == Product.getPrice01IncTaxMax %}
    <p id="detail_description_box__class_normal_price" class="normal_price"> 通常価格:<span class="price01_default">{{ Product.getPrice01IncTaxMin|price }}</span> <span class="small">税込</span></p>
    {% elseif Product.getPrice01Min is not null and Product.getPrice01Max is not null %}
    <p id="detail_description_box__class_normal_range_price" class="normal_price"> 通常価格:<span class="price01_default">{{ Product.getPrice01IncTaxMin|price }} ~ {{ Product.getPrice01IncTaxMax|price }}</span> <span class="small">税込</span></p>
    {% endif %}
{% else -%}
    {% if Product.getPrice01Max is not null %}
    <p id="detail_description_box__normal_price" class="normal_price"> 通常価格:<span class="price01_default">{{ Product.getPrice01IncTaxMin|price }}</span> <span class="small">税込</span></p>
    {% endif %}
{% endif -%}

<!--★販売価格★-->
{% if Product.hasProductClass -%}
    {% if Product.getPrice02IncTaxMin == Product.getPrice02IncTaxMax %}
    <p id="detail_description_box__class_sale_price" class="sale_price text-primary"> <span class="price02_default">{{ Product.getPrice02IncTaxMin|price }}</span> <span class="small">税込</span></p>
    {% else %}
    <p id="detail_description_box__class_range_sale_price" class="sale_price text-primary"> <span class="price02_default">{{ Product.getPrice02IncTaxMin|price }} ~ {{  Product.getPrice02IncTaxMax|price }}</span> <span class="small">税込</span></p>
    {% endif %}
{% else -%}
    <p id="detail_description_box__sale_price" class="sale_price text-primary"> <span class="price02_default">{{ Product.getPrice02IncTaxMin|price }}</span> <span class="small">税込</span></p>
{% endif -%}

{% else %}
    <dd>価格は会員のみ公開しています。<br />
    登録済みの方は<a href="{{ url('mypage_login') }}">ログイン</a>を行ってください。<br />
    登録がまだの方は<a href="{{ url('entry') }}">会員登録</a>を行ってください。</dd>
{% endif %}

カート部分
{% if is_granted('ROLE_USER') %}
    <form action="?" method="post" id="form1" name="form1">
        <!--▼買い物かご-->
        <div id="detail_cart_box" class="cart_area">
            {% if Product.stock_find %}

                {# 規格 #}
                {% if form.classcategory_id1 is defined %}
                <ul id="detail_cart_box__cart_class_category_id" class="classcategory_list">
                    {# 規格1 #}
                    <li>
                        {{ form_widget(form.classcategory_id1) }}
                        {{ form_errors(form.classcategory_id1) }}
                    </li>
                    {# 規格2 #}
                    {% if form.classcategory_id2 is defined %}
                        <li>
                            {{ form_widget(form.classcategory_id2) }}
                            {{ form_errors(form.classcategory_id2) }}
                        </li>
                     {% endif %}
                </ul>
                {% endif %}

                {# 数量 #}
                <dl id="detail_cart_box__cart_quantity" class="quantity">
                    <dt>数量</dt>
                    <dd>
                        {{ form_widget(form.quantity) }}
                        {{ form_errors(form.quantity) }}
                    </dd>
                </dl>

                <div class="extra-form">
                    {% for f in form.getIterator %}
                        {% if f.vars.name matches '[^plg*]' %}
                            {{ form_row(f) }}
                        {% endif %}
                    {% endfor %}
                </div>

                {# カートボタン #}
                <div id="detail_cart_box__button_area" class="btn_area">
                    <ul id="detail_cart_box__insert_button" class="row">
                        <li class="col-xs-12 col-sm-8"><button type="submit" id="add-cart" class="btn btn-primary btn-block prevention-btn prevention-mask">カートに入れる</button></li>
                    </ul>
                    {#Favorite product button#}
                    {% if BaseInfo.option_favorite_product == 1 %}
                        <ul id="detail_cart_box__favorite_button" class="row">
                            {% if is_favorite == false %}
                                <li class="col-xs-12 col-sm-8"><button type="submit" id="favorite" class="btn btn-info btn-block prevention-btn prevention-mask">お気に入りに追加</button></li>
                            {% else %}
                                <li class="col-xs-12 col-sm-8"><button type="submit" id="favorite" class="btn btn-info btn-block" disabled="disabled">お気に入りに追加済みです</button></li>
                            {% endif %}
                        </ul>
                    {% endif %}
                </div> {#End div#detail_cart_box__button_area #}
            {% else %}
                {# 在庫がない場合は品切れボタンを表示 #}
                <div id="detail_cart_box__button_area" class="btn_area">
                    <ul class="row">
                        <li class="col-xs-12 col-sm-8"><button type="button" class="btn btn-default btn-block" disabled="disabled">ただいま品切れ中です</button></li>
                    </ul>
                    {#Favorite product button#}
                    {% if BaseInfo.option_favorite_product == 1 %}
                        <ul id="detail_cart_box__favorite_button" class="row">
                            {% if is_favorite == false %}
                                <li class="col-xs-12 col-sm-8"><button type="submit" id="favorite" class="btn btn-info btn-block prevention-btn prevention-mask">お気に入りに追加</button></li>
                            {% else %}
                                <li class="col-xs-12 col-sm-8"><button type="submit" id="favorite" class="btn btn-info btn-block" disabled="disabled">お気に入りに追加済みです</button></li>
                            {% endif %}
                        </ul>
                    {% endif %}
                </div> {#End div#detail_cart_box__button_area #}
            {% endif %} {#End stock find#}
        </div>
        <!--▲買い物かご-->
        {{ form_rest(form) }}
    </form>
 {% else %}
    <dd>商品は会員のみ購入が可能です。<br />
    登録済みの方は<a href="{{ url('mypage_login') }}">ログイン</a>を行ってください。<br />
    登録がまだの方は<a href="{{ url('entry') }}">会員登録</a>を行ってください。</dd>
{% endif %}

EC-CUBE3に商品登録項目追加。検索フォームにも追加。

参考ページ

「商品情報に項目を追加する方法」

「EC-CUBE3で既存のクエリーに条件を追加する方法」

「【ECCUBE 3】検索対象を増やす。」

受注マスターに検索条件を追加する方法(商品コードなど)

やりたいこと

「商品サイズ(productsize)」を商品登録項目で追加と、検索項目に追加。
上記の参考ページを参考にしました。

「商品サイズ(productsize)」を商品登録項目で追加と、検索項目に追加。
上記の参考ページを参考にしました。

商品登録項目追加

1.テーブルへのカラム追加

「dtb_product」テーブルに「productsize」という名前のカラムを追加

2.src/Eccube/Entity/Product.php

    /**
     * @var string
     */
    private $productsize;

    /**
     * @return string
     */
    public function getProductSize()
    {
        return $this->productsize;
    }

    /**
     * @param string $size
     * @return \Eccube\Entity\Product
     */
    public function setProductSize($productsize)
    {
        $this->productsize = $productsize;
        return $this;
    }

3.src/Eccube/Resource/doctrine/Eccube.Entity.Product.dcm.yml

fields:に以下を追加


        productsize: 
            type: text
            nullable: true
            

4.フォーム定義

src/Eccube/Form/Type/Admin/ProductType.phpの「public function buildForm(FormBuilderInterface $builder, array $options)」に


        $builder->add('productsize', 'text', array(
                'label' => '寸法',
                'required' => false,
            ));

5.管理画面に追加

template/admin/Product/product.twig

{{ form_row(form.productsize) }}

6.商品詳細にアウトプット

template/default/Product/detail.twig

{{ Product.productsize }}

検索項目に追加

1.ブロックタイプに追加

src/Eccube/Form/Type/SearchProductBlockType.php


        $builder->add('productsize', 'text', array(
            'required' => false,
            'empty_data' => null,
            'attr' => array(
                'maxlength' => 50,
            ),
        ));
        

を追加。

2.ブロックタイプのフォームに検索項目を増やす

app/template/test/Block/search_product.twigに追加

{{ form_widget(form.productsize, {'attr': { 'placeholder' : "寸法" }} ) }}

3.検索ロジックの追加

src/Eccube/Repository/ProductRepository.phpに追加

public function getQueryBuilderBySearchData($searchData)の中


        if (isset($searchData['productsize']) &amp;&amp; Str::isNotBlank($searchData['productsize'])) {
            $qb->andWhere('LOWER(p.productsize) LIKE :productsize')
                ->setParameter('productsize', '%' . mb_convert_kana($searchData['productsize'], "nr", "utf-8") . '%');
        }

上記の方法で、一応、英数字は半角全角どちらでもヒットするようになっています。

4.$searchDataに追加

src/Eccube/Form/Type/SearchProductType.php

の「public function buildForm(FormBuilderInterface $builder, array $options)」に


        $builder->add('productsize', 'text', array(
            'required' => false,
            'empty_data' => null,
            'attr' => array(
                'maxlength' => 50,
            ),
        ));
        

を追加。

とりあえず、「テキスト」はできそう。「checkbox」とか「select」とかは研究しないといけません。

EC-CUBE3でテンプレート追加

EC-CUBEのバージョン:3.0.14
PHP5.6.31、PostgreAQL9.3.17
サーバーはxampp
http://localhost/

テンプレートの追加について、
ECCUBE3でデフォルトテンプレートから独自テンプレートを作る方法
等を参考に進めています。

localhostという環境だからかもしれませんが、まず、テンプレートのダウンロードでシステムエラーがでます。

うまくいかないので、
[EC-CUBE3.0.10]新しいテンプレートを追加する
を参考に進めました。

簡単に言うと、ディレクトリをサーバにコピー(app/template/以下とhtml/template以下) → データベースに直接書き込んでテンプレートリストを追加 → 管理画面で選択して切り替え

という手順です。詳しくは記事のリンク先へどうぞ。
丁寧に説明されておられます。ありがとうございました。

WPのContactForm7が文字化けする

スマイルサーバのver4に移動してから、WordpressのContactForm7で送ったメールが文字化けするという現象が起こりました。

正確には、メールフォームで入れた項目が「????」という文字化けをし、そのほか設定した文字(たとえば、「このメールは●●サイトのお問い合わせから送っています」などのテンプレートの文字)は文字化けしていません。

ContactForm7の文字化けについては、いろいろと記事がありましたが、そのうちの

Contact Form 7で送るメールの文字化けが直らない

php.iniのmbstring.encoding_translation = OnをOffにしたら文字化けしなくなりました。

が参考になりました。

実際に、phpinfoでサーバ情報を見ると、「mbstring.encoding_translation」は「On」でした。

ただ、その設定をするとうまくいくのですが、「On」になっていたのを「Off」にするのは少々抵抗があります。

そのほか見ていて、

mbstring.encoding_translationが原因で文字化け

での設定がよさそうです。

スマイルサーバの「php.ini」は「.user.ini」である必要があるので、そのファイルに

mbstring.http_input = UTF-8

mbstring.internal_encoding = UTF-8

mbstring.substitute_character = "?"

を記入して、文字化けは防げました。

スマイルサーバプラン移行後、allow_url_includeがOnできなくなったら

スマイルサーバがver2,3からver4にプラン移行するにあたり、データを移行してくれたのですが、includeを利用して表示していた画面が表示しなくなりました。

単純にソースを書き出したphpをincludeして表示させていた仕組みで、今更アウトプット部分の処理を変更するのも、面倒なので、今までのようにincludeを使えないかと調べました。

php.iniでallow_url_includeをOnにしてみる

まずは、php.iniを利用して、allow_url_include = ONにしようと思ったのですが、今までのサーバでは「data」フォルダに「php.ini」を入れるだけでいけていました。

しかし、今回は「.user.ini」というファイル名を入れなければならないようです。しかも、allow_url_include = ONはできない(※スマイルサーバに問い合わせていただいた回答です)

includeの代替案

参考URLを教えてもらったので、
allow_url_fopen と allow_url_include
試しましたが、うまくいきませんでした。

どちらかというとうまくいったのは

PHPのallow_url_includeでinclude()の代替案

でした。cURL関数を利用しました。

 

WordPress4.8にアップデートしたらFailed to load content css: (省略)editor-style.cssと出る件

WordPress4.8から、テーマとブラウザによっては、投稿用のビジュアルエディターにしたときに

「Failed to load content css: (省略)editor-style.css」と出るようになった。

ビジュアルエディターにスタイルシートを効かせたい場合、function.phpに

add_editor_style(‘editor-style.css’);

と記述して、適応させるthemeのフォルダにいれたeditor-style.cssを読み込ませたり、「tinymce-advanced」の設定で「editor-style.css」を読み込ませたりしていたのだけども、それがどちらの方法でも引っかかる。

また、ブラウザはGoogleChromeのときに出るような気がしている。

手っ取り早い解決方法として、「editor-style.css」に「import」を利用して、相対パスで別のcssファイルを読み込ませていたので、それを絶対パスに変更した。

ブラウザやサーバやテーマの作り方によって出たりでなかったりするというところは、まったく解決していないが、とりあえず。

Geolocation APIで現在地が取得できない

geolocationで現在地が取得できずに困っていました。

大きな原因からいって「SSLの環境下でないと現在地を使わせないOSが増えてきた」「なぜかgeolocationが定義されてないっぽい」でした。

1.GooglechromeやiOSのブラウザ、Macのsafariでhttp接続のページから現在地を取得を禁止する仕様に変わってきた

今までは「位置情報取得をon」や「ブラウザが位置情報取得を許可しているか」などを確認してもらっていたけど、そういうの関係なく「禁止」になっている。

Webブラウザで現在地情報を正しく取得できない場合の原因と対策 (参考記事)

iOSはバージョン10以降(iPhone7はプリインストール)

2.geolocationが定義されていないっぽい?

alertとかを加えて、javascriptが動いているか、どこで動かなくなるかを検証していたところ、どうもgeolocation自体が動いてないっぽい。

navigator.geolocation.getCurrentPosition から navigator.geolocation.watchPositionに変えてみたりしたけど動かない。

Android で現在地を Geolocation API で取得できないとき (参考記事)

を参考に{enableHighAccuracy: true}をオプションにいれてみたけど、動かない。

最終的には

第3回 位置情報を取得してみよう(後編)(参考記事)

を読んで、try catchを入れて、geolocationが定義されてなかったら「使えません」と謝る機能を追加した。

なぜ「geolocation」が使えないかは謎です。

 

あとやはり基本的な知識が足りないなぁ……反省。

Geolocation の利用

Warning: proc_open() has been disabled for security reasons

サーバ側で、proc_open()の使用が禁止されているようです。

sakuraのサーバだとすんなり行ったので、油断してました。

ちなみに利用したのはSpeeverのサーバです。

検索にひっかかったのはDrupalのページだけど

proc_open() has been disabled for security reasons in /home/ahbekker/public_html/drupal/includes/image.imagemagick.inc

php.iniで制御できるっぽい。

 

wordpressでスラッグからページのURLを取得する

function.phpに以下を追加

function slugtourl($slugname){
	//固定ページのスラッグからページを取得
	$page = get_page_by_path($slugname);
	//ページIDからURLを取得
	return get_permalink( $page->ID );
}

URLを表示したいところに以下を追加

<?php echo slugtourl('access');?>

echoを付けるかつけないかの判別を入れてもよかったけど……。
それ自体は難しくないので……。

function slugtourl($slugname,$display = 1){
	//固定ページのスラッグからページを取得
	$page = get_page_by_path($slugname);
	//ページIDからURLを取得
	$url = get_permalink( $page->ID );

	if($display){
	   echo $url;
	}else{
	   return $url;
	}
}

という感じでしょうか。

javascriptの関数で変数にデフォルト値を入れていたらIEで動かなくなった件

PHPのノリで、javascriptのfunctionの変数にデフォルト値を以下のように入れていたのですが。

function example(aaa,bbb,ccc=600){

これで、IEの表示だけまったく動かなくて、3時間近く奮闘してた。
GoogleもFirefoxも動くんだもん。

いや、もしかしたら、他のいろんな要素が邪魔をしてと思ったんだけど……。

なんでか絶対、私の見落とした、アホみたいな理由があると思うんだけど……。

とりあえず、追跡はまた今度にして、ひとまず今日はここまでにしておく。

いや、動いてよかったんだけど。「なんでー!!!!」ってなりました。


jqueryのバージョンは、1.10.2でも3.1.0でも動作は同じだった。
IEのバージョンは11

参考になりそうな記事を発見。この時は、Googlechromeだと動かないと書いてある。

JavaScript関数で引数で=を使ってのデフォルト引数

古いIEだったら動くのかなとテスターとかつかってみるけど、動かない。とりあえずまたじっくり時間が取れたら少し追ってみようと思う。