我正在制作一个seo插件,我也在使用rainlab博客插件,我创建了一个带有字段的选项卡,我可以输入我想要包含在页面标题中的元数据但我不知道知道如何调用博客区域(rainlab插件菜单选项卡)中的表单字段中的值,而我的seo组件位于cms页面,我尝试使用{{this.page.variable}}'方法但由于输入表单位于另一个后端页面,因此无效。
这就是我的plugin.php的样子:
<?php namespace Stronganswer\Seo;
use Backend;
use Event;
use System\Classes\PluginBase;
use Cms\Classes\Page;
use Cms\Classes\Theme;
use System\Classes\PluginManager;
use System\Classes\SettingsManager;
class Plugin extends PluginBase
{
/**
* Returns information about this plugin.
*
* @return array
*/
public function pluginDetails()
{
return [
'name' => 'seo',
'description' => 'meta and og tag handler',
'author' => 'stronganswer',
'icon' => 'icon-leaf'
];
}
/**
* Registers any front-end components implemented in this plugin.
*
* @return array
*/
public function registerComponents()
{
return [
'Stronganswer\Seo\Components\Seo' => 'seoHandler',
'Stronganswer\Seo\Components\BlogPost' => 'SeoBlogPost',
'Stronganswer\Seo\Components\StaticPage' => 'SeoStaticPage',
'Stronganswer\Seo\Components\CmsPage' => 'SeoCmsPage',
];
}
public function registerSettings(){
return [
'settings' => [
'label' => 'SEO Settings',
'description' => 'Seo Settings.',
'icon' => 'icon-bar-chart-o',
'class' => 'stronganswer\seo\Models\settings',
'context' => 'mysettings',
'category' => SettingsManager::CATEGORY_MYSETTINGS,
'order' => 1
]
];
}
/**
* Registers any back-end permissions used by this plugin.
*
* @return array
*/
public function registerPermissions()
{
return [
'stronganswer.seo.some_permission' => [
'tab' => 'seo',
'label' => 'Some permission'
],
];
}
/**
* Registers back-end navigation items for this plugin.
*
* @return array
*/
/* public function registerNavigation()
{
return [
'seo' => [
'label' => 'seo',
'url' => Backend::url('stronganswer/seo/controllers'),
'icon' => 'icon-leaf',
'permissions' => ['stronganswer.seo.*'],
'order' => 500,
],
];
}*/
public function boot()
{
Event::listen('backend.form.extendFields', function($widget)
{
if(PluginManager::instance()->hasPlugin('RainLab.Pages') && $widget->model instanceof \RainLab\Pages\Classes\Page)
{ //static pages fields
$widget->addFields([
'viewBag[seo_title]' =>[
'label' => 'Meta Title',
'tab' => 'SEO',
'type' => 'text'
],
'viewBag[seo_description]' =>[
'label' => 'Meta Description',
'tab' => 'SEO',
'size' => 'tiny',
'type' => 'textarea'
],
'viewBag[seo_keywords]' =>[
'label' => 'Meta Keywords',
'tab' => 'SEO',
'type' => 'text'
],
'viewBag[robot_index]' => [
'label' => 'Robot Index',
'type' => 'dropdown',
'tab' => 'SEO',
'options' => ["index"=>"index","noindex"=>"noindex"],
'default' => 'index',
'span' => 'left'
],
'viewBag[robot_follow]' => [
'label' => 'Robot Follow',
'type' => 'dropdown',
'tab' => 'SEO',
'options' => ["follow"=>"follow","nofollow"=>"nofollow"],
'default' => 'follow',
'span' => 'right'
]
], 'primary');
}
if(PluginManager::instance()->hasPlugin('RainLab.Blog') && $widget->model instanceof \RainLab\Blog\Models\Post)
{
$widget->addFields([
'blog_title' =>[
'label' => 'Meta Title',
'tab' => 'Blog Seo',
'type' => 'text'
],
'seo_description' =>[
'label' => 'Meta Description',
'tab' => 'Blog Seo',
'size' => 'tiny',
'type' => 'textarea'
],
'seo_keywords' =>[
'label' => 'Meta Keywords',
'tab' => 'Blog Seo',
'type' => 'text'
],
'robot_index' => [
'label' => 'Robot Index',
'type' => 'dropdown',
'tab' => 'Blog Seo',
'options' => ["index"=>"index","noindex"=>"noindex"],
'default' => 'index',
'span' => 'left'
],
'canonical_url' => [
'label' => 'Canonical URL',
'type' => 'text',
'tab' => 'SEO',
'span' => 'left'
],
'robot_follow' => [
'label' => 'Robot Follow',
'type' => 'dropdown',
'tab' => 'Blog Seo',
'options' => ["follow"=>"follow","nofollow"=>"nofollow"],
'default' => 'follow',
'span' => 'right'
]
], 'secondary');
}
if (!$widget->model instanceof \Cms\Classes\Page) return;
//cms page fields
$widget->addFields([
'settings[seo_title]' =>[
'label' => 'Meta Title',
'tab' => 'SEO',
'type' => 'text'
],
'settings[seo_description]' =>[
'label' => 'Meta Description',
'tab' => 'SEO',
'size' => 'tiny',
'type' => 'textarea'
],
'settings[seo_keywords]' =>[
'label' => 'Meta Keywords',
'tab' => 'SEO',
'type' => 'text'
],
'settings[robot_index]' => [
'label' => 'Robot Index',
'type' => 'dropdown',
'tab' => 'SEO',
'options' => ["index"=>"index","noindex"=>"noindex"],
'default' => 'index',
'span' => 'left'
],
'settings[robot_follow]' => [
'label' => 'Robot Follow',
'type' => 'dropdown',
'tab' => 'SEO',
'options' => ["follow"=>"follow","nofollow"=>"nofollow"],
'default' => 'follow',
'span' => 'right'
]
], 'primary');
});
}
}
这是我的组成部分:
<?php namespace Stronganswer\Seo\Components;
use DB;
use Cms\Classes\ComponentBase;
use Stronganswer\Seo\models\Settings;
use RainLab\Pages\Classes\Router;
use RainLab\Blog\Models\Post;
use Cms\Classes\Theme;
use Cms\Classes\Page;
use Request;
use Event;
class BlogPost extends ComponentBase
{
//singular page tags
public $page;
public $blog_title;
public $seo_title;
public $seo_description;
public $seo_keywords;
public $robot_index;
public $robot_follow;
//global tags
public $ogTitle;
public $ogDescription;
public $ogSiteName;
public $ogUrl;
public $ogType;
public $ogAuthor;
public $ogImage;
//facebook tags
public $ogFbAppId;
public $ogFbAdmins;
//google tags
public $ogGlTitle;
public $ogGlDescription;
public $ogGlImage;
//twitter tags
public $ogTtCard;
public $ogTtSite;
public $ogTtTitle;
public $ogTtDescription;
public $ogTtAuthor;
public $ogTtImage;
public function componentDetails()
{
return [
'name' => 'Seo BlogPost component',
'description' => 'handles seo fields into blogposts'
];
}
public function defineProperties()
{
return [
"post" => [
"title" => "data",
"default" => "post"
]
];
}
public function Run()
{
$theme = Theme::getActiveTheme();
$page = Page::load($theme,$this->page->baseFileName);
$this->page["hasBlog"] = true;
if($page->hasComponent("blogPost"))
{
//$seo = DB::table('rainlab_blog_posts')->get();
//$blog_title = DB::table('rainlab_blog_posts')->where('slug','=','first-blog-post')->value('seo_title');
//$this->seo_title = $this->page['blog_title'] = $this->page->getViewBag()->property('blog_title');
//$this->seo_title = $this->page["seo_title"] = $this->page->seo_title;
/*$blog_title = DB::table('rainlab_blog_posts')
->select(DB::raw('select seo_title'))
->where('slug', '=', 'first-blog-post')
->get();*/
$this->seo_description = $this->page["seo_description"] = $this->page->meta_description;
$this->seo_keywords = $this->page["seo_keywords"] = $this->page->seo_keywords;
$this->robot_follow = $this->page["robot_follow"] = $this->page->robot_follow;
$this->robot_index = $this->page["robot_index"] = $this->page->robot_index;
$settings = Settings::instance();
if($settings->enable_og_tags)
{
$this->ogTitle = $settings->og_title;
$this->ogDescription = $settings->og_description;
$this->ogSiteName = $settings->og_sitename;
$this->ogUrl = $settings->og_url;
$this->ogType = $settings->og_type;
$this->ogAuthor = $settings->og_author;
$this->ogImage = $settings->og_img;
}
if($settings->enable_fb_tags)
{
$this->ogFbAppId = $settings->og_fb_appid;
$this->ogFbAdmins = $settings->og_fb_admins;
}
if($settings->enable_ggl_tags)
{
$this->ogGlTitle = $settings->og_gl_title;
$this->ogGlDescription = $settings->og_gl_description;
$this->ogGlImage = $settings->og_gl_img;
}
if($settings->enable_tt_tags)
{
$this->ogTtCard = $settings->og_tt_card;
$this->ogTtSite = $settings->og_tt_site;
$this->ogTtTitle = $settings->og_tt_title;
$this->ogTtDescription = $settings->og_tt_description;
$this->ogTtAuthor = $settings->og_tt_author;
$this->ogTtImage = $settings->og_tt_img;
}
}
else{
$this->hasBlog = $this->page["hasBlog"] = false;
}
}
}
注释中的代码是失败的trys,用于从表单中获取值。如果我进入我的数据库,我可以看到我在表单中输入的值,但我无法将它们调用到我的组件中。
和我的deafult.htm:
<meta name="title" content="{{__SELF__.blog_title}}">
<meta name="description" content="{{__SELF__.seo_description}}">
<meta name="keywords" content="{{__SELF__.seo_keywords}}">
<meta name="robots" content="{{__SELF__.robot_index}},{{__SELF__.robot_follow}}">
<meta property="og:site_name" content="{{ __SELF__.ogSiteName }}" />
<meta property="og:title" content="{{ __SELF__.ogTitle }}" />
<meta property="og:url" content="{{ __SELF__.ogUrl }}" />
<meta property="og:description" content="{{ __SELF__.ogDescription }}" />
<meta property="og:type" content="{{ __SELF__.ogType }}" />
<meta name="author" content="{{ __SELF__.ogAuthor }}" />
<meta property="og:image" content="{{ __SELF__.ogImage }}" />
<meta property="fb:app_id" content="{{ __SELF__.ogFbAppId }}" />
<meta property="fb:admins" content="{{ __SELF__.ogFbAdmins }}" />
<meta itemprop="name" content="{{ __SELF__.ogGlTitle }}" />
<meta itemprop="description" content="{{ __SELF__.ogGlDescription }}" />
<meta itemprop="image" content="{{ __SELF__.ogGlImage }}" />
<meta itemprop="image" content="{{ __SELF__.ogGlImage }}" />
<meta name="twitter:card" content="{{__SELF__.ogTtCard}}">
<meta name="twitter:site" content="{{__SELF__.ogTtSite}}">
<meta name="twitter:title" content="{{__SELF__.ogTtTitle}}">
<meta name="twitter:description" content="{{__SELF__.ogTtDescription}}">
<meta name="twitter:creator" content="{{__SELF__.ogTtAuthor}}">
<meta name="twitter:image:src" content="{{__SELF__.ogTtImage}}">
我也有cms页面的表单和rainlab页面插件(静态页面)我从其他组件中获取它们,我想指出它们都工作正常。
答案 0 :(得分:1)
要从DB中调用值,我确实这样做了:
将此插入到运行中的组件:
$this->blog_seo_or_smth = DB::table('rainlab_blog_posts')->where('slug','first-blog-post')->first();
然后在default.htm:
<meta name="title" content="{{__SELF__.blog_seo_or_smth.seo_title}}">
答案 1 :(得分:1)
我还在努力了解如何在cmsPages和rainlabPages中同时扩展字段,然后在我的html源代码中使用部分打印文件。 所以我创建了这个部分:
M = Locally modified
U = Updated in repository
A = Locally added
D = Locally deleted
I = Ignored
R = Replaced in the repository
– = The contents of the folder have mixed status; display the contents to see individual status
? = Not under source control
我认为最好的解决方案是:创建一个扩展cmsPages和rainLab页面字段的插件,而不是部分打印! 通过anandpatel查看seoextension的代码可能会有所帮助,但我在编码方面不是很强,所以我们可以互相帮助。
我认为功能是:
<meta charset="utf-8" >
<meta http-equiv="X-UA-Compatible" content="IE=edge" >
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="{{ this.page.meta_description }}">
<meta name="robots" content=",">
<meta property="og:title" content="October - {{ this.page.title }}" />
<meta property="og:url" content="{{ this.page.url }}" />
<meta property="og:site_name" content="{{ title }}" />
<meta property="og:description" content="{{ this.page.meta_description }}" />
<meta property="fb:app_id" content="xxx" />
<meta property="og:type" content="xxx">
<meta property="og:image" content="{{ this.theme.site_logo_url }}">
<meta name="twitter:card" content="{{ summary }}">
<meta name="twitter:title" content="October- {{ this.page.title }}">
<meta name="twitter:description" content="{{ this.page.meta_description }}">
<meta name="twitter:image" content="{{ this.theme.site_logo_url }}">
也许我们可以将这个项目插入git。
再见 加布里埃尔
答案 2 :(得分:0)
如果您需要表单中的值,请使用Input
类
https://octobercms.com/docs/services/request-input
您可以使用一些简单的方法访问所有用户输入。使用输入外观时,您无需担心请求的HTTP谓词,因为所有谓词都以相同的方式访问输入。全局input()辅助函数是Input :: get。
的别名检索输入值
$name = Input::get('name');
如果输入值不存在,则检索默认值
$name = Input::get('name', 'Sally');
确定输入值是否存在
if (Input::has('name')) {
//
}
但我认为你意味着别的东西,但我不确定,因为实际的问题并不清楚。
在扩展插件时需要考虑很多事情,在这些情况下应该检查:
dd($somevalue)
我的组件中的值(dd会杀死任何执行并转储变量。对于分析它们非常有用)在开始时调试十月可能会很痛苦,但是一旦掌握了它就很有趣: - )