Extbase хранит пустые значения в базе данных - PullRequest
2 голосов
/ 02 февраля 2012

Я пытаюсь создать объект, но значения не сохраняются в базе данных.Это делается для действия «index», потому что плагин вставляется через TypoScript и фактически не создает выходных данных.Поэтому при вызове действия объект не передается, поэтому я сам его создаю.

$stat = new Tx_MyExt_Domain_Model_Stat;
$stat->setSubscriberId($_COOKIE['statid']);
$stat->setDomain($_SERVER['HTTP_HOST']);
$stat->setRequestUri($_SERVER['REQUEST_URI']);

$this->statRepository = t3lib_div::makeInstance('Tx_myExt_Domain_Repository_StatRepository');
$this->statRepository->add($stat);

Выполнение var_dump($stat) дает следующее:

object(Tx_MyExt_Domain_Model_Stat)#191 (9) {
  ["subscriber_id":protected]=>
  string(1) "2"
  ["domain":protected]=>
  string(22) "test.localhost.example"
  ["request_uri":protected]=>
  string(26) "/testpage/index.php?id=2"
  ["uid":protected]=>
  NULL
  ["_localizedUid":protected]=>
  NULL
  ["_languageUid":protected]=>
  NULL
  ["pid":protected]=>
  NULL
  ["_isClone":"Tx_Extbase_DomainObject_AbstractDomainObject":private]=>
  bool(false)
  ["_cleanProperties":"Tx_Extbase_DomainObject_AbstractDomainObject":private]=>
  NULL
}

Так выглядиткак значения назначены правильно.Но при просмотре базы данных я получаю следующее:

uid    pid    subscriber_id    domain    request_uri    crdate  
13     0      0                NULL      NULL           1328176026 

Репозиторий:

class Tx_MyExt_Domain_Repository_StatRepository extends Tx_Extbase_Persistence_Repository
{}

Модель:

class Tx_MyExt_Domain_Model_Stat extends Tx_Extbase_DomainObject_AbstractEntity 
{

    /**
     * @var int
     * @dontvalidate
     */
    protected $subscriber_id = 0;

    /**
     * @var string
     * @dontvalidate
     */
    protected $domain = '';

    /**
     * @var string
     * @dontvalidate
     */
    protected $request_uri = '';



    /**
     * @param int $susbcriber_id Subscriber id
     * @return void
     */
    public function setSubscriberId($subscriber_id) 
    {
        $this->subscriber_id = $subscriber_id;
    }

    /**
     * @return int Susbcriber id
     */
    public function getSubscriberId() 
    {
        return $this->subscriber_id;
    }

    /**
     * @param string $domain Domain
     * @return void
     */
    public function setDomain($domain)
    {
        $this->domain = $domain;
    }

    /**
     * @return string Domain
     */
    public function getDomain() 
    {
        return $this->domain;
    }

    /**
     * @param string $request_uri Request URI
     * @return void
     */
    public function setRequestUri($request_uri)
    {
        $this->request_uri = $request_uri;
    }

    /**
     * @return string Request URI
     */
    public function getRequestUri() 
    {
        return $this->request_uri;
    }

}

Может кто-нибудь дать мне совет, что может бытьздесь не так?

Ответы [ 2 ]

8 голосов
/ 03 февраля 2012

Отлажено через весь процесс extbase. Кажется, что в typo3/sysext/extbase/Classes/Persistence/Backend.php атрибуты пропущены в этой строке:

if (!$dataMap->isPersistableProperty($propertyName) || $this->propertyValueIsLazyLoaded($propertyValue)) continue;

Это потому что $dataMap->isPersistableProperty($propertyName) ничего не возвращает. Расследование в typo3/sysext/extbase/Classes/Persistence/Mapper, есть:

/**
 * Returns TRUE if the property is persistable (configured in $TCA)
 *
 * @param string $propertyName The property name
 * @return boolean TRUE if the property is persistable (configured in $TCA)
 */
public function isPersistableProperty($propertyName) {
    return isset($this->columnMaps[$propertyName]);
}

Так что решение довольно простое: создать действительный TCA. У меня его не было (или слишком минималистично), поскольку таблица, которую я использую, не будет отображаться в бэкэнде

3 голосов
/ 24 марта 2012

Хотя проблема может быть связана с неправильной настройкой TCA, возможны и другие.Например, extbase не нравится, когда вы определяете уникальные ключи, и молча терпит неудачу.

Имея проблемы с несколькими проектами, я теперь использую следующую процедуру отладки для проектов, созданных с помощью компоновщика расширений

  • Удалите свои собственные дополнения из классов, связанных с таблицами, а также из опечатки.Это необходимо сделать для ext_tables.php, ext_tables.sql, всех файлов в Configuration / TCA и Configuration / Typoscript, если вы изменили их состояние в Configuration / ExtensionBuilder / settings.yaml для объединения или сохранения.

  • Проверьте, сохраняет ли ваше приложение сейчас.Если нет, сообщите подробный отчет об ошибке в сборщик расширений.

  • Обычно ваше приложение должно сохранять.Читайте рекурсивно сделанные вами изменения, пока не найдете ошибку.Начните с ext_tables.sql (не забывайте, что вам нужно каждый раз удалять и считывать базу данных), продолжайте с ext_tables.php, Configuration / TCA / * и заканчивайте Configuration / Typoscript (это мой личный опыт, что этот порядокСамый быстрый)

  • Сообщите о своих вещах в команду extbase и добавьте их в эту ветку (так как это первое попадание Google при возникновении ошибки)

...