Внимание! Форум временно закрыт. Все вопросы вы можете задать на странице MaxSite CMS в Github

Хуки для type_foreach-файлов

Только для тех, кто понимает.
Аватар пользователя
MAX
Администратор
Сообщений: 3179
Зарегистрирован: 31 янв 2009, 19:02

Хуки для type_foreach-файлов

Сообщение MAX » 29 май 2011, 00:14

С подачи Ивана (UmFal) сделал два хука в mso_page_foreach(). Первый type-foreach-file-general по который принимает вызываемый type_foreach-файл и возвращает его новое значение.

Второй type-foreach-file, который срабатывает в случае отсутствия type_foreach-файла в шаблоне. Он также принимает вызываемый type_foreach-файл и возвращает либо полный путь к файлу, либо false.

Например мы хотим подключить для всех шаблонов info-bottom. Разместили его в своем плагине. Далее цепляемся на хук type-foreach-file. Он срабатывает и вы отдаем путь к своему файлу.

Если же в шаблоне уже есть свой info-bottom, то наш хук не сработает. Однако, если мы хотим заменить шаблонный type_foreach-файл, то в хуке type-foreach-file-general мы его переименовываем на свой вариант и отлавливаем уже в своем type-foreach-file.

Таким образом через плагин можно управлять произвольным type_foreach-файлом. Менять скажем оформительские блоки, вроде info не очень хорошая идея, а вот ...-mso-get-pages, ...-head-meta и т.п. в принципе можно. В теории можно написать плагин, который будет опционально перехватывать вызовы всех type_foreach-файлов и подставлять вместо них свой вариант из опций, которые формируются в админ-панели. Грубо говоря менять код type_foreach-файлов можно прямо из админ-панели.

Для тех кто хочет потестировать новую возможность следует заменить mso_page_foreach():

Код: Выбрать все

function mso_page_foreach($type_foreach_file = false)
{
   global $MSO;
   
   # при первом обращении занесем сюда все файлы из шаблонного type_foreach
   # чтобы потом результат считывать из масива, а не по file_exists
   static $files = false;

   $MSO->data['type_foreach_file'] = $type_foreach_file; // помещаем в $MSO вызываемый тип
   
   // описание см. default/type_foreach/_general.php
   if (file_exists(getinfo('template_dir') . 'type_foreach/general.php'))
      include(getinfo('template_dir') . 'type_foreach/general.php');
   
   // можно поменять type_foreach-файл через хук
   $type_foreach_file = mso_hook('type-foreach-file-general', $type_foreach_file);
   
   if ($type_foreach_file)
   {
      if ($files === false)
      {
         $CI = & get_instance();
         $CI->load->helper('directory');
         $files = directory_map(getinfo('template_dir') . 'type_foreach/', true); // только в type_foreach
         if (!$files) $files = array();
      }

      if (in_array($type_foreach_file . '.php', $files)) // есть файл в шаблоне
         return getinfo('template_dir') . 'type_foreach/' . $type_foreach_file . '.php';
      else
      {   
         // файла нет
         // если есть хук type-foreach-file
         if (mso_hook_present('type-foreach-file'))
         {
            // получим его значение
            // он должен возвращать либо полный путь к файлу, либо false
            if ($out = mso_hook('type-foreach-file', $type_foreach_file))
               return $out; // указан путь
            else
               return false; // вернул false
         }
         else // нет хука type-foreach-file
            return false;
      }
   }
   
   return false;
}


Для демонстрации возможностей код плагина «_test2»:

Код: Выбрать все

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
 * MaxSite CMS
 * (c) http://max-3000.com/
 */


function _test2_autoload()
{
   mso_hook_add('type-foreach-file-general', '_test2_f0'); // перебивает стандартные type_foreach-файлы
   mso_hook_add('type-foreach-file', '_test2_f1'); // type_foreach-файлы
}

function _test2_f0($tff = false)
{   
   // меняем некоторые type_foreach-файл на свои
   if ($tff == 'info-top') return 'my-info-top';
   elseif ($tff == 'info-bottom') return 'my-info-bottom';
   
   return $tff;
}

function _test2_f1($tff = false)
{   
   // смотрим какие type_foreach-файлы и от этого подключаем свои
   if ($tff == 'my-info-top') return getinfo('plugins_dir') . '_test2/type_foreach/info-top.php';
   elseif ($tff == 'my-info-bottom') return getinfo('plugins_dir') . '_test2/type_foreach/info-bottom.php';
   elseif ($tff == 'page_404') return getinfo('plugins_dir') . '_test2/type_foreach/page_404.php';
   
   return false;
}


# end file


Файлы в type_foreach плагина уже по своему усмотрению.

