1

過去 4 日間、この問題で立ち往生しており、どこでもチェックしましたが、解決策が見つかりません。

Prestashop では、顧客 (b2b サイトの場合) の注文履歴ごとに csv ダウンロードを提供する必要があります。これは私がやったことです:

1- OrderDetailController.php をオーバーライドし、 initContent()の下に次のコードを記述します。

if ( !array_key_exists('csv_download', $_GET) ) {
    parent::initContent();
} else if ( array_key_exists('csv_download', $_GET) ) {
    header('Content-type: text/csv');
    header('Content-Type: application/force-download; charset=UTF-8');
    header('Cache-Control: no-store, no-cache');
    header('Content-disposition: attachment; filename="'.'abc'.'_'.date('Y-m-d_His').'.csv"');
    $this->context->smarty->display(_PS_THEME_DIR_.'order-detail-csv.tpl');
}

注文詳細 csv.tpl は次のとおりです。

col1, col2, col3, col4
1,2,3,4
5,6,7,8

(テスト目的でテンプレートに値をハードコードしました)

問題は、リンクをクリックしてこれにアクセスすると、CSV の下部に次のものが追加されることです。

col1, col2, col3, col4
1,2,3,4
5,6,7,8
<!-- MODULE Block footer -->
<div class="block_various_links" id="block_various_links_footer">
<p class="title_block">Information</p>
<ul>
<br />
<b>Notice</b>: Undefined index: PS_CATALOG_MODE in <b>D:\Program_Files\xampp\htdocs  \prestashop\cache\smarty\compile\66\40\fc\6640fcf250c9a844925d45d85c39618c4233b46e.file.blockcms.tpl.php</b> on line <b>93</b><br />
<br />
<b>Notice</b>: Trying to get property of non-object in <b>D:\Program_Files\xampp\htdocs\prestashop\cache\smarty\compile\66\40\fc\6640fcf250c9a844925d45d85c39618c4233b46e.file.blockcms.tpl.php</b> on line <b>93</b><br />
<li class="first_item"><a href="<br />
<b>Notice</b>: Undefined index: link in <b>D:\Program_Files\xampp\htdocs\prestashop\cache\smarty\compile\66\40\fc\6640fcf250c9a844925d45d85c39618c4233b46e.file.blockcms.tpl.php</b> on line <b>93</b><br />
<br />
<b>Notice</b>: Trying to get property of non-object in <b>D:\Program_Files\xampp\htdocs\prestashop\cache\smarty\compile\66\40\fc\6640fcf250c9a844925d45d85c39618c4233b46e.file.blockcms.tpl.php</b> on line <b>93</b><br />
<br />
<b>Fatal error</b>: Call to a member function getPageLink() on a non-object in <b>D:\Program_Files\xampp\htdocs\prestashop\cache\smarty\compile\66\40\fc\6640fcf250c9a844925d45d85c39618c4233b46e.file.blockcms.tpl.php</b> on line <b>93</b><br />

さらに調べたところ、問題は、CSV の下部に出力されているメッセージが「CMS ブロック」と呼ばれるモジュール フックからのものであるということです。admin-> modules->positions-> select CMS block に移動すると、例外フィールドに「orderdetail」と入力して、フッター領域からこのフックを削除できます。

しかし、エラーメッセージは別のフックの別のエラーメッセージに置き換えられ、それも削除すると、延々と続きます。すべてのモジュール位置を編集し、例外として orderdetail を追加するのは現実的ではありません。

prestashop が smarty レイアウトとすべての位置モジュール フックを無視し、純粋な csv (上記の order-detail-csv.tpl で表される) を送信できるように、これを行う適切な方法が必要です。

4

1 に答える 1

1

解決策が見つかりました。理想的にはプレスタショップの方法ではありませんが、仕事はします。

prestashop MVC を使用して顧客に CSV 注文履歴を提供するのではなく (悪夢でした!)、スタンドアロンの php スクリプトを作成して prestashop ルート ディレクトリに配置し、必要な GET パラメータを使用して直接アクセスします。

(私はまだ Prestashop 構成を使用して db に接続し、コンテキスト クラスを使用してユーザーの Cookie データにアクセスしています)

<?php
 require(dirname(__FILE__).'/config/config.inc.php');

$context = Context::getContext();

header('Content-type: text/csv');
header('Content-Type: application/force-download; charset=UTF-8');
header('Cache-Control: no-store, no-cache');
header('Content-disposition: attachment; filename="'.'abc'.'_'.date('Y-m-d_His').'.csv"');

try {
    $csv_string="";

    $conn = new PDO('mysql:host='._DB_SERVER_.';dbname='._DB_NAME_, _DB_USER_, _DB_PASSWD_);

    $query = " SELECT
            o.*,
            od.*
        FROM
            orders o
        INNER JOIN
            order_detail od ON od.id_order = o.id_order
        WHERE
            o.id_customer = ".$context->customer->id;

    if(isset($_GET['id_order']) && !empty($_GET['id_order'])) {
        $query = $query." AND o.id_order = ".$_GET['id_order'];
    } else if(isset($_GET['from']) && !empty($_GET['from'])) {
        $query = $query." AND o.date_add > '".$_GET['from']."' AND o.date_add < '".$_GET['to']."'";
    }

    //Get column names
    $fetch_type = PDO::FETCH_ASSOC;
    $result = $conn->query($query);
    $col_row = $result->fetchAll($fetch_type);
    $columns = empty($col_row) ? array() : array_keys((array)$col_row[0]);
    //assemble csv
    foreach($columns as $col) {
        $csv_string = $csv_string.$col.', ';
    }

    //get values
    $result = $conn->query($query);
    //assemble csv
    foreach($result as $row) {
         $csv_string = $csv_string."\n";
         foreach($columns as $col) {
             $csv_string = $csv_string . $row[$col].', ';
         }
    }

    echo($csv_string);

    $conn = null;

} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}
?>

明らかに、上記のスクリプトには、ログインしていない人や間違った GET パラメータを使用してアクセスした場合に失敗するのを防ぐための条件付きチェックが必要です (これについては後で行います。このトピックの対象外です)。

少なくとも、私が必要としていたタスクを実行します。

于 2013-08-07T12:20:38.773 に答える