SilverStripe 3.2 升级 UploadField 不显示文件

SilverStripe 3.2 upgrade UploadField doesn't show files

我正在将 SilverStripe 网站从 3.0 更新到 3.2。但是,升级后某些页面类型上的 UploadField 不显示相关文件。

Solution.php

public static $many_many = array (
    "LinkedDocuments" => "File"
);

public function getCMSFields() {

    $fields = parent::getCMSFields();

    if ($this->ID != 0) {
        $fields->addFieldToTab("Root.Documents", UploadField::create("LinkedDocuments")->setFolderName("assets/solutions/" . $this->URLSegment));
    }

    return $fields;
}

文件扩展名

class SolutionFileExtenstion extends DataExtension {
    private static $belongs_many_many = array('Solutions' => 'Solution');
}

Solution_LinkedDocuments table 看起来很好。这些文件仍然在前端工作。唯一的问题是 UplaodField 是空白的,因此重新保存页面会删除链接文件。

除此之外无法快速发现其他任何错误:

public static $many_many = array (
    "LinkedDocuments" => "File"
);

3.2 包含重大更改,因为以前的版本没有遵循语义版本。

在 3.1 上,静态变量需要声明为私有静态才能正常工作

private static $many_many = array (
    "LinkedDocuments" => "File"
);

参见https://docs.silverstripe.org/en/3.1/changelogs/3.1.0/#upgrading#statics-in-custom-page-classes-need-to-be-private

来自文档:

"Most statics defined in SiteTree and DataObject are affected, for example: $db, $has_one, $has_many, $many_many, $defaults, $allowed_children. The same goes for statics defined in ContentController, e.g. $allowed_actions."

另请查看 3.1.9 和 https://docs.silverstripe.org/en/3.2/upgrading/ 之前的更改日志。

所以这至少是您遇到的一个问题。此外,您可能正在使用许多已弃用的功能,因此您需要注意它们。就个人而言,我还没有 运行 3.2 上的任何东西,也看不到 UploadField 用法有任何直接错误,但我现在无法测试它。

无论如何,您应该已经看到 PHP 由于函数已弃用而出现的错误,尤其是对于私有变量与 public 变量的更改。

显然你还没有,所以我建议你将开发服务器中的站点设置为开发模式并将 PHP 错误级别设置为 E_ALL 和 display_errors on .

或直接查看服务器上的 PHP 错误日志。

问题原来是数据库损坏table。不知道为什么 link 仍在前端工作,但我写了一个任务来重新 link 基于文件名的文件形成数据库的升级前副本并修复它。