首页 >后端开发 >php教程 >在 Joomla 中连接第三方 PHP 库

在 Joomla 中连接第三方 PHP 库

Barbara Streisand
Barbara Streisand原创
2024-12-28 02:15:09321浏览

PHP 库很方便,因为可以从应用程序中的任何位置访问它们:从插件、组件模型、模块等。如果有人已经解决了类似的问题并将其设计为库(甚至更新了它),将这个库连接到您的 Joomla 是有意义的。例如,要为在线商店开发支付方式,您需要支付聚合器的官方库。或者您对某些CRM官方的PHP SDK是否满意。

作曲家

Joomla 不支持直接使用 Composer。为了在工作中使用该库,您需要将其“包装”在 Joomla 扩展类型库中并安装它。在严肃的项目中,采用修复项目所有组件版本的方法:代码经过多次检查、测试并允许在生产中工作。

您使用您的库创建一个包,将其安装在您需要的任何地方。随着库的新版本发布,您可以更新包装器并获得使用 Joomla 扩展的所有优势:以标准方式更新扩展,包括通过 CLI。在更新等之前,请在管理区域中查看扩展程序的变更日志

Connecting third-party PHP libraries in Joomla
更新到 Joomla 5 之前,请在管理区域中查看变更日志扩展。

Joomla、PSR、Symfony

Joomla 符合 PSR 标准,因此在这方面使用它很方便。 Joomla 核心中包含一些 Symfony 软件包(控制台、字符串、vardumper、yaml、错误处理程序等),因此如果您突然想要添加更多软件包,它们将适合并运行良好。除了库/供应商中的 Symfony 组件之外,您还可以看到 Joomla 中还有哪些有价值的内容。

如何将第 3 方 PHP 库包装在 Joomla 扩展中?

没什么复杂的。库文件通常位于 src 文件夹中。在此文件夹旁边,您需要根据文档 (manual.joomla.org) 创建 Joomla 扩展的 XML 清单。然后我们将所有内容打包到 zip 存档中,就是这样!可以安装了。

如果您需要在数据库中拥有自己的表才能使库正常工作,则需要在安装或更新过程中使用 SQL 查询添加必要的文件。由于 Joomla 4 使用名称空间,因此在扩展的 XML 清单中指定此名称空间非常重要。以下是 Joomla 库的 XML 清单的缩写示例。

<?xml version="1.0" encoding="UTF-8" ?>
<extension type="library" method="upgrade">
     <name>WebTolk AmoCRM library</name>
     <libraryname>Webtolk/Amocrm</libraryname>
     <version>1.2.1</version>
     ...
     <namespace path="src">Webtolk\Amocrm</namespace>
     <files>
          <folder>src</folder>
          <filename>amocrm.xml</filename>
     </files>
</extension>

;标签意味着我们存档中的 src 文件夹将被复制到 JPATH_SITE/libraries/Webtolk/Amocrm。在中部分,我们指出需要从档案中填写的内容。和 WebtolkAmocrm表示必须为 JPATH_SITE/libraries/Webtolk/Amocrm 中的 src 文件夹注册命名空间 WebtolkAmocrm。

重要注意事项!

  • 在 Joomla 4.2.7 之前,事实上,标签 是来自 XML 清单的方法不起作用。 因此,有必要向库包中添加一个系统插件,该插件将使用 JLoader 类在 onAfterInitialize 事件(事件调度程序)上注册命名空间。因此,有必要从库和插件构建一个包。 从 Joomla 4.2.7 开始,它已被修复,您可以不使用该插件。
  • 到目前为止,更新库=重新安装。即删除并安装扩展。这个决定是在 Joomla 3.x 版本的深处做出的。为什么? - 隐藏在公关山脉之下。我们需要寻找。为什么这很重要?因为安装任何扩展时,都会在扩展的“注册表”中创建一个条目 - 在 #__extensions 表的数据库中。该表有 2 列 TEXT 类型 - params 和 custom_data。你必须承认,这是一个相当大的数据量。如果您使用 JoomlaCMSHelperLibraryHelper 将一些库参数存储在数据库中,那么您需要考虑安装程序的这种行为并预先保存,然后在更新库时将保存的参数添加回扩展的安装程序脚本中。
<?php
use Joomla\CMS\Helper\LibraryHelper;
use Joomla\CMS\Cache\Cache;

/**
 * Function called before extension installation/update/removal procedure commences.
 *
 * @param   string            $type     The type of change (install or discover_install, update, uninstall)
 * @param   InstallerAdapter  $adapter  The adapter calling this method
 *
 * @return  boolean  True on success
 *
 * @since   1.0.0
 */
public function preflight(string $type, InstallerAdapter $adapter): bool
{
    if ($type == 'uninstall')
    {
        return true;
    }

    /**
     *
     *  Joomla when updating extensions of the library type, it actually deletes them (along with the data in the database),
     *  and then installs it again.
     *  In order to avoid losing library data from the database, we are writing this crutch.
     *
     * @see https://github.com/joomla/joomla-cms/issues/39360
     *
     */

    if ($type == 'update')
    {
        $lib_params = LibraryHelper::getParams('Webtolk/Amocrm');
        $jconfig    = $this->app->getConfig();
        $options    = array(
            'defaultgroup' => 'wt_amo_crm_temp',
            'caching'      => true,
            'cachebase'    => $jconfig->get('cache_path'),
            'storage'      => $jconfig->get('cache_handler'),
        );
        $cache      = Cache::getInstance('', $options);
        $cache->store($lib_params, 'wt_amo_crm_temp');

    }

    return true;

}

相应地,在 postflight() 方法中,我们使用 LibraryHelper::saveParams('Webtolk/Amocrm', $lib_params); 将保存的参数放回原处。

  • 要使库正常工作,必须在扩展管理器中启用它(菜单 - 系统 - 管理 - 扩展)。
  • 通常,库需要某些参数(API 密钥、令牌等)才能工作,这些参数必须由 Joomla 管理区域的人员指定。出于这些目的,编写一个插件很方便(扩展类型库没有自己的参数配置接口)。系统组或您自己的自定义组并不重要。在你的库中,你可以像这样快速获取插件参数:
<?php
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\Registry\Registry;

if (PluginHelper::isEnabled('system', 'wt_amocrm'))
   {
      $plugin        = PluginHelper::getPlugin('system', 'wt_amocrm');
      $params        = \json_decode($plugin->params);
      $param = $params->param;
      // OR you can use Joomla\Registry\Registry
      $params = new Registry($plugin->params);
      $param = $params->get('param', 'defatul value if empty');
   }

Joomla 社区资源

  • https://joomla.org/
  • Mattermost 中的 Joomla 社区聊天
  • WebTolk Joomla 扩展
  • 这篇俄语文章

以上是在 Joomla 中连接第三方 PHP 库的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn