我在互联网上搜索了这个问题的一个很好的答案,但没有结果。我试图删除另一个表中的多个行,而不是从正在执行组件的位置删除。
基本上,当我删除组件A中的4行时,这些行也必须在组件B中删除。该键存在于另一个表中,因此这不是问题。我可以通过一些快速和脏的mysql查询轻松完成它,但我想用Joomla的内置方法来做。
在joomla中,从JControllerAdmin使用delete方法,其中使用getModel获取模型,然后执行另一个delete方法。但我似乎无法找到实际删除行的删除方法所在的位置。
BTW我已经从JControllerAdmin复制粘贴了删除方法并将其粘贴到我自己的控制器中。我确实更改了名称,但一切正常
所以现在我转向Stackoverflow来解决我的问题。简而言之:我有一个customDelete()方法,它是来自JControllerAdmin类的delete方法的相同副本,我想添加一些功能,允许我使用customDelete()方法中的id来删除另一个表中的行
我希望这很清楚:)
谢谢!
编辑:
这是控制器中的delete方法。我必须删除#__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());
}
}
答案 0 :(得分: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);
}
}
<?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方法要删除哪个表(因为getTable是由delete()方法调用的)。它应该在管理员/你的组件/模型中。
您还需要一个JTable类,如下所示:
因此,您可以看到JTable类指向要删除的表。这应该进入yourcomponent / tables文件夹。
然后,您应该能够更改customDelete方法,如下所示:
<?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);
}
}
<?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);
}
}
HTH
A