【问题标题】:OctoberCMS: How to use a component's functions without knowing the component's nameOctoberCMS:如何在不知道组件名称的情况下使用组件的功能
【发布时间】:2018-04-08 13:08:35
【问题描述】:

在 OctoberCMS 中,我想简单地通过附加不同的插件组件来更改页面进程。

我有一个插件组件 (makeform),它插入一个表单(在数据库表中定义)。
单击表单的submit 按钮调用onSubmit(),后者调用process()
process() 是另一个插件组件中定义的函数。

i) 我可以在不知道其他插件或其组件名称的情况下从makeform 中调用process() 吗?也就是不用use 'Acme\Plugin\Components\ProcessForm', 'processForm';

ii) 或者,我能否以编程方式发现另一个附加组件的名称及其插件,然后以某种方式指定它的 process() 函数?

iii) 或者是使用静态properties 下拉列表选择哪个进程,然后动态添加组件的情况。总是假设我可以$this->addComponent('Acme\Plugin\Components\ProcessForm', 'processForm'); 超越init()


编辑:实验

我希望动态addComponent()
无论我把它放在哪里,init() 或其他地方,我都会收到错误消息:

没有为组件“Acme\Plugin\Components\ProcessForm”注册类名。检查组件插件。

即使我没有使用其中一个类。
许多在线引用此错误消息,但没有一个对我有帮助。

编辑:进一步解释

对我想要实现的目标的(希望)简化解释。

本质上,我想象一个由一串组件组成的页面进程。
每个组件调用下一个组件中的一个函数,直到流程结束。
只需更换组件即可修改整个流程。
我猜想连接组件的唯一方法是标准化函数名称。因此,这(可能?)要求组件属于流程的特定阶段,尽管如果它们中的每一个都可以适应任何阶段(在适当的情况下),那将是理想的。

illustration

【问题讨论】:

  • 再次感谢@peter-haberkorn。我在搜索中遇到了这个问题,但不明白如何使用addComponent:我只是收到我的问题中引用的错误消息。它确实看起来像我正在寻找的优雅解决方案。

标签: laravel octobercms


【解决方案1】:
  1. 扩展基组件类并添加您的功能并让组件从此扩展?

  2. 用该函数创建一个新的辅助类,可以将其称为静态或这样

  3. 添加全局函数 https://octobercms.com/forum/post/global-php-classesfunctions

【讨论】:

  • 谢谢@peter-haberkorn,一个有趣的方法。暂时超出了我的经验水平。我确信解决方案非常简单。我修改了我的问题以增加清晰度。
【解决方案2】:

我认为最好的方法是定义另一个属性,您可以在其中设置插件的命名空间。

public function defineProperties(){
  'pluginName' => [
    'label' => 'Plugin Namespace to call process method from',
    'type' => 'text'
  ]
}

--

public function onSubmit(){
  $plugin = $this->property('pluginName');
  $plugin::process($formData);
}

通过这种方式,您可以保持组件逻辑与任何硬编码的插件名称无关。

编辑:30/10/17

我不确定是否有办法列出应用程序中的所有可用组件。另一种方法是设置一个Settings 页面,其中包含一个repeater,您可以在其中声明所有可用的组件以及命名空间。

您可以将其解析为 onSubmit 方法内的数组并将其返回到下拉列表。

public function defineProperties(){
  'components' => [
    'label' => 'Plugin Namespace to call process method from',
    'type' => 'dropdown',
    'options' => 'getComponentsOptions' // optional but easier to understand
  ]
}

public function getComponentsOptions(){
  $components = Settings::get('components');
  $options = [];

  foreach ($components as $component)
  {
    $options[$component['namespace']] = $component['name'];
  }

  return $options;
}

/Models/Settings/fields.yaml

fields:
    components:
        type: repeater
        form:
            fields:
                name:
                    placeholder: My Component Name
                    span: left
                namespace:
                    placeholder: Acme\Name\Components\MyComponent;
                    span: right

/Models/Settings.php

class Settings extends Model
{
    public $implement = ['System.Behaviors.SettingsModel'];
    // A unique code
    public $settingsCode = 'acme_name_settings';
    // Reference to field configuration
    public $settingsFields = 'fields.yaml';
}

http://octobercms.com/docs/plugin/settings#introduction

【讨论】:

  • 谢谢@cptmeatball。您的第二段代码无疑是指定函数的一种巧妙方法。 [虽然我需要(new $plugin)->process();]。使用您的解决方案,我根据我的第三个选项将 text 属性替换为静态下拉列表,而不需要 addComponent。理想情况下,我正在寻找一种解决方案,它允许管理员简单地从后端组件列表中拖放组件(或者,如果失败,从自动填充的属性下拉列表中选择一个),而无需 知道 NameSpace。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2014-07-31
相关资源
最近更新 更多