複数ショップ機能

CS-Cart(通常版のみ)では、1つの管理画面から複数のストアフロントを作成・管理することができます。これらのストアフロントは同じデータベースで動作しますが、デザイや商品、カテゴリ、お客様、設定、およびデザインはそれぞれ異なるものを設定することが可能です。

また、異なるターゲットの顧客にストアフロントを適合させることができます。例えば、服を販売するショップ場合、子供用の服のみ、異なるデザインのストアフロントを作成できるため、顧客に対してショップをまったく別の店のように見せることができます。

👍

ストアフロントの詳細については、YouTubeでこのビデオをご覧ください。(英語)

ショップの管理

一般設定ショップでストアフロントを管理することが出来ます。ストアフロントで設定可能な主なパラメーターは次のとおりです。

*ショップ名

  • ショップフロントのURL : example.comなどのストアフロントのドメイン。ストアフロントがサブフォルダーにある場合は、たとえばexample.com/stores/のように指定する必要があります。このパラメーターは、顧客エリアのショップフロントを定義します。

CS-Cartは、次のデータベーステーブルを使用して、ストアフロントに関する情報を保存します。

  • cscart_companies —ストアフロントの主なパラメーターが保存されます。

  • cscart_company_descriptions —ストアの言語ごとの説明が保存されます。

管理パネル

管理パネルには、それぞれのオブジェクトを管理する2つのモードがあります。

  • すべてのショップ -管理者は、ストアのすべてのオブジェクトと設定を管理します。
  • 選択されたショップ-管理者は1つの特定のストアフロントを管理します。

テーマなどの一部のインターフェイスでは、選択されたショップモードに切り替える必要がある場合があります。この場合、管理者はショップフロントを選択するように促されます。

オブジェクトのタイプ

オブジェクトは、特定のストアフロントに属するか、属さないかの2つのタイプに分けることができます。以下に、2つの標準的なのCS-Cartオブジェクトをリストにしています。アドオンは、これらのリストのいずれかにオブジェクトを追加できます。

特定のショップフロントに属するオブジェクト

  • 商品のカテゴリ
  • ページ
  • 支払い方法
  • 商品の追加情報
  • 商品オプション
  • 商品
  • キャンペーン
  • 配送方法
  • ユーザー
  • テーマ
  • 注文
  • フィルター

これらには、company_idフィールドがあります。管理者は、「すべてのショップ」モードでオブジェクトにアクセスするか、「特定のショップフロントを選択した」モードでアクセスする必要があります。

特定のショップフロントに属さないオブジェクト

  • 言語
  • 通貨
  • 会員情報フィールド

これらのオブジェクトは、「すべてのショップ」モードでのみ編集できます。これらのオブジェクトはストアフロントに直接関連していません。(すべてのショップで共通の項目)

共有オブジェクト

CS-Cartには、異なるショップフロントから別のショップフロントのオブジェクトへのアクセスを提供する共有のメカニズムがあります。1つのストアフロントに固有のオブジェクトを持つことも、それを複数のショップフロント間で共有することもできます。

オブジェクトを編集できるのはルート管理者のみです。
一部のストアフロント管理者は読み取りのみ可能です。

スキーマ

共有可能なオブジェクトはスキーマにより設定されます。
例:

<?php
'shippings' => array(
    'controller' => 'shippings',
    'api' => 'shippings',
    'mode' => 'update',
    'type' => 'tpl_tabs',
    'params' => array(
        'object_id' => '@shipping_id',
        'object' => 'shippings'
    ),
    'table' => array(
        'name' => 'shippings',
        'key_field' => 'shipping_id',
    ),
    'buttons' => array(
        'type' => 'save_cancel',
        'but_name' => 'dispatch[shippings.update_shipping]',
    ),
    'request_object' => 'shipping_data',
    'have_owner' => true,
),

