public function canDelete($oid = null, $joins = null)
{
$pkField = $this->getKeyName();
if ($oid) {
$this->{$pkField} = intval($oid);
}
if (!$this->{$pkField}) {
throw new \InvalidArgumentException('Master table should be loaded or an ID should be passed');
}
if (is_array($joins)) {
$db = $this->getDbo();
$query = $db->getQuery(true)->select($db->qn('master') . '.' . $db->qn($pkField))->from($db->qn($this->tableName) . ' AS ' . $db->qn('master'));
$tableNo = 0;
foreach ($joins as $table) {
// Sanity check on passed array
$check = array('idfield', 'idalias', 'name', 'joinfield', 'label');
$result = array_intersect($check, array_keys($table));
if (count($result) != count($check)) {
throw new \InvalidArgumentException('Join array missing some keys, please check the documentation');
}
$tableNo++;
$query->select(array('COUNT(DISTINCT ' . $db->qn('t' . $tableNo) . '.' . $db->qn($table['idfield']) . ') AS ' . $db->qn($table['idalias'])));
$query->join('LEFT', $db->qn($table['name']) . ' AS ' . $db->qn('t' . $tableNo) . ' ON ' . $db->qn('t' . $tableNo) . '.' . $db->qn($table['joinfield']) . ' = ' . $db->qn('master') . '.' . $db->qn($pkField));
}
$query->where($db->qn('master') . '.' . $db->qn($pkField) . ' = ' . $db->q($this->{$pkField}));
$query->group($db->qn('master') . '.' . $db->qn($pkField));
$this->getDbo()->setQuery((string) $query);
$obj = $this->getDbo()->loadObject();
$msg = array();
$i = 0;
foreach ($joins as $table) {
$pkField = $table['idalias'];
if ($obj->{$pkField} > 0) {
$msg[] = \JText::_($table['label']);
}
$i++;
}
if (count($msg)) {
$option = $this->container->componentName;
$comName = $this->container->bareComponentName;
$tbl = $this->getTableName();
$tview = str_replace('#__' . $comName . '_', '', $tbl);
$prefix = $option . '_' . $tview . '_NODELETE_';
$message = '<ul>';
foreach ($msg as $key) {
$message .= '<li>' . \JText::_(strtoupper($prefix . $key)) . '</li>';
}
$message .= '</ul>';
throw new \RuntimeException($message);
}
}
}