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