Typo3 foreign_table & foreign_table_where в TCA

Я борюсь со следующей проблемой.

У меня есть две таблицы базы данных: «Книги» и «Категория». Я получаю все данные из таблицы "книг" через Sysfolder в Backends List-view для редактирования, сортировки и управления ими.

Я бы хотел, чтобы в этом списке было также название категории, к которой принадлежит книга.

В таблице «Книги» есть поле внешнего ключа "category_id", которое определяет, к какой категории принадлежит Книга. Я пытался с помощью этого "category_id" получить имя категории в виде списка книг.

Когда я определяю в TCA['books'] это category_id как:

'category_id' => array (        
            'exclude' => 0,     
            'label' => 'Cat name',      
            'config' => array (
                'type'     => 'select',
                'foreign_table' => 'category',
                'foreign_table_where' => 'AND category.id=###REC_FIELD_category_id###',
                'eval'     => 'int',
                'checkbox' => '0',
                'default' => 0
            )
        ),

он связывает книги и категории с помощью category_id (в таблице книг) и uid (в таблице категорий).

Не хотелось бы, чтобы он связывал их с помощью category_id (в таблице книг) и id (в таблице категорий). Этот идентификатор является идентификатором категории и может отличаться от этого идентификатора.

Я что-то делаю не так, или Typo3 каким-то образом автоматически устанавливает это «соединение» с внешними таблицами uid. ? Есть ли способ получить это так, как я хотел бы?


person Andrew    schedule 16.03.2012    source источник


Ответы (2)


Боюсь, что невозможно указать другой внешний ключ. Так что, если кто-то не докажет, что я ошибаюсь, вот обходной путь, который я бы использовал.

itemsProcFunc из select позволяет полностью переопределить элементы в меню и, таким образом, создать другое отношение.

  1. Создайте дополнительный класс, который будет загружен только в бэкэнд и будет иметь метод, который будет вызываться в itemsProcFunc:

    yourMethod($PA, $fobj)

  2. Сделайте метод для загрузки всех категорий, которые вы хотите иметь, в поле SELECT и установите их в $PA['items'], полностью переопределив его так, чтобы это был массив массивов, где ключ 0 - это заголовок элемента, а ключ 1 - это идентификатор категории, который вы хотеть. См. items в выберите.

    $PA['items'] = array(array($title, $id, ''));

  3. Включите класс в ext_tables.php:

    if(TYPO3_MODE == 'BE') require_once(t3lib_extMgm::extPath($_EXTKEY).'class.YOUR_CLASS.php');

  4. Установите конфиг для поля категории в таблице книг:

    'itemsProcFunc' => 'tx_YOUR_CLASS->yourMethod',

person tmt    schedule 16.03.2012
comment
Спасибо за Ваш ответ. Я пробовал так. Итак, я создал файл класса в папке typo3conf / ext / MY_EXTENSION. - person Andrew; 16.03.2012
comment
Спасибо за Ваш ответ. Я пробовал так. Итак, я создал файл класса в папке typo3conf / ext / MY_EXTENSION. В этом файле я создал класс с методом. Я включил класс в ext_tables.php И в конце я установил itemsProcFunc в конфигурации для поля категории в свой метод. Я что-то не так понял сейчас. Я попытался получить ответ, выполнив простое эхо и завершив свой метод, но ничего не происходит, когда я загружаю представление списка в Backend, оно появляется, как и раньше. - person Andrew; 16.03.2012
comment
Если вы проверяете только с echo, убедитесь, что вы действительно не получаете результат. Обратите внимание, что вывод эха может быть скрыт за полями формы и не будет в начале HTML-кода, а также убедитесь, что вы проверяете правый фрейм. Возможно, будет лучше проверить, изменив $PA['items'], как на шаге 2. Если вы действительно ничего не получаете, убедитесь, что вы не сделали никакой ошибки - что класс включен и что вы установили itemsProcFunc на правильный класс и метод. - person tmt; 20.03.2012

В дополнение к замечательному ответу cascaval: @cascaval: Вы не против указать на select.items в Typo3TCA в избранных ссылках? Текущие ссылки не прямолинейны.

http://docs.typo3.org/typo3cms/TCAReference/singlehtml/#columns-select-properties-items

(нет разрешения комментировать ваш ответ, поэтому мне пришлось отвечать только по этой ссылке ... странно)

person Radagast    schedule 23.01.2015