У меня есть два (2) класса:
<?php
class Person extends BaseDto
{
/**
* @var array|PostalAddress
*/
protected $postalAddresses = array();
/**
* @param array|PostalAddress $postalAddresses
*/
public function setPostalAddresses($postalAddresses)
{
$this->postalAddresses = $postalAddresses;
}
/**
* @return array|PostalAddress[]
*/
public function getPostalAddresses()
{
return $this->postalAddresses;
}
}
<?php
class PostalAddress
{
/**
* @var string $privatePersonFirstName
*/
protected $privatePersonFirstName;
/**
* @var string $privatePersonName
*/
protected $privatePersonName;
/**
* @return string
*/
public function getPrivatePersonFirstName()
{
return $this->privatePersonFirstName;
}
/**
* @param string $privatePersonFirstName
*/
public function setPrivatePersonFirstName($privatePersonFirstName)
{
$this->privatePersonFirstName = $privatePersonFirstName;
}
/**
* @return string
*/
public function getPrivatePersonName()
{
return $this->privatePersonName;
}
/**
* @param string $privatePersonName
*/
public function setPrivatePersonName($privatePersonName)
{
$this->privatePersonName = $privatePersonName;
}
}
В контроллере PostalAddressConroller
У меня есть действие, которое создает форму для редактирования одного адреса.
Я хотел бы сделать некоторые поля редактируемыми только при соблюдении определенных условий. Пример. Поля организации в адресе доступны для редактирования только в том случае, если это лицо относится к типу частное лицо, а адрес относится к типу работодатель.
Чтобы реализовать такую проверку условий, я хотел бы создать метод на PostalAddress
модель. Но для этого требуется ссылка на родительский объект внутри контроллера.
Я хотел бы избежать размещения всей логики внутри шаблонов, чтобы шаблоны были чистыми и простыми для понимания.
Есть ли поддержка на уровне extbase для таких обратных ссылок?
На случай, если мне придется реализовать такую обратную ссылку самостоятельно: как вообще предотвратить циклические ссылки (например, при сериализации объектов)?
Я бы справился с проблемой по-другому. Это нет работы контроллера имхо. Это определенно шаблон / просмотр работы. Я бы использовал условия в шаблоне, чтобы показать правильный макет (поле редактируемое или нет). После этого вы должны убедиться, что никто не сможет сделать поля редактируемыми, например, с помощью инструментов разработчика.
Этого можно достичь, добавив условия в логику бэкэнда, например:
if($model->isAllowedProperty) { AddFieldToResultArrOrSimilar() }
Как я понимаю шаблон MVC, модель должна нести только данные, без логики и каких-либо зависимостей.
Таким образом, чтобы решить вашу проблему, я бы использовал два разных класса моделей, основанных на одной и той же таблице, с учетом только тех свойств и метаданных проверки, которые применяются к этой конкретной модели.
Представьте себе эти две модели ниже:
namespace Acme\MyPlugin\Domain\Model;
class PostalAddressPrivate
{
/**
* @var string $privatePersonFirstName
*/
protected $privatePersonFirstName;
/**
* @var string $privatePersonName
*/
protected $privatePersonName;
[...]
}
namespace Acme\MyPlugin\Domain\Model;
class PostalAddressCommercial
{
/**
* @var string $privatePersonFirstName
*/
protected $companyName;
[...]
}
Теперь вы должны сообщить персистентному слою, что эти модели идут в одну таблицу. Вы делаете это в настройке Typoscript для этого плагина.
plugin.tx_myplugin {
persistence {
classes {
Acme\MyPlugin\Domain\Model\PostalAddressPrivate {
mapping {
tableName = tx_myplugin_domain_model_postal_address
}
}
Acme\MyPlugin\Domain\Model\PostalAddressCommercial {
mapping {
tableName = tx_myplugin_domain_model_postal_address
}
}
}
}
Теперь вы можете перенести логику в контроллер и решить, какую модель использовать. Вы можете расширить этот простой случай, используя общий интерфейс или абстрактный класс и т. Д.
Эта логика «выбрать правильную модель» в контроллере может быть иногда немного хитрой. В общем случае вам нужно будет поместить некоторый код, имеющий дело с «сопоставителем свойств» extbase, внутри соответствующего метода initializeXxxAction.
В начале я был вдохновлен этой статьей на немецком языке (для более старой версии extbase!): https://jweiland.net/typo3/codebeispiele/extension-programmierung/extbase-dynamische-validierung.html
Надеюсь, Google Translate поможет вам решить возникающие проблемы.
Кроме того, вы можете помочь проверке и обработке на основе сервера с помощью некоторого внешнего интерфейса. Например. Уловки JavaScript для включения или отключения определенных полей формул в зависимости от выбранного частного / коммерческого статуса.
Вы также можете настроить шаблоны жидкостей для рендеринга / не рендеринга определенных деталей в зависимости от варианта модели, используемого в контроллере.