Добавить собственную sys_category для записи с помощью extbase - PullRequest
0 голосов
/ 10 декабря 2018

Я создал таблицу одной из моих моделей, которая хорошо работает, если я задаю категории в Backend.Если я пытаюсь добавить категории через форму интерфейса, я всегда получаю ошибку Call to a member function attach() on null и не имею понятия, почему это так.Может быть, кто-нибудь из вас может помочь.

В контроллере я пытаюсь добавить как обычно, найти категорию

$videoCat = $this->categoryRepository->findByUid(28);

и добавить ее вот так

$this->video->addTxVideoCat($videoCat);

Там, где происходит ошибка.Ниже показано, как я добавил категорию в модель.

-

ext_tables.sql tx_video_cat int(11) DEFAULT '0' NOT NULL,

расширенный tca в TCA / Overrides / sys_template.php

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::makeCategorizable(
    'addvideo',
    'tx_addvideo_domain_model_video',
    // Do not use the default field name ("categories") for pages, tt_content, sys_file_metadata, which is already used
    'tx_video_cat',
    array(
        // Set a custom label
        'label' => 'LLL:EXT:addvideo/Resources/Private/Language/locallang.xlf:video_categories',
        // This field should not be an exclude-field
        'exclude' => FALSE,
        // Override generic configuration, e.g. sort by title rather than by sorting
        // string (keyword), see TCA reference for details
        'l10n_mode' => 'exclude',
        // list of keywords, see TCA reference for details
        'l10n_display' => 'hideDiff',
    )
);

Создано расширенное хранилище категорий

namespace Pixelink\Addvideo\Domain\Repository;

class CategoryRepository extends \TYPO3\CMS\Extbase\Domain\Repository\CategoryRepository

Создано расширенная модель

namespace Pixelink\Addvideo\Domain\Model;

class Category extends \TYPO3\CMS\Extbase\Domain\Model\Category
{}

Отображение категорий в typoscript

plugin.tx_addvideo{
  persistence {
    classes{
      Pixelink\Addvideo\Domain\Model\Category {
        mapping {
          tableName = sys_category
          columns {

          }
        }
      }
    }
  }
}

и в Model \ Video.php я добавил следующее

/**
 * txVideoCat
 *
 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Pixelink\Addvideo\Domain\Model\Category>
 */
protected $txVideoCat = null;

/**
 * Get categories
 *
 * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Pixelink\Addvideo\Domain\Model\Category>
 */
public function getTxVideoCat()
{
    return $this->txVideoCat;
}

/**
 * Set categories
 *
 * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage $txVideoCat
 */
public function setTxVideoCat($txVideoCat)
{
    $this->txVideoCat = $txVideoCat;
}

/**
 * Add category to a post
 *
 * @param \Pixelink\Addvideo\Domain\Model\Category $txVideoCat
 */
public function addTxVideoCat(\Pixelink\Addvideo\Domain\Model\Category $txVideoCat)
{
    $this->txVideoCat->attach($txVideoCat);
}

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Ваш $this->txVideoCat равен null.Используйте метод initiailizeObject(), чтобы назначить его:

public function initializeObject()
{
  $this->txVideoCat = new ObjectStorage();
}
0 голосов
/ 11 декабря 2018

Вы должны инициализировать свою собственность в конструкторе модели Video:

public function __construct()
{
    $this->txVideoCat = new ObjectStorage();
}
...