2016-05-11 1 views
2

Я делаю плагин seo, и я также использую плагин blog rainlab, я создал вкладку с полями, где я могу введите метассы, которые я хочу включить в главный тег страницы, но я не знаю, как вызвать это значение из полей формы, которые находятся в блоге (вкладка меню плагина Rainlab), в то время как мой SEO-компонент находится в режиме cms page Я пытаюсь использовать метод {{this.page.variable}} ', но поскольку форма ввода находится на другой странице, она не работает.Как мне вызвать значение из другой формы бланка и использовать его на компоненте в OctoberCms

Это как мой 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}}"> 

Я также формы для страниц и системе центра инерции для rainlab страниц плагинов (статических страниц) Я получаю их от других компонентов, которые я сделал, и я хотел бы отметить, что оба они работают нормально.

+0

Попробуйте изменить функцию 'Run' в компоненте для' onRun', а затем просто назначить статическое значение для blog_title например, '$ this-> blog_title = 'Some Title';' и посмотреть, работает ли это или нет. – Abbasi

+0

спасибо за обнаружение этой ошибки, я все это исправил. Статическое значение появляется на выходе кода страницы, но я до сих пор не знаю, как вызвать его с другой страницы. – kraven2g

ответ

1

Для вызова значения из БД я сделал так:

Вставьте это в компонент OnRun fucntion:

$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}}"> 
0

Если вам нужны значения из формы Используйте Input класс

https://octobercms.com/docs/services/request-input

Вы можете получить доступ ко всем ввода данных пользователем с помощью нескольких простых методов. Вам не нужно беспокоиться о HTTP-глаголе для запроса при использовании входного фасада, поскольку доступ к нему осуществляется одинаково для всех глаголов. Глобальная функция ввода() - это псевдоним для Input :: get.

Получение входного значения

$name = Input::get('name'); 

Получение значения по умолчанию, если значение входного сигнала отсутствует

$name = Input::get('name', 'Sally'); 

Определение, если входное значение присутствует

if (Input::has('name')) { 
    // 
} 

Но я думаю, что вы имеете в виду что-то еще, но я не уверен, потому что фактический вопрос не ясен.

Есть много вещей, которые следует учитывать при расширении плагина вы должны проверить в таких случаях:

  • ли мои поля получить созданный в базе данных?
  • Сохраняются ли мои значения в базе данных?
  • Должен ли я использовать отношения для этих элементов вместо того, чтобы их изменять?
  • Могу ли я dd($somevalue) значения в моих компонентах (dd убивает любое выполнение и выгружает переменные.очень полезно их анализировать)
  • Есть ли у меня отдельная модель управления и контроллер для управления моими значениями для целей отладки. что показывают?
  • Могу ли я получить доступ к значениям непосредственно по запросу?
  • Мои настройки компонентов настроены/зарегистрированы правильно?
  • Какие ошибки прослеживаются в Настройки/Журнал событий

Для отладки октября может быть боль при запуске, но как только вы получите повесить его это весело :-)

+0

ok, другими словами моя проблема в том, что у меня есть бэкэнд-страница, которую я назвал блогами на вкладке меню cms (../backend/cms), но я использую плагин RainLab Blog, и этот плагин дает мне новую вкладку (. ./backend/rainlab/blog/posts), и я дал этому плагину дополнительную форму, и я хочу получить эти значения формы, и я знаю только этот метод this-> page, но таким образом я могу получить только значения cms (../ backend/cms) [примечание: у меня также есть дополнительная форма на странице cms, и все формы, о которых я говорю, являются бэкэнд-формами, а не интерфейсом]. Надеюсь, на этот раз я был более ясен. – kraven2g

+0

Вы пробовали все шаги отладки, перечисленные мной? – Tschallacka

+0

поля создаются в базе данных, а также значения, которые я выполнил в моем db, и он возвращает значение, которое я попробую теперь, используя dd comand. Я также попытался что-то подобное, прежде чем использовать в своем default.htm {{dump (blog_title)}}, и он вернул null, я действительно новичок в октябре и laravel. – kraven2g

1

Я также работаю, чтобы понять, как продлить поле в cmsPages и rainlabPages одновременным образом, а затем использовать частичную печать в моем html-источнике. Так я создаю этот частичный:

<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 }}"> 

Я думаю, что лучшее решение: создать плагин, который расширяет поля cmsPages и rainLab страниц, чем печать с частичным! Загляните в код seoextension от anandpatel, возможно, может помочь, но я не очень силен в кодировании, чтобы мы могли помогать друг другу.

Я думаю, что функция:

public function register() 
{ 

    \Event::listen('backend.form.extendFields', function($widget) 
    { 

     if(PluginManager::instance()->hasPlugin('RainLab.Pages') && $widget->model instanceof \RainLab\Pages\Classes\Page) 
     { 

      if (!$widget->model instanceof \Cms\Classes\Page) return; 

     if (!($theme = Theme::getEditTheme())) { 
      throw new ApplicationException(Lang::get('cms::lang.theme.edit.not_found')); 

Может быть, мы можем вставить этот проект GIT.

Bye Габриэле

Смежные вопросы