#typo3 #typo3-9.x #typo3-10.x
#typo3 #typo3-9.x #typo3-10.x
Вопрос:
Я написал расширение, основанное на TYPO3 версии 9. Теперь я установил его в системе TYPO3 версии 10, и, похоже, все работает нормально. Больше нельзя открывать только страницы показа.
Появляется ошибка:
Cannot access protected property mynamemyextensionDomainModelCountry::$name
Я не понимаю ошибки. На странице списка я обычно использую название страны. На страницах показа я его вообще не использую. Так что не имеет никакого смысла, почему это должно вызывать проблемы.
Вот мой Show.html
<div class="card">
<h5 class="card-header" style="text-align: center">
{house.name}
</h5>
<div class="card-body" style="text-align: center">
<p class="card-text">
<f:link.external uri="{house.link}" target="_blank">{house.link}</f:link.external>
</p>
<h2>Rooms</h2>
<ul>
<f:for each="{house.room}" as="room">
<li>{room.name}</li>
</f:for>
</ul>
</div>
</div>
<f:link.action action="list" class="btn btn-primary">
BACK
</f:link.action>
Мой контроллер
class HouseController extends TYPO3CMSExtbaseMvcControllerActionController
{
............
............
/**
* @param House $house
*/
public function showAction(House $house)
{
$this->view->assign('house', $house);
}
Как было сказано ранее, полный код отлично работает в версии 9, в версии 10 проблемы должны быть изменены.
Редактировать: Вот моя модель страны
class Country extends TYPO3CMSExtbaseDomainObjectAbstractEntity
{
/**
* Country Name
*
* @var string
* @TYPO3CMSExtbaseAnnotationValidate("NotEmpty")
*/
protected $name = '';
/**
* Returns the name
*
* @return string $name
*/
public function getName()
{
return $this->name;
}
/**
* Sets the name
*
* @param string $name
* @return void
*/
public function setName($name)
{
$this->name = $name;
}
}
И вот моя домашняя модель (не все строки):
class House extends TYPO3CMSExtbaseDomainObjectAbstractEntity
{
/**
* __construct
*/
public function __construct()
{
//Do not remove the next line: It would break the functionality
$this->initStorageObjects();
}
/**
* Countrie House
*
* @var mynamemyextensionDomainModelCountry
* @TYPO3CMSExtbaseAnnotationORMLazy
*/
protected $country = null;
/**
* Returns the country
*
* @return mynamemyextensionDomainModelCountry $country
*/
public function getCountry()
{
return $this->country;
}
/**
* Sets the country
*
* @param mynamemyextensionDomainModelCountry $country
* @return void
*/
public function setCountry(mynamemyextensionDomainModelCountry $country)
{
$this->country = $country;
}
}
Комментарии:
1. Я не вижу никакой модели страны в вашем HTML и контроллере. Где используется эта модель? А как выглядит модель страны?
2. Точно так же в моем Show HTML нет модели страны. Это безумие. Но каждая модель Дома имеет отношение к одной стране. (Дом находится точно в одной стране, и в доме есть несколько комнат.) Но эта модель также используется в List.html и работает без ошибок.
3. Вы должны предоставить больше информации, каков код модели Дома?
4. Хорошо, я добавил свою модель страны и дома
5. Можете ли вы удалить отложенную часть в своей домашней модели и повторить попытку? Конечно, очистка всех кэшей после удаления.
Ответ №1:
Проблема в том, что вы используете @TYPO3CMSExtbaseAnnotationORMLazy
для прямого отношения к модели. @TYPO3CMSExtbaseAnnotationORMLazy
Аннотация полезна для ее использования ObjectStorage
, ее не рекомендуется использовать напрямую для других моделей.
Ответ №2:
Похоже, это ошибка в ядре TYPO3 — смотрите также: https://forge.typo3.org/issues/92357