max_mara
@max_mara

Magento get table without prefix

Добрый день, есть таблица
<entities>
    <user>
        <table>oem_user</table>
    </user>
</entities>


эта таблица принадлежит другой CMS которая хранит свои пожитки в той-же базе что и Magento

Для мадженто разрабатывается модуль, который должен иметь доступ к таблицам этой CMS, но вот незадача, у мадженто установле префикс mage_

Поэтому
protected function _construct()
{
    $this->_init('mass/user', 'id');
}   

Говорит что
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'hyper.mage_oem_user' doesn't exist

Как сделать так, что-бы префикс не добавлялся к этой таблице?
  • Вопрос задан
  • 3041 просмотр
Пригласить эксперта
Ответы на вопрос 2
max_mara
@max_mara Автор вопроса
Часто так бывает, что сам себя спросил, сам себе ответил.

Я переопределил метод getTableName
и сделал как написано тут

stackoverflow.com/questions/2417134/how-to-override-table-name-andprefix-in-magento-model

class Meta_Mass_Model_Resource extends Mage_Core_Model_Resource
{
    public function getTableName($modelEntity)
    {
        $tableSuffix = null;
        if (is_array($modelEntity)) {
            list($modelEntity, $tableSuffix) = $modelEntity;
        }

        $parts = explode('/', $modelEntity);
        if (isset($parts[1])) {
            list($model, $entity) = $parts;
            $entityConfig = false;
            if (!empty(Mage::getConfig()->getNode()->global->models->{$model}->resourceModel)) {
                $resourceModel = (string)Mage::getConfig()->getNode()->global->models->{$model}->resourceModel;
                $entityConfig  = $this->getEntity($resourceModel, $entity);
            }

            if ($entityConfig && !empty($entityConfig->table)) {
                $tableName = (string)$entityConfig->table;
            } else {
                Mage::throwException(Mage::helper('core')->__('Can\'t retrieve entity config: %s', $modelEntity));
            }
        } else {
            $tableName = $modelEntity;
        }

        Mage::dispatchEvent('resource_get_tablename', array(
            'resource'      => $this,
            'model_entity'  => $modelEntity,
            'table_name'    => $tableName,
            'table_suffix'  => $tableSuffix
        ));

        $mappedTableName = $this->getMappedTableName($tableName);
        if ($mappedTableName) {
            $tableName = $mappedTableName;
        } else {
            if($entityConfig->ignore_prefix) {
                $tablePrefix = '';
            } else {
                $tablePrefix = (string)Mage::getConfig()->getTablePrefix();
            }
            
            $tableName = $tablePrefix . $tableName;
        }

        if (!is_null($tableSuffix)) {
            $tableName .= '_' . $tableSuffix;
        }
        return $this->getConnection(self::DEFAULT_READ_RESOURCE)->getTableName($tableName);
    }    

}


<models>
            <core>
                <rewrite>
                    <resource>Meta_Mass_Model_Resource</resource>
                </rewrite>
            </core>
</models>
Ответ написан
z0rg
@z0rg
senior developer / devops
Дело в том что он (префикс) должен добавляться, это как бы правило движка. Если вы используете вручную созданные таблицы без префикса это не значит что мажента должна знать об этом, вы задали ей название сущности, она получает его и добавляет префикс, все разумно. И переопределять
данный метод я считаю неправильно.
Попробуйте так, но я не уверен за данный способ.
<entities>
    <user>
        <table>oem_user</table>
	<prefix></prefix>
    </user>
</entities>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы