3

私は助けが必要です... SOで質問するのはこれが初めてなので、親切にしてください:)

私はphpからファイルを強制的にダウンロードしようとしているので、ユーザーが特定のボタンを押すと、ファイルがダウンロードされます。このファイルは、すべての登録ユーザーの csv (電子メール、ユーザー名) です。

このスクリーンショットでわかるように、このボタンを管理者 > ユーザー画面に追加することにしましたここに画像の説明を入力

そこで、administrator/components/com_users/views/users/view.html.phpのaddToolbar関数に次のコードを追加しました。

JToolBarHelper::custom('users.export', 'export.png', 'export_f2.png', 'Exportar', false);

このボタンは、com_users\controller\users.php コントローラーの次の関数にマップされます。

public function exportAllUsers() {
    ob_end_clean();
    $app = JFactory::getApplication();

    header("Content-type: text/csv");
    header("Content-Disposition: attachment; filename=ideary_users.csv");
    header("Pragma: no-cache");
    header("Expires: 0");

    echo "email,name\n";

    $model = $this->getModel("Users");
    $users = $model->getAllUsers();

    foreach ($users as $user) {
        echo $user->email . ", " . ucwords(trim($user->name)) . "\r\n";
    }

    $app->close();

}

さて、これは実際には完全にうまく機能しています

ここでの問題は、ファイルをダウンロードした後、管理者で POST を引き起こすボタンを押すと、本来のアクションを実行するのではなく、ファイルをもう一度ダウンロードすることです! 例えば:

  • 「エクスポート」ボタンを押しました
  • 「users.csv」ダウンロード
  • 次に、「検索」ボタンを押しました
  • "users.csv" のダウンロード... 一体何?

エクスポート ボタンを押すと、JS が呼び出されてフォームのアクション属性が URL に設定され、応答などを期待し、他のボタンがフォームのアクション属性を再設定できないようになっていると思います。これに対する本当の解決策は思いつきませんが、できればハッキングは避けたいと思います。

では、この場合に joomla が提供する標準的でエレガントなソリューションは何でしょうか?

4

2 に答える 2

2

欠けているビットは、ツールバー ボタンを処理する Javascript だと思います。デフォルト アクションの新規作成/削除/公開/非公開などを行っているだけであれば、何も追加する必要はありません。

ただし、カスタム ボタンの場合は、通常、デフォルトの動作をオーバーライドする必要があります (ページが返されることを期待しているため、いくつかの非表示のフォーム値が設定され、更新が発生し、発生した問題が発生することはありません)。

submitbutton()したがって、通常、ボタンはfromに依存していますincludes/js/joomla.javascript.js

function submitbutton(pressbutton) {
  submitform(pressbutton);
}

とりわけ、task入力フィールドの値を#adminFormボタンタスクに設定します。つまり、あなたの場合user.export

または同様com_users/views/users/tmpl/default.phpの方法でメソッドを呼び出すには、Javascript を追加する必要があります。window.location

デフォルトの動作が必要ないため、次のsubmitbutton()ような独自のオーバーライドを作成する必要があります。

function submitbutton(pressbutton) {
    // Check if it's your button
    if(pressbutton == 'users.export') {
        // Call your method with something like this:
        window.location = 'index.php?option=com_users&task=users.export'
        // That should be it, this way you don't set the task value for future clicks
    } else {
      // If not follow the normal path
      document.adminForm.task.value=pressbutton;
      submitform(pressbutton);
    }
}

詳細については、 Joomla Doc の Web サイトのアーカイブ セクションを参照してください。

于 2013-11-06T03:50:26.283 に答える
1

このコードをView Controllerに追加してください

function export(){

    ob_end_clean();
    $app = JFactory::getApplication();

    header("Content-type: text/csv");
    header("Content-Disposition: attachment; filename=slic_student.csv");
    header("Pragma: no-cache");
    header("Expires: 0");

    echo "ID,School Name,Student Name,Student No\n";

    $model = $this->getModel("students");
    $users = $model->export_query();

    foreach ($users as $user) {
        echo $user->student_id . ", " . ucwords(trim($user->school_name)) . ", " . ucwords(trim($user->student_name)) . ", " . ucwords(trim($user->student_no)) . "\r\n";
    }
    $app->close();
}

これをview.html.phpに追加します

  JToolBarHelper::custom('students.export','','', 'CSV Export', false);
于 2016-08-24T04:59:45.677 に答える