Я хочу построить телефонную книгу на основе таблицы fe_users
.
Поэтому я использовал EXT: extensionbuilder для улучшения таблицы некоторыми полями. с помощью этой заглушки я попытался создать несколько списков (несколько представлений с разной группировкой и упорядочением) и подробное представление.
В то время как дополнительные поля вставлены в базу данных, а из кода, сгенерированного компоновщиком расширений, доступен модуль У меня большие проблемы с работой представлений.
Сначала просмотр списка много пропустил. Я добавил элемент управления для начальной страницы и глубины рекурсии и добавил эти параметры в метод findAll()
хранилища.
Поскольку сгенерированный код не работает, мне пришлось полностью его заменить, и мне нужно было вставить все данные поля также в моей модели унаследованного домена (требовалось только объявление, нет getter()
или setter()
)
Теперь я хочу, чтобы подробный вид (действие show
) работал.
Поэтому мне нужно вставить рабочий код в findByUid()
класса репозитория. Как и ожидалось из представления списка, сгенерированный код также не работал.
первая ошибка:
(1/2) #1297759968 TYPO3\CMS\Extbase\Property\Exception
Exception while property mapping at property path "": It is not allowed to map property "address".
You need to use $propertyMappingConfiguration->allowProperties('address') to enable mapping of this property.
, поскольку ошибка повторялась для каждого поля, которое я вставил:
public function initializeShowAction() {
$propertyMappingConfiguration = $this->arguments['phonebookItem']->getPropertyMappingConfiguration();
// allow all properties:
$propertyMappingConfiguration->allowAllProperties();
$propertyMappingConfiguration->allowCreationForSubProperty('Tx_Phonebook_PhonebookItem');
// or just allow certain properties
//$propertyMappingConfiguration->allowProperties('address');
}
в моем унаследованном репозитории.
Теперь моя ошибка:
(1/2) #1297759968 TYPO3\CMS\Extbase\Property\Exception
Exception while property mapping at property path "": Creation of objects not allowed.
To enable this, you need to set the PropertyMappingConfiguration Value "CONFIGURATION_CREATION_ALLOWED" to TRUE
У меня нет подсказок, где установить это значение.
Любая помощь приветствуется. даже полная альтернатива для отображения.
Я застрял на fe_useres
, так как это единственный способ получить данные из AD, где информация хранится. В противном случае мне нужен дополнительный импортер для передачи данных из AD в другие записи.
РЕДАКТИРОВАТЬ: мои файлы
Classes/Controller/PhonebookItemController.php
:
<?php
namespace Vendor\Phonebook\Domain\Model;
/**
* PhonebookItem
*/
class PhonebookItem extends \TYPO3\CMS\Extbase\Domain\Model\FrontendUser
{
// Declaration of all new fields and their getter and setter
// like:
/**
* office
*
* @var string
*/
protected $office = '';
/**
* Returns the office
*
* @return string $office
*/
public function getOffice()
{
return $this->office;
}
/**
* Sets the office
*
* @param string $office
* @return void
*/
public function setOffice($office)
{
$this->office = $office;
}
// meanwhile additional: declaration of all fields of the core fields to table fe_users
// like:
/**
* @var string
*/
protected $name = '';
}
Classes/Domain/Repository/PhonebookItemRepository.php
:
<?php
namespace Vendor\Phonebook\Domain\Repository;
use Vendor\Phonebook\Domain\Model\PhonebookItem;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Persistence\QueryInterface;
use TYPO3\CMS\Extbase\Persistence\QueryResultInterface;
use TYPO3\CMS\Extbase\Persistence\Repository;
use TYPO3\CMS\Core\Database\ConnectionPool;
/**
* Class PhonebookItemRepository
*/
class PhonebookItemRepository extends Repository
{
public function __construct(\TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager = NULL) {
if (!$objectManager) {
$objectManager = GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Object\ObjectManager::class);
}
$this->objectType = Vendor\Phonebook\Domain\Model\PhonebookItem::class;
parent::__construct($objectManager);
}
public function findAll($startPage = 0,$recursive = 0)
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('fe_users');
$pidList = $startPage;
if ($recursive) {
$queryGenerator = $this->objectManager->get('TYPO3\\CMS\\Core\\Database\\QueryGenerator');
$pidList = $queryGenerator->getTreeList($startPage, $recursive, 0, '1');
}
$rows = $queryBuilder
// Select one ore more fields …
->select('*')
// … from a table …
->from('fe_users')
// … that fits into this condition.
->where(
// This looks a bit strange, but ensures that the condition is coded in the most suitable way for the database.
$queryBuilder->expr()->in('pid', $pidList, true)
)
->orderBy('username', 'ASC')
->orderBy('name','ASC')
->orderBy('first_name','ASC')
->orderBy('last_name','ASC')
// Run the query …
->execute()
// … and fetch all results as an associative array.
->fetchAll();
return $rows;
/* == Original code from ExtensionBuilder: ==
$this->objectType = Vendor\Phonebook\Domain\Model\PhonebookItem::class;
$query = $this->createQuery();
$this->ignoreEnableFieldsAndStoragePage($query);
$query->getQuerySettings()->setRespectSysLanguage(false);
//$and = [$query->equals('uid', $uid)];
/// @var PhonebookItem $phonebookItem
$phonebookItems = $query
// ->matching($query->logicalAnd($and))
->execute();
return $phonebookItems;
*/
}
}
/Classes/Controller/PhonebookitemController.php
:
<?php
namespace Vendor\Phonebook\Controller;
use Vendor\phonebook\Domain\Repository\PhonebookItemRepository;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
/**
* PhonebookItemController
*/
class PhonebookItemController extends ActionController
{
public $phonebookItemRepository;
public $cobj = NULL;
public $startPage;
public $recursive;
public function __construct() {
$this->phonebookItemRepository = GeneralUtility::makeInstance(\Vendor\Phonebook\Domain\Repository\PhonebookItemRepository::class);
}
/**
* action list
*
* @return void
*/
public function listAction()
{
$this->cObj = $this->configurationManager->getContentObject();
$this->startPage = ($this->settings['pages' ] ?? $this->cObj->data['pages' ]) ?? $this->cObj->data['pid'];
$this->recursive = ($this->settings['recursive'] ?? $this->cObj->data['recursive']) ?? 0;
switch ($this->settings['plugintype']) {
case 'listemployee':
$this->listEmployeeAction();
break;
case 'listoffice':
$this->listOfficeAction();
break;
default:
$phonebookItems = $this->phonebookItemRepository->findAll($this->startPage, $this->recursive);
$this->view->assign('phonebookItems', $phonebookItems);
break;
}
}
public function initializeShowAction() {
$propertyMappingConfiguration = $this->arguments['phonebookItem']->getPropertyMappingConfiguration();
// allow all properties:
$propertyMappingConfiguration->allowAllProperties();
$propertyMappingConfiguration->allowCreationForSubProperty('Tx_Phonebook_PhonebookItem');
// or just allow certain properties
//$propertyMappingConfiguration->allowProperties('address');
}
/**
* action show
*
* @param \Vendor\Phonebook\Domain\Model\PhonebookItem $phonebookItem
* @return void
*/
public function showAction(\Itkr\Phonebook\Domain\Model\PhonebookItem $phonebookItem)
{
$this->view->assign('phonebookItem', $phonebookItem);
}
/**
* action listEmployee
*
* @return void
*/
public function listEmployeeAction()
{
$phonebookItems = $this->phonebookItemRepository->findAll($this->startPage, $this->recursive);
$this->view->assign('phonebookItems', $phonebookItems);
}
/**
* action listOffice
*
* @return void
*/
public function listOfficeAction()
{
$phonebookItems = $this->phonebookItemRepository->findAll($this->startPage, $this->recursive);
$this->view->assign('phonebookItems', $phonebookItems);
}
}
Решение:
Как Даниил упомянуто:
параметр detail- / show-link имеет значение false.
После изменения URL-адреса на правильный формат (<f:variable name="showUrl" value="{f:uri.action(action:'show',arguments:{phonebookItem : entry.uid})}" />
) все дополнительные методы и объявления переменных больше не нужны.