2012-02-02 2 views
2

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

$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 

Repository:

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; 
    } 

} 

Может кто-то мне посоветовать, что может быть не так?

ответ

8

Отладка через весь процесс 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]); 
} 

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

3

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

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

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

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

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

  • Сообщите свой материал команде extbase и добавьте его в эту ветку (так как это первый хит google когда вы испытываете ошибку)

+0

спасибо за ваш ответ – pduersteler

Смежные вопросы