Как я могу улучшить fe_users в TYPO3? - PullRequest
0 голосов
/ 13 марта 2020

Я хочу построить телефонную книгу на основе таблицы 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})}" />) все дополнительные методы и объявления переменных больше не нужны.

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Указанное поведение является механизмом безопасности Extbase. Extbase не позволит изменять данные сохраненной записи с помощью запросов GET.

Вы вызываете showAction, вероятно, методом запроса GET и отправляете данные. Они не могут быть нанесены на карту, и это хорошо. Плохо то, что вам нужно выяснить, почему эти поля отправляются через запрос.

Таким образом, проблема заключается в вашем шаблоне, или где вы строите запрос / URL.

Нет нужно для вашего initializeAction.

Также не создавайте пользовательские логи c для storagePid, придерживайтесь существующих полей в tt_content, и extbase будет уважать их из коробки.

0 голосов
/ 16 марта 2020

Я думаю, вам следует расширить пользовательскую модель внешнего интерфейса с помощью конфигурации Typoscript, а затем настроить модель, репозиторий и создать контроллер для элементов телефонной книги. Пример: https://extcode.github.io/cart_snippets/posts/how-to-extend-product-models-part-one

...