スキーマの詳細について説明を行います。必須のフィールドには*マークが付いています。

  • controller * —相互作用により共有ルールの処理が対応されるバックエンドコントローラーの名前
  • mode * —コントローラーの操作モード。相互作用により共有ルールの処理が対応されます
  • api — APIエンティティの名前。相互作用により共有ルール処理が対応されます
  • type—表示タイプ;現在tpl_tabsのみ利用可能です
  • params — [ 共有 ]タブテンプレートに渡される配列またはパラメーター
  • object_id —オブジェクト識別子;@を使用して、$_REQUESTからキーの値を取得できます
  • object—オブジェクトの名前。例:言語
  • table —オブジェクトのテーブルに関する情報を含む配列
  • name —テーブルの名前
  • key_field —主キー
  • request_object —$_REQUESTのキーの名前。キーの値は、現在の所有者ストアフロントを見つけるために使用されます
  • have_owner —オブジェクトにオーナーストアフロントがあり、テーブルにcompany_idフィールドがあることを示すフラグ
  • conditions-追加条件を持つ配列
  • display_condition —ストアフロントの選択タブを表示するための条件
  • skip_selection —オブジェクト選択の例外条件
  • no_item_text —言語変数のシンボルコード。その内容はストアフロントの選択タブに表示されます
  • pre_processing —共有テーブルに値を保存する前に実行される関数の名前
  • post_processing —共有テーブルに値を保存した後に実行される関数の名前
  • skip_checking_status —オブジェクトのステータスを更新するときに共有メカニズムを無効にできるフラグ

共有可能なオブジェクト

  • 商品の追加情報
  • 商品オプション
  • 商品フィルター
  • 配送方法
  • 支払い方法
  • キャンペーン
  • 通貨
  • 言語
  • 会員情報フィールド
  • ページ

アドオンでは共有のためのスキーマを拡張し、独自のオブジェクトを追加することが出来ます。

共有プロセス

共有可能なオブジェクトの編集ページには、[ 共有 ]タブがあります。
これはスキーマで指定された設定に応じて表示されます。
タブにリストアップされているストアフロントは、オブジェクトにアクセス可能です。
共有に関する情報は、スキーマのデータに基づいて自動的に保存されます。

クエリが現在のコントローラーによって処理される前に、共有メカニズムによってクエリをインターセプトし、スキーマと照合します。チェックが成功すると、共有メカニズムは共有としてデータを保存します。

共有オブジェクトは、次のフィールドを持つcscart_ult_objects_sharingテーブルに保存されます。

  • share_company_id-店頭識別子
  • share_object_id-オブジェクト識別子
  • share_object_type-オブジェクトタイプのシンボルコード

オブジェクトの選択

スキーマに記述されているオブジェクトを選択すると、元のクエリが拡張され、現在のストアフロントの権限がチェックされます。

company_id=3を使用したストアフロントのページ選択の例を次に示します。

オリジナルのクエリ

SELECT cscart_pages.page_id
  FROM cscart_pages
  WHERE page_id = 2

拡張されたクエリ

FROM cscart_pages
  INNER JOIN cscart_ult_objects_sharing ON (
    cscart_ult_objects_sharing.share_object_id = cscart_pages.page_id
    AND cscart_ult_objects_sharing.share_company_id = 3
    AND cscart_ult_objects_sharing.share_object_type = 'pages'
  )
  WHERE page_id = 2

cscart_ult_objects_sharingテーブルにpage_id = 2の共有ページに関する情報がない場合、クエリは何も値を返しません。

クエリの拡張は自動的に行われます。これにより、db_queryを通して実行されたクエリを分析および拡張できます。クエリを拡張するロジックは、fn_ult_db_query_process関数にあります。
その関数は、標準db_query_processフックのプロセッサーです。

Registryにあるruntime.skip_sharing_selectionの値をtrueに設定することでクエリの拡張を防ぐことが出来ます。

デバッグツール

CS-Cart Debuggerは、すべてのクエリを最終的な形式で表示します。
定義されている場合、DEBUG_QUERIES定数は、db_query関数が呼び出されるたびに最終形式でクエリを表示します。
xdebug + IDEやXdebugは、コードデバッグ用の強力なツールです。

商品の共有

商品は特別なタイプのオブジェクトです。商品には独自の共有スキーマはありませんが、カテゴリ間で共有できます。商品は異なるショップフロントのものを含む複数のカテゴリを持つことができ、カテゴリを介して共有されます。商品を別のショップフロントと共有するには、その商品をショップフロントの任意のカテゴリに割り当てます。

値の再定義

オブジェクトが複数のショップフロントで共有されている場合、その特定のショップフロントのオブジェクトのプロパティを変更することができます。これは値の再定義と呼ばれます。例えば、商品は異なるショップフロントで異なる名前、説明、価格を設定することが出来ます。

