Joomla - 强制文件下载/ CSV导出

时间:2013-11-05 03:21:01

标签: php csv joomla

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

我正在尝试强制从php下载文件,因此当用户点击某个按钮时,他会获得文件下载。该文件是所有注册用户的csv(电子邮件,用户名)。

我决定将此按钮添加到管理员>用户屏幕,您可以在this screenshot enter image description here中看到。

所以我将以下代码添加到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 ...并期望响应或其他内容,然后其他按钮是阻止重新设置表单的action属性。我无法想到任何真正的解决方案,但如果可能的话,我宁愿避免黑客攻击。

那么,在这种情况下,joomla提供的标准,优雅的解决方案是什么?

2 个答案:

答案 0 :(得分:2)

我认为您缺少的是处理工具栏按钮的Javascript,如果您只是执行默认操作New / Delete / Publish / Unpublish等,则无需添加任何内容。

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

通常,按钮取决于submitbutton()

中的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);
    }
}

您可以在here

的存档部分找到更多Joomla Doc's website.

答案 1 :(得分: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);