Я только изучаю SilverStripe, и у меня проблемы с уроками на сайте Silverstripe.
У меня есть этот класс:
namespace SilverStripe\Lessons;
use Page;
class ArticlePage extends Page
{
private static $can_be_root = false;
private static $db = [
'Date' => 'Date',
'Teaser' => 'Text',
'Author' => 'Varchar(255)',
];
// public function getCMSFields(){
// $fields = parent::getCMSFields();
// $fields = addFieldToTab();
// return $fields;
// }
}
Теперь, когда я в / dev / build, я получаю этот отзыв на странице сборки:
Итак, что я сделал дальше, так это закомментировал объявление массива $ db. Затем я получил этот отзыв от dev / build:
Несколько вещей, в которых я не уверен. Красное примечание в первом выводе dev / build гласит, что вы должны определить имя_таблицы для всех моделей пространства имен. Это действительно не утверждает, что у меня есть table_name, которое не определено. Но следующая заметка под ним гласит, что table_name не установлено для класса SilverStripe \ Lessons \ ArticlePage. Так является ли определение table_name и «установка» table_name одним и тем же в контексте этих сообщений?
Кроме того, второй вывод указывает, что имя_таблицы было определено для SilverStripe \ Lessons \ ArticlePage
Я полагаю, тот факт, что к каждому имени таблицы добавлено «2», является результатом моих экспериментов. то есть, как только я увидел это поведение, я повторил эксперимент, чтобы попытаться воспроизвести поведение, и, следовательно, было создано и удалено больше таблиц, и поэтому их имена пришлось увеличивать.
Итак, почему ArticlePage table_name не установлен?
Кто-нибудь может мне помочь с этим вопросом?
Дэйв.
Сообщение означает, что вы должны настроить table_name
для ваших страниц (и DataObjects), которые будут иметь свою собственную таблицу базы данных.
В вашем собственном коде это лучше всего достигается путем добавления частного статического свойства, например:
private static $table_name = 'ArticlePage';
Чтобы избежать столкновения имен, хорошей идеей является добавление префиксов имен таблиц к собственному названию компании или подобному. Но это действительно очень важно, если вы разрабатываете модуль или другой код, который будет работать в нескольких контекстах.
Альтернативой использованию статического свойства было бы определить его через YML. Так в вашем _config/mysite.yml
вы бы положили:
SilverStripe\Lessons\ArticlePage:
table_name: ArticlePage
Замечания: Изменение с table_name
был введен после SilverStripe 4.0.0 и, следовательно, урок, вероятно, не охватывал эту тему.
Других решений пока нет …