2SXC导入内容项-超链接文件库

时间:2019-02-21 21:01:56

标签: 2sxc

我已经尽力查看了数据库,但是我找不到一种为每个内容项在Hyperlink-Library中导入文件的方法。我看到2sxc使用DNN的“文件和文件夹”表,但是我看不到2sxc内容类型的字段如何链接到文件夹和文件。

基本上,我要导入大约400多个内容项,并且需要导入大约6000多个链接文件。

我认为可能无法直接从XML文件导入文件,但是可以编写sql脚本来将文件链接到内容项吗?

2 个答案:

答案 0 :(得分:1)

由于@iJungleBoy,我已经能够创建一个过程,该过程可以帮助将文件库自动导入到2sxc内容项中。

内容项的导入遵循https://2sxc.org/en/Learn/Import-Export

上的说明

根据他的指导,我创建了一些MS SQL脚本来帮助完成一些繁重的工作。

基本上,我们需要为ADAM文件夹中的文件创建目录结构,并且需要专门命名它们,以便它们与每个内容项正确关联。脚本依赖于一个附加表,该表包含有关要导入的文件的信息,以便可以将它们与先前已导入2sxc的内容项相关联。

以下是一个SQL脚本,可以根据您的需要进行修改:

-- Create function to return content items guid converted to base64
CREATE FUNCTION dbo.import2sxc_BinaryToBase64
(
    @bin VARBINARY(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE @Base64 VARCHAR(MAX)
    SET @Base64 = CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:variable("@bin")))', 'VARCHAR(MAX)')
    RETURN @Base64
END
GO

-- Create function to compress guid for 2sxc
CREATE FUNCTION dbo.import2sxc_GuidCompress
(
    @guidStr VARCHAR(36)
)
RETURNS VARCHAR(22)
AS
BEGIN
    declare @guid uniqueidentifier = @guidStr
    RETURN Substring(Replace(Replace(dbo.import2sxc_BinaryToBase64(@guid), '+', '-'),'/', '_'), 1, 22)
END
GO

-- Define the app name
DECLARE @appName nvarchar(255) = 'MyAppName'

-- Define the name of the content type
DECLARE @contentType nvarchar(150) = 'MyContentType'

-- Set the path for the adam files for the app
DECLARE @adamPath nvarchar(max) = 'c:\path\to\Portals\x\adam'

-- For importing images, get the name of the field that holds the id of the record from the original system
DECLARE @idFieldname nvarchar(50) = 'OriginalId'



-- Get the attribute set id for the content item
DECLARE @attributeSetId int
SELECT @attributeSetId = AttributeSetID FROM dbo.ToSIC_EAV_AttributeSets WHERE Name = @contentType


-- Get the attribute id 
DECLARE @attributeId int
SELECT @attributeId = a.AttributeID
FROM dbo.ToSIC_EAV_Attributes a
INNER JOIN dbo.ToSIC_EAV_AttributesInSets ais on a.AttributeID = ais.AttributeID
WHERE ais.AttributeSetID = @attributeSetId AND StaticName = @idFieldname


-- Get all the content items, along with the compressed guid for the folder name, and generate the commands to create the direcctories
SELECT v.Value as SourceId, EntityGUID, dbo.import2sxc_GuidCompress(EntityGUID) as FolderName, 'mkdir "' + @adamPath + '\' + @appName + '\' +  dbo.import2sxc_GuidCompress(EntityGUID) + '\Photos"' as cmdMkdir
FROM ToSIC_EAV_Entities e
INNER JOIN ToSIC_EAV_Values v ON e.EntityID = v.EntityID AND v.AttributeID = @attributeId
WHERE AttributeSetID = @attributeSetId


-- Create command to move files into the new folders
SELECT 'copy "' + f.Filename + '" "' + @adamPath + '\' + @appName + '\' +  dbo.import2sxc_GuidCompress(EntityGUID) + '\Photos"' as cmdMove
FROM ToSIC_EAV_Entities e
INNER JOIN ToSIC_EAV_Values v ON e.EntityID = v.EntityID AND v.AttributeID = @attributeId
INNER JOIN import2sxc_Files f on v.Value = f.OriginalId
WHERE AttributeSetID = @attributeSetId


DROP FUNCTION dbo.import2sxc_BinaryToBase64

DROP FUNCTION dbo.import2sxc_GuidCompress

脚本运行后,将具有名为cmdMkdir和cmdMove的列,这些列是可以用来创建文件夹并将文件根据需要移入其中的命令行脚本。

当导入了内容项并且运行了用于创建文件夹和移动文件的脚本时,您应该清除DNN中的服务器缓存,并转到DNN中的站点资产(文件管理器)并刷新ADAM文件夹和子文件夹。

执行完此操作后,将显示内容项目库中的所有文件。

答案 1 :(得分:0)

有办法,但是有点秘密:)

当项目位于ADAM中专用于该字段的文件夹中时,将自动将图像链接到该项目(和右侧字段)。该架构为ca。像这样[portal root] / adam / [app-name] / [entity-guid22] / [field-name]

手动创建一个条目,然后验证您看到的内容。因此,您基本上可以使用excel / xml import https://2sxc.org/en/Learn/Import-Export来导入数据,然后最大的挑战就是生成guid22。这是guid的一种更紧凑的形式,它需要很长的guid并使用url安全字符对其进行重新编码。

基本上在2sxc中有一个命令可以执行此操作 ToSic.Eav.Identity.Mapper.GuidCompress(original guid)

另请参阅https://github.com/2sic/eav-server/blob/05d79bcb80c109d1ceb8422875a6ff7faa34ff4f/ToSic.Eav.Core/Identity/Mapper.cs