これは、オブジェクト・タイプごとに個別に実行されます。現在、これらのオブジェクトの値を再定義できます。

  • 商品
  • 商品オプションのバリエーション
  • 言語変数
  • ステータス

商品

異なるストアフロントで以下の商品プロパティの値を再定義できます。

  • 商品名
  • 商品の簡単な説明
  • 商品の詳しい説明
  • ページタイトル(SEO)
  • メタディスクリプション(SEO)
  • メタキーワード(SEO)
  • 検索ワード
  • プロモーションテキスト
  • 価格

再定義に使用できるプロパティは、コードで指定されています。単純な共有のためのスキーマはありません。CS-Cartでは、次のテーブルを使用して値を保存します。

  • cscart_ult_product_prices
  • cscart_ult_product_descriptions

商品オプションのバリエーション

すべてのストアフロントには、独自のオプションの選択肢の修飾子を設定できます。CS-Cartは、それらをcscart_ult_product_option_variantsテーブルに保存します。

言語変数

個別のショップ選択モードで言語変数の値を編集する場合、これらの値は選択されたストアフロントに対してのみ保存されます。CS-Cartは、これらの値をcscart_ult_language_valuesテーブルに保存します。

ステータス

次のステータスフィールドには、ストアフロントごとに異なる値を設定できます。

  • メールトピック
  • メールヘッダー

CS-Cartは、cscart_ult_status_descriptionsテーブルにこれらの値を保存します。

便利な関数

  • fn_get_company_condition- 必要に応じてcompany_idを条件として使用し、行を返します
  • fn_ult_get_shared_companies-オブジェクトが共有されているストアフロントの識別子を返します
  • fn_ult_is_shared_product-商品がこのストアフロントと共有されているかどうかを確認します
  • fn_ult_get_shared_product_companies-商品が共有されているストアフロントの識別子を返します
  • fn_share_object-特定のストアフロントのオブジェクトを別のストアフロントと共有します
  • fn_share_object_to_all-オブジェクトをすべてのストアフロントと共有します
  • fn_ult_update_share_object-特定のストアフロントとオブジェクトを共有します

設定

設定には2つのタイプがあります。

  • Global setting -特定のストアフロントのみに指定することはできません。すべてのショップモードでのみ使用できます。

  • Store-specific settings –ストアフロントごとに異なる値を設定できます。ショップフロントを個別で選択したモードで使用可能です。これらの設定を[すべてのショップ]モードで編集するには、すべてのストアフロントの設定を更新する必要があります。

すべての設定はcscart_settings_objectsテーブルのedition_typeフィールドで、独自のタイプを定義します。このフィールドにVENDORがある場合、設定はショップ固有のものであり、その値はcscart_settings_vendor_valuesテーブルに保存されます。

レジストリから現在のストアフロントの設定値にアクセスできます。
例:

<?php
Registry::get('settings.Appearance.frontend_default_language')

Settingsクラスを使用して、コードレベルで設定を管理します。
このクラスには、必要なメソッド全てがあります。

ストアフロントURLの定義

ショップフロントでは、個別のドメインまたはメインドメインのサブフォルダーを使用できます。これはショップフロントのURLで指定されています。ショップフロントURLの定義を処理するすべてのロジックは、fn_init_store_params_by_host関数にあります。

ショップフロントが正しく機能するように、Webサーバーを構成して、index.phpが存在しないアドレスに送信されたすべてのリクエストを処理するようにします。

Apache

CS-Cartには、適切に構成された.htaccessが付属しています。
Webサーバー設定でのこのファイルの使用を許可してください。
.htaccessファイルのコードは、必要なすべてのクエリをindex.phpにリダイレクトします。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L,QSA]

Nginx

NginxがPHP(FastCGI、php-fpm)で直接動作する場合、リダイレクトルールを手動で構成します。存在しないファイルとディレクトリをindex.phpにリダイレクトする構成ファイルの一部の例:

location / {
    # index.phpに存在しないファイルやディレクトリに対するすべての要求をリダイレクト
    try_files $uri $uri/ /index.php?$args;
}

location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
    try_files $uri =404;
}

location ~ \.php$ {
    include fastcgi.conf;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
}