olann
Сообщений: 78
Зарегистрирован: 23 мар 2010, 22:13

Re: Хуки для type_foreach-файлов

Сообщение olann » 07 июн 2011, 21:29

Макс, а Можно использовать дынные хуки для создания свой формы комментариев и страницы (в целях создания плагина DISQUS)

Аватар пользователя
MAX
Администратор
Сообщений: 3179
Зарегистрирован: 31 янв 2009, 19:02

Re: Хуки для type_foreach-файлов

Сообщение MAX » 07 июн 2011, 21:56

Наверное можно.

olann
Сообщений: 78
Зарегистрирован: 23 мар 2010, 22:13

Re: Хуки для type_foreach-файлов

Сообщение olann » 09 июн 2011, 16:56

Я так понял что этими хуками я могу пользоваться уже начиная с версии 051?
пишу плагин по аналогии

Код: Выбрать все

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

function maxsite_disqus_autoload()
{
   mso_hook_add('type-foreach-file-general', 'maxsite_disqus_f0'); // перебивает стандартные type_foreach-файлы
   mso_hook_add('type-foreach-file', 'maxsite_disqus_f1'); // type_foreach-файлы
}

function maxsite_disqus_f0($tff = false)
{   
   // меняем некоторые type_foreach-файл на свои
   if ($tff == 'page-comments') return 'disqus-page-comments';
   elseif ($tff == 'page-comment-form') return 'disqus-page-comment-form';
   
   return $tff;
}

function maxsite_disqus_f1($tff = false)
{   
   // смотрим какие type_foreach-файлы и от этого подключаем свои
   if ($tff == 'page-comments') return getinfo('plugins_dir') . 'maxsite_disqus/type_foreach/page-comments.php';
   elseif ($tff == 'page-comment-form') return getinfo('plugins_dir') . 'maxsite_disqus/type_foreach/page-comment-form.php';
   
   return false;
}

# end file

И после активации ошибки
A PHP Error was encountered

Severity: Warning

Message: Cannot modify header information - headers already sent by (output started at Z:\home\localhost\www\mso2\application\maxsite\plugins\maxsite_disqus\index.php:1)

Filename: common/common.php

Line Number: 1702

A PHP Error was encountered

Severity: Warning

Message: Cannot modify header information - headers already sent by (output started at Z:\home\localhost\www\mso2\application\maxsite\plugins\maxsite_disqus\index.php:1)

Filename: common/common.php

Line Number: 1703

Что я делаю не так?

Аватар пользователя
MAX
Администратор
Сообщений: 3179
Зарегистрирован: 31 янв 2009, 19:02

Re: Хуки для type_foreach-файлов

Сообщение MAX » 09 июн 2011, 18:05

Ну как минимум воспользоваться нормальным редактором умеющим работать в utf8. ;)

olann
Сообщений: 78
Зарегистрирован: 23 мар 2010, 22:13

Re: Хуки для type_foreach-файлов

Сообщение olann » 09 июн 2011, 22:47

Да. Проблема была именно в этом.
Да поправил. посмотрел изменил. У меня следующий вопрос.
Не хочу быть царицей, а хочу быть владычицей морской.
Думал что не подойдет посмотрел, попробовал так и Вышло, могу ли я таким-же образом переназначать не type_foreach а type файлы?

Аватар пользователя
MAX
Администратор
Сообщений: 3179
Зарегистрирован: 31 янв 2009, 19:02

Re: Хуки для type_foreach-файлов

Сообщение MAX » 10 июн 2011, 01:09

А смысл? Стандартные type-файлы нет смысла переопределять, а новые цепляются на хук custom_page_404.

olann
Сообщений: 78
Зарегистрирован: 23 мар 2010, 22:13

Re: Хуки для type_foreach-файлов

Сообщение olann » 10 июн 2011, 09:45

Хм, ну а тогда есть еще какой способ отказаться от стандартной системы комментирования? И прикрутить свою.

Аватар пользователя
MAX
Администратор
Сообщений: 3179
Зарегистрирован: 31 янв 2009, 19:02

Re: Хуки для type_foreach-файлов

Сообщение MAX » 10 июн 2011, 10:06

В смысле?

olann
Сообщений: 78
Зарегистрирован: 23 мар 2010, 22:13

Re: Хуки для type_foreach-файлов

Сообщение olann » 16 июн 2011, 12:19

Хочу использовать стороннюю систему комментирования DISQUS. От стандартной хочу отказаться.
Пока зацепился за type файл page-comments.php
Хочу это реализовать на уровне плагина. За что прицепиться и как это правильно сделать?


Вернуться в «if (!is_type('Programmer')) die('not for you');»

Кто сейчас на форуме

Пользователь просматривает форум: нет зарегистрированных пользователей