FOF30\Model\DataModel::canDelete PHP 메소드

canDelete() 공개 메소드

Generic check for whether dependencies exist for this object in the db schema. This method is NOT used by default. If you want to use it you will have to override your delete(), trash() or forceDelete() method, or create an onBeforeDelete and/or onBeforeTrash event handler.
public canDelete ( integer $oid = null, array $joins = null ) : void
$oid integer The primary key of the record to delete
$joins array Any joins to foreign table, used to determine if dependent records exist
리턴 void
    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);
            }
        }
    }