TYPO3 extbase: получить родительский объект в объекте модели

У меня есть два (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 для таких обратных ссылок?

На случай, если мне придется реализовать такую ​​обратную ссылку самостоятельно: как вообще предотвратить циклические ссылки (например, при сериализации объектов)?

0

Решение

Я бы справился с проблемой по-другому. Это нет работы контроллера имхо. Это определенно шаблон / просмотр работы. Я бы использовал условия в шаблоне, чтобы показать правильный макет (поле редактируемое или нет). После этого вы должны убедиться, что никто не сможет сделать поля редактируемыми, например, с помощью инструментов разработчика.

Этого можно достичь, добавив условия в логику бэкэнда, например:

if($model->isAllowedProperty) { AddFieldToResultArrOrSimilar() }
0

Другие решения

Как я понимаю шаблон 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 для включения или отключения определенных полей формул в зависимости от выбранного частного / коммерческого статуса.
Вы также можете настроить шаблоны жидкостей для рендеринга / не рендеринга определенных деталей в зависимости от варианта модели, используемого в контроллере.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector