OctoberCMS 在当前插件的下拉列表中调用另一个插件的数据
OctoberCMS call another plugin's data in current plugin's dropdown
我是 OctoberCMS 的新手,我喜欢它的工作方式。目前我已经创建了两个插件,分别称为 Products 和 Product Categories。我使用 Builder Plugin 创建了这些插件,这也是一个非常好的插件,可以轻松创建另一个插件。
现在的问题是,在我的 Products Categories 插件中,我只有一个名为 Product Category 的字段,用户将添加he/she 想要多少类别,这个插件就可以正常工作。
在我的 Products 插件中,我有一个名为 Product Category 的字段,它是一个下拉字段,我想要所有这些类别我分别在 Product Categories 插件中创建了它们,但不知何故我无法实现此功能。到目前为止,这是我尝试过的。
Plugin.php (plugins\technobrave\products)
<?php namespace Technobrave\Products;
use System\Classes\PluginBase;
use technobrave\productcategory\Models\ProductCategory as ProductCategory;
use technobrave\products\Models\Product as ProductModel;
class Plugin extends PluginBase
{
public function registerComponents()
{
}
public function registerSettings()
{
}
public function boot()
{
ProductModel::extend(function($model){
$model->hasOne['ProductCategory'] = ['technobrave\productcategory\Models\ProductCategory'];
});
}
}
Product.php (plugins\technobrave\products\models)
<?php namespace Technobrave\Products\Models;
use Model;
/**
* Model
*/
class Product extends Model
{
use \October\Rain\Database\Traits\Validation;
/*
* Validation
*/
public $rules = [
'category' => 'required',
'product_brand' => 'required',
'product_channel' => 'required',
'product_type' => 'required',
'client_name' => 'required',
'project_name' => 'required',
'product_description' => 'required',
'banner_image' => 'required',
'product_images' => 'required',
];
public $customMessages = [
'category.required' => 'Please Select Product Category',
'product_brand.required' => 'Please Select Product Brand',
'product_channel.required' => 'Please Select Product Channel',
'product_type.required' => 'Please Select Product Type',
'client_name.required' => 'Please Enter Client Name',
'project_name.required' => 'Please Enter Project Name',
'product_short_description.required' => 'Please Enter Product Short Description',
'product_description.required' => 'Please Enter Product Description',
'banner_image.required' => 'Please select Product Banner Image',
'product_images.required' => 'Please select Product Image(s)',
];
/*
* Disable timestamps by default.
* Remove this line if timestamps are defined in the database table.
*/
//public $timestamps = false;
/**
* @var string The database table used by the model.
*/
public $table = 'technobrave_products_';
public $settingsFields = 'fields.yaml';
public $attachOne = [
'banner_image' => 'System\Models\File'
];
public $attachMany = [
'product_images' => 'System\Models\File'
];
public $belongsTo = [
'ProductCategory'=> ['technobrave\productcategory\Models\ProductCategory']
];
// Here i want my product dropdown categories to be dynamic
public function getCategoryOptions()
{
echo '<pre>';
print_r($ProductCategory);
exit;
//return array();
}
}
但我不断收到致命错误消息:
Undefined variable: ProductCategory
对于我输入的这个特定代码 Product.php
echo '<pre>';
print_r($ProductCategory);
exit;
在上面的 Plugin.php 文件中我有下面的代码
use technobrave\productcategory\Models\ProductCategory as ProductCategory;
所以通过这样做,我试图获取我已经创建的所有类别,并试图以某种方式在我的下拉列表中显示它。
我知道在 OctoberCMS 中创建插件时,我们可以处理 relations 逻辑(即 hasMany、hasOne 等),但现在我想通过外部插件以这种方式实现。我想在方法 getCategoryOptions()
中添加要填写的类别,然后我将 return 那些放在我的下拉列表中。
有人可以按照我想要的方式指导我吗?
谢谢
好的。我发现了两种方法可以实现这一点,下面是那些。
方式一
Product.php (plugins\technobrave\products\models)
<?php namespace Technobrave\Products\Models;
use Model;
use technobrave\productcategory\Models\ProductCategory as ProductCategory;
public function getCategoryOptions()
{
$fields = ProductCategory::lists('category_name','id');
print_r($fields);
}
在上面,我刚刚使用了 use technobrave\productcategory\Models\ProductCategory as ProductCategory;
并且在我的方法 getCategoryOptions()
中,我刚刚添加了这个 ProductCategory::lists('category_name','id');
并返回它以便能够在我的下拉列表中填充动态类别.这很好用。
方式二
Product.php (plugins\technobrave\products\models)
<?php namespace Technobrave\Products\Models;
use Model;
use technobrave\productcategory\Models\ProductCategory as ProductCategory;
public function getCategoryOptions()
{
// getting only active categories
$get_categories = ProductCategory::all()->where('status',1);
$fields[''] = 'Select Product Category';
foreach ($get_categories as $current_category) {
$fields[$current_category->attributes['id']] = $current_category->attributes['category_name'];
}
print_r($fields);
}
在上面,我只是在我的方法getCategoryOptions()
中写了一个查询并得到了记录。
您可以使用任何您喜欢的方法。此外,如果我能找到更好的方法来实现同样的事情,那就太好了。
谢谢
我是 OctoberCMS 的新手,我喜欢它的工作方式。目前我已经创建了两个插件,分别称为 Products 和 Product Categories。我使用 Builder Plugin 创建了这些插件,这也是一个非常好的插件,可以轻松创建另一个插件。
现在的问题是,在我的 Products Categories 插件中,我只有一个名为 Product Category 的字段,用户将添加he/she 想要多少类别,这个插件就可以正常工作。
在我的 Products 插件中,我有一个名为 Product Category 的字段,它是一个下拉字段,我想要所有这些类别我分别在 Product Categories 插件中创建了它们,但不知何故我无法实现此功能。到目前为止,这是我尝试过的。
Plugin.php (plugins\technobrave\products)
<?php namespace Technobrave\Products;
use System\Classes\PluginBase;
use technobrave\productcategory\Models\ProductCategory as ProductCategory;
use technobrave\products\Models\Product as ProductModel;
class Plugin extends PluginBase
{
public function registerComponents()
{
}
public function registerSettings()
{
}
public function boot()
{
ProductModel::extend(function($model){
$model->hasOne['ProductCategory'] = ['technobrave\productcategory\Models\ProductCategory'];
});
}
}
Product.php (plugins\technobrave\products\models)
<?php namespace Technobrave\Products\Models;
use Model;
/**
* Model
*/
class Product extends Model
{
use \October\Rain\Database\Traits\Validation;
/*
* Validation
*/
public $rules = [
'category' => 'required',
'product_brand' => 'required',
'product_channel' => 'required',
'product_type' => 'required',
'client_name' => 'required',
'project_name' => 'required',
'product_description' => 'required',
'banner_image' => 'required',
'product_images' => 'required',
];
public $customMessages = [
'category.required' => 'Please Select Product Category',
'product_brand.required' => 'Please Select Product Brand',
'product_channel.required' => 'Please Select Product Channel',
'product_type.required' => 'Please Select Product Type',
'client_name.required' => 'Please Enter Client Name',
'project_name.required' => 'Please Enter Project Name',
'product_short_description.required' => 'Please Enter Product Short Description',
'product_description.required' => 'Please Enter Product Description',
'banner_image.required' => 'Please select Product Banner Image',
'product_images.required' => 'Please select Product Image(s)',
];
/*
* Disable timestamps by default.
* Remove this line if timestamps are defined in the database table.
*/
//public $timestamps = false;
/**
* @var string The database table used by the model.
*/
public $table = 'technobrave_products_';
public $settingsFields = 'fields.yaml';
public $attachOne = [
'banner_image' => 'System\Models\File'
];
public $attachMany = [
'product_images' => 'System\Models\File'
];
public $belongsTo = [
'ProductCategory'=> ['technobrave\productcategory\Models\ProductCategory']
];
// Here i want my product dropdown categories to be dynamic
public function getCategoryOptions()
{
echo '<pre>';
print_r($ProductCategory);
exit;
//return array();
}
}
但我不断收到致命错误消息:
Undefined variable: ProductCategory
对于我输入的这个特定代码 Product.php
echo '<pre>';
print_r($ProductCategory);
exit;
在上面的 Plugin.php 文件中我有下面的代码
use technobrave\productcategory\Models\ProductCategory as ProductCategory;
所以通过这样做,我试图获取我已经创建的所有类别,并试图以某种方式在我的下拉列表中显示它。
我知道在 OctoberCMS 中创建插件时,我们可以处理 relations 逻辑(即 hasMany、hasOne 等),但现在我想通过外部插件以这种方式实现。我想在方法 getCategoryOptions()
中添加要填写的类别,然后我将 return 那些放在我的下拉列表中。
有人可以按照我想要的方式指导我吗?
谢谢
好的。我发现了两种方法可以实现这一点,下面是那些。
方式一
Product.php (plugins\technobrave\products\models)
<?php namespace Technobrave\Products\Models;
use Model;
use technobrave\productcategory\Models\ProductCategory as ProductCategory;
public function getCategoryOptions()
{
$fields = ProductCategory::lists('category_name','id');
print_r($fields);
}
在上面,我刚刚使用了 use technobrave\productcategory\Models\ProductCategory as ProductCategory;
并且在我的方法 getCategoryOptions()
中,我刚刚添加了这个 ProductCategory::lists('category_name','id');
并返回它以便能够在我的下拉列表中填充动态类别.这很好用。
方式二
Product.php (plugins\technobrave\products\models)
<?php namespace Technobrave\Products\Models;
use Model;
use technobrave\productcategory\Models\ProductCategory as ProductCategory;
public function getCategoryOptions()
{
// getting only active categories
$get_categories = ProductCategory::all()->where('status',1);
$fields[''] = 'Select Product Category';
foreach ($get_categories as $current_category) {
$fields[$current_category->attributes['id']] = $current_category->attributes['category_name'];
}
print_r($fields);
}
在上面,我只是在我的方法getCategoryOptions()
中写了一个查询并得到了记录。
您可以使用任何您喜欢的方法。此外,如果我能找到更好的方法来实现同样的事情,那就太好了。
谢谢