Joomla 调用另一个模型并填充数据
Joomla Call another Model and fill data
我正在为 Joomla 开发一个 Joomla 组件 3.x。
该组件用于会计和管理财产。
在 属性 视图中,我制作了一个按钮,用于转到另一个视图,用于上传文件。
我已经在 URL 中给出了对象 ID,但我认为这有点不安全,而且使用重定向也更难管理。
我找不到正确的方法。我的想法是在 属性 视图中获取模型并设置 属性 id,然后单击按钮时它会跳转到该视图。
我在视图中添加了这一行,但这是错误的,因为如果发生错误,它不会存储 属性 的 ID,所有其他数据都会被存储。
$jinput = JFactory::getApplication()->input;
if (empty($this->item->object_id))
{
$this->item->object_id = $jinput->get('object_id', '');
$this->form->setValue('object_id', null, $this->item->object_id);
}
我想我应该在模型中插入这些数据,但我不知道在哪里以及如何插入。
谁能告诉我如何以正确的方式做到这一点?
还有没有一种简单的方法可以重定向回被调用的视图?
到目前为止,我是这样做的:
查看 属性 的详细信息:
<div class="action-bt">
<?php $upload_pdf = JRoute::_('index.php?option=com_immo&back=object_detail&view=pdfupload&layout=edit&object_id=' . (int) $this->object->id); ?>
<a href="<?php echo $upload_pdf; ?>"><?php echo JText::_('PDF Upload') ?></a>
</div>
上传控制器
$return = parent::cancel($key);
$back = $this->input->get('jform', array(), 'array');
if (!empty($this->input->get('back')))
{
$url
= \JRoute::_('index.php?option=com_immo&view=object&layout=detail&task=object.detail&id=' . $back['object_id'], false);
// Redirect back to the edit screen.
$this->setRedirect(
$url
);
}
return $return;
编辑 tmpl
<input type="hidden" name="back" value="<?php echo isset($_GET['back']) ? $_GET['back'] : '' ?>"/>
感谢您的帮助
编辑
我有 2 个浏览量:
1. 属性 视图,重定向到 PDFUpload(编辑)页面以添加新的 PDF
2. PDF 列表视图,点击新建时也会打开 PDFUpload(编辑)视图
userState 是一个很好的提示。
但现在我的问题是如何正确重定向到调用视图
我认为这也可以通过 userState
来完成
但我不确定是否有正确的方法来做到这一点。
在取消功能上,我看到有一行代码:
// Check if there is a return value
$return = $this->input->get('return', null, 'base64');
if (!is_null($return) && \JUri::isInternal(base64_decode($return)))
{
$url = base64_decode($return);
}
您在视图中的按钮将 link 到控制器。请注意,您不要在此处设置视图或布局。
use \Joomla\CMS\Router\Route;
<a class="btn btn-primary" href="<?php echo Route::_('index.php?option=com_immo&task=object.edit&id=' . $back['object_id'], false); ?>">Edit Object</a>
在你的controller函数中,你可以将当前正在编辑的id设置为State。
use \Joomla\CMS\Factory;
use \Joomla\CMS\Router\Route;
public function edit($key = NULL, $urlVar = NULL)
{
$app = Factory::getApplication();
// Get the previous edit id (if any) and the current edit id.
$previousId = (int) $app->getUserState('com_immo.edit.object.id');
$editId = $app->input->getInt('id', 0);
// Set the user id for the user to edit in the session.
$app->setUserState('com_immo.edit.object.id', $editId);
// Get the model.
$model = $this->getModel('ObjectForm', 'ImmoModel');
// Check out the item
if ($editId)
{
$model->checkout($editId);
}
// Check in the previous user.
if ($previousId)
{
$model->checkin($previousId);
}
// Redirect to the edit screen.
$this->setRedirect(Route::_('index.php?option=com_immo&view=object&layout=edit', false));
}
该任务随后会将用户重定向到编辑页面。您可以通过以下方式访问 ID:
$editId = $app->getUserState('com_immo.edit.object.id');
您可以在 Joomla API 页面阅读更多内容
https://api.joomla.org/cms-3/classes/JApplication.html#method_getUserState
我正在为 Joomla 开发一个 Joomla 组件 3.x。
该组件用于会计和管理财产。
在 属性 视图中,我制作了一个按钮,用于转到另一个视图,用于上传文件。
我已经在 URL 中给出了对象 ID,但我认为这有点不安全,而且使用重定向也更难管理。
我找不到正确的方法。我的想法是在 属性 视图中获取模型并设置 属性 id,然后单击按钮时它会跳转到该视图。
我在视图中添加了这一行,但这是错误的,因为如果发生错误,它不会存储 属性 的 ID,所有其他数据都会被存储。
$jinput = JFactory::getApplication()->input;
if (empty($this->item->object_id))
{
$this->item->object_id = $jinput->get('object_id', '');
$this->form->setValue('object_id', null, $this->item->object_id);
}
我想我应该在模型中插入这些数据,但我不知道在哪里以及如何插入。
谁能告诉我如何以正确的方式做到这一点?
还有没有一种简单的方法可以重定向回被调用的视图? 到目前为止,我是这样做的:
查看 属性 的详细信息:
<div class="action-bt">
<?php $upload_pdf = JRoute::_('index.php?option=com_immo&back=object_detail&view=pdfupload&layout=edit&object_id=' . (int) $this->object->id); ?>
<a href="<?php echo $upload_pdf; ?>"><?php echo JText::_('PDF Upload') ?></a>
</div>
上传控制器
$return = parent::cancel($key);
$back = $this->input->get('jform', array(), 'array');
if (!empty($this->input->get('back')))
{
$url
= \JRoute::_('index.php?option=com_immo&view=object&layout=detail&task=object.detail&id=' . $back['object_id'], false);
// Redirect back to the edit screen.
$this->setRedirect(
$url
);
}
return $return;
编辑 tmpl
<input type="hidden" name="back" value="<?php echo isset($_GET['back']) ? $_GET['back'] : '' ?>"/>
感谢您的帮助
编辑
我有 2 个浏览量: 1. 属性 视图,重定向到 PDFUpload(编辑)页面以添加新的 PDF 2. PDF 列表视图,点击新建时也会打开 PDFUpload(编辑)视图
userState 是一个很好的提示。
但现在我的问题是如何正确重定向到调用视图 我认为这也可以通过 userState
来完成但我不确定是否有正确的方法来做到这一点。 在取消功能上,我看到有一行代码:
// Check if there is a return value
$return = $this->input->get('return', null, 'base64');
if (!is_null($return) && \JUri::isInternal(base64_decode($return)))
{
$url = base64_decode($return);
}
您在视图中的按钮将 link 到控制器。请注意,您不要在此处设置视图或布局。
use \Joomla\CMS\Router\Route;
<a class="btn btn-primary" href="<?php echo Route::_('index.php?option=com_immo&task=object.edit&id=' . $back['object_id'], false); ?>">Edit Object</a>
在你的controller函数中,你可以将当前正在编辑的id设置为State。
use \Joomla\CMS\Factory;
use \Joomla\CMS\Router\Route;
public function edit($key = NULL, $urlVar = NULL)
{
$app = Factory::getApplication();
// Get the previous edit id (if any) and the current edit id.
$previousId = (int) $app->getUserState('com_immo.edit.object.id');
$editId = $app->input->getInt('id', 0);
// Set the user id for the user to edit in the session.
$app->setUserState('com_immo.edit.object.id', $editId);
// Get the model.
$model = $this->getModel('ObjectForm', 'ImmoModel');
// Check out the item
if ($editId)
{
$model->checkout($editId);
}
// Check in the previous user.
if ($previousId)
{
$model->checkin($previousId);
}
// Redirect to the edit screen.
$this->setRedirect(Route::_('index.php?option=com_immo&view=object&layout=edit', false));
}
该任务随后会将用户重定向到编辑页面。您可以通过以下方式访问 ID:
$editId = $app->getUserState('com_immo.edit.object.id');
您可以在 Joomla API 页面阅读更多内容 https://api.joomla.org/cms-3/classes/JApplication.html#method_getUserState