2

我在互联网上搜索了这个问题的一个很好的答案,但没有任何结果。我正在尝试删除另一个表中的多行,而不是从执行组件的位置。

基本上,当我在组件 A 中删除 4 行时,这些行也必须在组件 B 中删除。密钥存在于另一个表中,所以这不是问题。我可以通过一些快速而肮脏的 mysql 查询轻松地做到这一点,但我想用 Joomla 的内置方法来做到这一点。

在 joomla 中,从 JControllerAdmin 中使用删除方法,其中使用 getModel 获取模型,然后执行另一个删除方法。但我似乎找不到这个删除方法实际删除行的位置。

顺便说一句,我已经从 JControllerAdmin 复制粘贴了删除方法并将其粘贴到我自己的控制器中。我确实更改了名称,但一切正常

所以现在我求助于 Stackoverflow 来解决我的问题。长话短说:我有一个 customDelete() 方法,它是 JControllerAdmin 类中 delete 方法的相同副本,我想添加允许我使用 customDelete() 方法中的 id 删除另一个表中的行的功能.

我希望这很清楚:)

谢谢!

编辑:这是控制器中的删除方法。我必须从#__modeling(与组件 B 对应的表)中删除所有包含 id 的行$cid

    public function customDelete() {

    // Check for request forgeries
    JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));

    // Get items to remove from the request.
    $cid = JRequest::getVar('cid', array(), '', 'array');

    if (!is_array($cid) || count($cid) < 1) {
        JError::raiseWarning(500, JText::_($this->text_prefix . '_NO_ITEM_SELECTED'));
    } else {
        // Get the model.
        $model = $this->getModel();

        // Make sure the item ids are integers
        jimport('joomla.utilities.arrayhelper');
        JArrayHelper::toInteger($cid);
        // Remove the items.
        if ($model->delete($cid)) {
            $this->setMessage(JText::plural($this->text_prefix . '_N_ITEMS_DELETED', count($cid)));
        } else {
            $this->setMessage($model->getError());
        }
    }
4

1 回答 1

3

这并不难。

基本上,您需要做的就是调用与#__modeling 表相关的不同模型。所以你需要一个我们可以称之为建模的模型,它看起来像:

<?php

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import Joomla modelform library
jimport('joomla.application.component.modeladmin');

/**
 * Modeling Model
 */
class MyModelModeling extends JModelAdmin { 

  /**
   * Returns a reference to the a Table object, always creating it.
   *
   * @param type    The table type to instantiate
   * @param string  A prefix for the table class name. Optional.
   * @param array   Configuration array for model. Optional.
   * @return    JTable  A database object
   * @since 1.6
   */
  public function getTable($type = 'Modeling', $prefix = 'MyTable', $config = array()) 
  {
    return JTable::getInstance($type, $prefix, $config);
  }

}

上面的模型扩展了 JModelAdmin(它有 delete 方法)并告诉 delete 方法从哪个表中删除(因为 getTable 是由 delete() 方法调用的)。它应该进入管理员/您的组件/模型。

您还需要一个 JTable 类,如下所示:

<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_users
 *
 * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * Modeling table class
 *
 * @package     Joomla.Administrator
 * @subpackage  com_users
 * @since       2.5
 */
class MyTableModeling extends JTable
{
    /**
     * Constructor
     *
     * @param  JDatabaseDriver  &$db  Database object
     *
     * @since  2.5
     */
    public function __construct(&$db)
    {
        parent::__construct('#__modeling', 'id', $db);
    }
}

因此,您可以看到 JTable 类指向您要从中删除的表。这应该进入 yourcomponent/tables 文件夹。

然后,您应该能够更改您的 customDelete 方法,如下所示:

 public function customDelete() {

    // Check for request forgeries
    JSession::checkToken() or die(JText::_('JINVALID_TOKEN'));

    // Get items to remove from the request.
    $cid = JRequest::getVar('cid', array(), '', 'array');

    if (!is_array($cid) || count($cid) < 1) {
        JError::raiseWarning(500, JText::_($this->text_prefix . '_NO_ITEM_SELECTED'));
    } else {
        // Get the model.
        $model = $this->getModel();

        // Make sure the item ids are integers
        jimport('joomla.utilities.arrayhelper');
        JArrayHelper::toInteger($cid);
        // Remove the items.
        if ($model->delete($cid)) {
            $this->setMessage(JText::plural($this->text_prefix . '_N_ITEMS_DELETED', count($cid)));
        } else {
            $this->setMessage($model->getError());
        }
        // Get the modeling model
        $new_model = JModelLegacy::getInstance('Modeling','MyModel');
        if ($new_model->delete($cid)) {
          // Items deleted from #__modeling table
        } else {
          // 
        }

    }

高温高压

一种

于 2013-04-25T09:52:19.320 回答