3

カスタムエンティティのバックエンド編集ページで作業しています。さまざまなテキストフィールドを保存するなど、ほとんどすべてが機能しています。ただし、ブールフィールドの値を設定しようとすると問題が発生します。

私が試してみました:

$landingPage->setEnabled(1);
$landingPage->setEnabled(TRUE);
$landingPage->setEnabled(0);
$landingPage->setEnabled(FALSE);

私のデータベースへの変更を永続化するものはないようです。

Magento ORMを使用してブールフィールドをどのように設定する必要がありますか?

編集 私のデータベースを見ると、mysqlはフィールドをtinyint(1)として格納しているため、magentoはこれをboolではなくintと見なしている可能性があります。それでも設定することはできません。

4

2 に答える 2

6

このトピックは私に好奇心をもたらしました。回答はありましたが、強烈なトレースはしていませんが、見つけたものを共有したいと思います。

キャッシュが有効か無効かは関係ありません。テーブルスキーマがキャッシュされます。

保存プロセス中にキャッシュされます。

Mage_Core_Model_Abstract -> save()

Mage_Core_Model_Resource_Db_Abstract -> save(Mage_Core_Model_Abstract $object)


Mage_Core_Model_Resource_Db_Abstract

public function save(Mage_Core_Model_Abstract $object)
{
    ...
    //any conditional will eventually call for:
    $this->_prepareDataForSave($object);
    ...
}

protected function _prepareDataForSave(Mage_Core_Model_Abstract $object)
{
    return $this->_prepareDataForTable($object, $this->getMainTable());
}

Mage_Core_Model_Resource_Abstract

protected function _prepareDataForTable(Varien_Object $object, $table)
{
    $data = array();
    $fields = $this->_getWriteAdapter()->describeTable($table);
    foreach (array_keys($fields) as $field) {
        if ($object->hasData($field)) {
            $fieldValue = $object->getData($field);
            if ($fieldValue instanceof Zend_Db_Expr) {
                $data[$field] = $fieldValue;
            } else {
                if (null !== $fieldValue) {
                    $fieldValue   = $this->_prepareTableValueForSave($fieldValue, $fields[$field]['DATA_TYPE']);
                    $data[$field] = $this->_getWriteAdapter()->prepareColumnValue($fields[$field], $fieldValue);
                } else if (!empty($fields[$field]['NULLABLE'])) {
                    $data[$field] = null;
                }
            }
        }
    }
    return $data;
}

次の行を参照してください。$fields = $this->_getWriteAdapter()->describeTable($table);

Varien_Db_Adapter_Pdo_Mysql

public function describeTable($tableName, $schemaName = null)
{
    $cacheKey = $this->_getTableName($tableName, $schemaName);
    $ddl = $this->loadDdlCache($cacheKey, self::DDL_DESCRIBE);
    if ($ddl === false) {
        $ddl = parent::describeTable($tableName, $schemaName);
        /**
         * Remove bug in some MySQL versions, when int-column without default value is described as:
         * having default empty string value
         */
        $affected = array('tinyint', 'smallint', 'mediumint', 'int', 'bigint');
        foreach ($ddl as $key => $columnData) {
            if (($columnData['DEFAULT'] === '') && (array_search($columnData['DATA_TYPE'], $affected) !== FALSE)) {
                $ddl[$key]['DEFAULT'] = null;
            }
        }
        $this->saveDdlCache($cacheKey, self::DDL_DESCRIBE, $ddl);
    }

    return $ddl;
}

私たちが見ることができるように:

$ddl = $this->loadDdlCache($cacheKey, self::DDL_DESCRIBE);

キャッシュからスキーマをロードしようとします。

値が存在しない場合:if ($ddl === false)

それは1つを作成します:$this->saveDdlCache($cacheKey, self::DDL_DESCRIBE, $ddl);

したがって、この質問で発生した問題は、変更されるモデルを保存した場合(列の追加など)に発生します。

これまでに行われたため$model->save()、スキーマはキャッシュされます。後で彼が新しい列を追加して「保存を行う」と、キャッシュ(新しい列を含まない)からスキーマが読み込まれ、次のようになります。新しい列のデータをデータベースに保存できませんでした

于 2012-08-31T17:44:52.443 に答える
5

var / cache / *を削除します-新しい列がすでにMySQLテーブルに追加されている場合でも、DBスキーマはMagentoによってキャッシュされます。

于 2012-08-30T22:43:10.723 に答える