【问题标题】:Can Octobercms Plugin conect to a flat file like xml十月cms插件可以连接到像xml这样的平面文件吗
【发布时间】:2025-11-27 11:45:02
【问题描述】:

我正在尝试为 octobercms 制作一个从 2 个 xml 文件中获取信息的插件,我想知道构建器插件是否适合生成完成此任务所需的文件,如果是的话,它是否是我需要更改的模型文件这样我就可以连接到 xlm 文件以获取所需的数据

我是这么想的

    <?php namespace Xml\Xmldata\Models;
use Backend\Models\User;
use Cms\Classes\Page;
use File;
use Flash;
use Hash;
use Markdown;
use Model;
use October\Rain\Support\ValidationException;
use Storage;
use Str;
use System\Classes\PluginManager;
use System\Models\File as FileModel;
use Xml\Xmldata\Xmlloadfile;
/**
 * XML File Model
 */
class Xmldata extends Model
{
$xmldata = simplexml_load_file("../storage/testdata.xml")
$keypairdata1    = "";
$keypairdata2 = "";

for ($i = 0; $i < count($xmldata); $i++){
    $keypairdata1    = $xmldata->testdata[$i]->keypairdata1;
    $keypairdata2 = $xmldata->testdata[$i]->keypairdata2;
}

测试数据xml文件

<MYData>
    <login_details>
        <unique_ref>1-61</unique_ref>
        <login_name>tomme</login_name>
        <login>me</login>
        <password>me</password>
        <file1>Test</file1>
        <file2/>
        <file3/>
        <file4/>
    </login_details>
</MYData

这是客户端数据文件

<Mydata>
    <client-data>
        <refno_con>63</refno_con>
        <details>Picture No 14</details>
        <stat_date>2011-10-04</stat_date>
        <val_amount>460.00</val_amount>
        <stat_file>Z:\DATA\\documents\Lanscape.jpg</stat_file>
        <unique_ref>1-63</unique_ref>
    </client-data>  
</Mydata>

【问题讨论】:

  • 如果我对您的理解正确,您可能希望将"../storage/testdata.xml" 放入模型中,这样它就像:simplexml_load_file(Xmlloadfile::find(1)); 我们能否获得有关 XML 提供的确切内容的更多信息?为什么不将 XML 数据作为文本字段或单个字段放入模型中?
  • 它是一个旧的登录系统,我的朋友仍在使用,但希望我将它集成到 octobercms 第一个文件是用户登录详细信息第二个文件是他们目前在 php 中工作的数据,所以我虽然我会尝试它在 octobercms 结束
  • 我已经添加了示例 xml 文件,您有任何关于如何将这些数据放入模型文本字段的示例

标签: octobercms octobercms-plugins


【解决方案1】:

我本来打算只添加一条评论,但这更容易,我完全赞成简单的路线,

 <?
   use Rainlab\User\Models\User;
   function onStart() {
    // Anonymous Class only working on PHP7
    $this['code'] = new class {
      public function data() {
              $path = themes_path('path to clients in themes directory /xml/data.xml');
              $numPerPage = 12; // max. number of items to display per page
              $xml = simplexml_load_file($path);
              $refno_con = Auth::getUser()->refno_con;// you will need to add this field to your users table to reflect the values in you clients data file
              $data = $xml->xpath('/Mydata/client-data[refno_con="' . $refno_con . '"]');
              $details = json_decode(json_encode($data), TRUE);
              krsort($details); // sorts an associative array in descending order, according to the key
              //ksort($details); //sorts an associative array in ascending order, according to the key
              $pagedArray = array_chunk($details, $numPerPage, true);
              $nthPage = $pagedArray['1'];
              return $nthPage;
           }

    };

}
?>

这应该可以完成工作

【讨论】:

  • 我发现的一件事是,如果只有一项 client_data 则它无法排序
  • 让我看看这个应该很容易解决
【解决方案2】:

如果您想要一个类似于模型的界面来与 XML 文件交互,那么最好的办法是使用包含的 Halcyon(Eloquent 的表亲)库。有关在 YAML 文件中存储和加载数据的 Halcyon 模型示例,请参阅 https://github.com/octobercms/october/blob/wip%2Fhalcyon-db-datasource/modules/cms/classes/Meta.php。您可以以此为起点,了解如何对 XML 文件执行相同操作。

【讨论】:

  • 有没有教程,因为我发现很难调试 Octobercms
  • 这将被认为是相当高级的事情,因此没有针对此特定应用程序的任何教程,但 Slack 非常活跃,因此您可能会在那里找到一些帮助。
【解决方案3】:

我自己一直在考虑做这样的事情,但没有时间,但找到了一段有趣的代码,你可能想尝试而不是试图重新发明*一个名叫 Ante Laca 的人创建了一个名为 xmldb 的脚本你可以通过搜索他的名字找到它,或者这里有一个链接https://github.com/alaca/xmldb 到 github 上的文件,据我了解它有完整的 CRUD 支持,让我知道你是怎么上手的

【讨论】:

  • 谢谢 Artful_dodger 我刚刚下载了这个,今晚会试一试关于我应该如何构建它以在 octobercms builder 插件中工作的任何想法
【解决方案4】:

我一直在看这个,我过去曾为客户网站做过这个

<?php
use Rainlab\User\Models\User;


function onStart() {
    // Anonymous Class only working on PHP7
    $this['code'] = new class {
            public function data() {
              $numPerPage = 12; // max. number of items to display per page
              $data = range(1, 150); // data array to be paginated
              $num_results = count($data);
              $xml = simplexml_load_file("http://to your xml file");
              $users = User::whereIsActivated(true)->get();
                  foreach ($users as $user) {
                       $refno_con = $user->refno_con;
                       $data = $xml->xpath('/Mydata/client-data[refno_con="' . $refno_con . '"]');
                       $details = json_decode(json_encode($data), TRUE);

                        krsort($details); // sorts an associative array in descending order, according to the key
                      //ksort($details); //sorts an associative array in ascending order, according to the key

                       $pagedArray = array_chunk($details, $numPerPage, true);
                       $nthPage = $pagedArray['1'];
                       return $nthPage;

                  }
           }

    };

}
?>

并将其放置在页面的代码部分中,使用 twig 访问它只需执行此操作

{# in twig Markup #}
    <ul>
        {% for item in code.data %}
            <li>{{ item.details }}</li>
            <li>{{ item.stat_date }}</li>
            <li>{{ item.refno_con }}</li>
        {% endfor %}
    </ul>

您需要使用 User 插件并对其进行修改以满足您的需要

【讨论】:

  • 感谢 Artful_dodger 审查我的问题 我已经尝试过你的建议,但注意到有一个错误,即登录的用户名发生了变化,但用户详细信息没有我认为错误在于 $ users = User::whereIsActivated(true)->get();需要进一步调查
  • 哦是的对不起user2033464我在这里使用了错误的方法,这只是检查是否所有用户都被激活让我看看它然后我回来
最近更新 更多