3

我需要帮助...这是我第一次在 SO 中提出问题,所以请善待 :)

我试图从 php 强制下载文件,所以当用户点击某个按钮时,他会下载文件。该文件是所有注册用户的 csv(电子邮件、用户名)。

我决定将此按钮添加到 admin > users 屏幕,如您在此屏幕截图中所见在此处输入图像描述

所以我在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,如果您只是在执行默认操作 New/Delete/Publish/Unpublish 等,则无需添加任何内容。

但是,对于自定义按钮,您通常必须覆盖默认行为(设置一些隐藏的表单值,因为他们希望返回页面,从而导致刷新并且永远不会遇到您遇到的问题)。

所以通常一个按钮依赖于submitbutton()fromincludes/js/joomla.javascript.js

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

其中包括设置按钮任务的task输入字段的值#adminForm,即在您的情况下user.export

您将需要添加一些 Javascript 以com_users/views/users/tmpl/default.php通过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 网站存档部分找到更多信息。

于 2013-11-06T03:50:26.283 回答
1

将此代码添加到您的视图控制器

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 回答