我需要帮助......这是我第一次在SO中提问,所以请善待:)
我正在尝试强制从php下载文件,因此当用户点击某个按钮时,他会获得文件下载。该文件是所有注册用户的csv(电子邮件,用户名)。
我决定将此按钮添加到管理员>用户屏幕,您可以在this screenshot 中看到。
所以我将以下代码添加到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的管理员中的任何按钮,而不是执行它应该执行的操作,它只是再次下载文件! 例如:
我猜测当我点击导出按钮时,会调用JS并将表单的操作属性设置为URL ...并期望响应或其他内容,然后其他按钮是阻止重新设置表单的action属性。我无法想到任何真正的解决方案,但如果可能的话,我宁愿避免黑客攻击。
那么,在这种情况下,joomla提供的标准,优雅的解决方案是什么?
答案 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);