【问题标题】:TYPO3 set uid to new modelTYPO3 将 uid 设置为新模型
【发布时间】:2018-08-07 14:28:20
【问题描述】:

简单问题:如何将uid设置为新模型? TYPO3 8.7.17。 我尝试添加方法

public function setUid($uid)
{
   $this->uid = $uid;
}

我假设我正在创建一个自定义扩展并且我想将 uid 保存在一个新模型中 但模型不保存。我知道不推荐。但我有需要它的原因。

我需要 id 因为用户每天都从 csv 导入数据。我有相关数据。当用户进行导入 uid 正在更改时。我也无法指定日期。

【问题讨论】:

  • 我假设您正在创建一个自定义扩展并且您想将 uid 保存在模型中,不是吗?
  • 正是我需要的
  • 您应该详细说明[您]需要它的原因。否则我们无法确定是否有更好的解决方案。

标签: php typo3 typo3-8.x


【解决方案1】:

设置uid 不是那么容易,但您可以使用\TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper 从给定的数据数组创建实体实例。

$data = [
  'uid' => 10101,
  'title' => 'Foo Bar Baz',
  …
];

$dataMapper = GeneralUtility::makeInstance(ObjectManager::class)
                ->get(DataMapper::class);

$obj = reset($dataMapper->map(YourModel::class, [data]));

或者您只是创建一个新的模型实例并使用Reflection 更改 uid 属性:

$obj = new YourEntity();
$refl = new ReflectionClass(YourEntity::class);

$refl->getProperty('uid')->setValue($obj, '10101');

在导入的情况下,我更喜欢前一种方式,因为您需要以某种方式将数据映射到实例,而这正是 DataMapper 的用途。

反之,你可以看看here

【讨论】:

  • 如何将经过操作的uid的对象存储在DB中?我通过 Repository 尝试过,但从未设置 uid...
  • 老实说,放弃使用typo3,太疯狂了,我很高兴我忘记了这个问题;)
  • 嗯,虽然 Extbase 有时仍会出现问题,但 TYPO3 的每个版本都变得越来越干净和更好。对于大型 CMS 平台,恕我直言,这是最好的选择。为了解决这个问题,我使用了自己的查询 - 请参阅我的答案。
【解决方案2】:

如果我没记错的话,setUid() 函数已经存在于模型中,通常它只是在你自己的模型类扩展的类中。
因此,您可能已经使用setUid(),而无需将其写入您自己的模型类中。

主要问题是uidauto_increment、索引和主键,因此您必须确保uid 的新值始终是唯一的。
在 TYPO3 中,setUid() 的个人使用可能仍会以某种方式被阻止。

对于与导入相关的挑战,存在扩展名external_import,这可能是您需要的。

【讨论】:

    【解决方案3】:

    我用这样一个简单的行查询来做到这一点:

    $GLOBALS['TYPO3_DB']->sql_query(
                'INSERT INTO my_table (uid,title,pid)
                  VALUES ('.$id.',"'.$title.'",'.$storagePid.')'
            );
    

    【讨论】:

    • 如果我没记错的话,这应该不适用于 t3 9+ ??…
    • 对,除非您安装“typo3db_legacy”扩展程序,否则 V9 不再支持 $GLOBALS['TYPO3_DB']。
    • 然后 t3 的疯狂就来了……我遇到了这个,因为我想克隆一个对象,我认为这并不过分要求,但在 t3 中你不能,除非你破解或有扩展......
    【解决方案4】:

    从 t3 8 开始,您可以(应该)使用学说:

    $connectionPool=GeneralUtility::makeInstance(ConnectionPool::class);
    $queryBuilder = $connectionPool->getQueryBuilderForTable($table);
    $queryBuilder
        ->insert($table)
        ->values([
           'name' => $name,
           'crdate' => time(),
           'pid' => $pid,
           'uid' => $uid        
    ])
    ->execute();
    

    简单而标准。即使在t3。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 2011-06-08
      • 1970-01-01
      相关资源
      最近更新 更多