Плагин пользовательских типов метаполей Custom Meta для MaxSite CMS

Плагин пользовательских типов метаполей Custom Meta для MaxSite CMS

20 марта 2010 г. Sadovnik Просмотров: 312 RSS
Custom Meta для MaxSite CMS , ,

Плагин родился в результате обсуждения функционала на форуме в ветке Выбор из бд в метаполе - как?.

После активации плагина станут доступны новые типы метаполей.

Для создания нового типа метаполя, необходимо в папку meta_types плагина, добавить файл с соответствующим типу именем.

В этом файле реализуется часть формы редактирования страницы, содержащая элементы, необходимые для редактирования этого метаполя.

Инициализироваться метаполя пользовательского типа должны в файле meta.ini папки плагина.

Это пришлось сделать из-за того, что система выводит заголовки и описания метаполей,определенных в шаблонном meta.ini, даже если они типа, который не знает система.

В плагине реализованы расширения стандартных метаполей, отличающихся тем, что выводятся только при редактировании заданных типов страницы.

    Имена типов расширенных метаполей:
  • type_checkbox
  • type_radio
  • type_select
  • type_textarea
  • type_textfield

В расширенных метаполях, по отношению к стандартным, появилось еще одно поле, page_type, в котором определяем типы страниц, на которых это поле будет отображаться в админке при редактировании страницы. На других страницах метаполе отображаться не будет.

Но, скажете вы, MaxSite CMS уже имеет возможность инициализации новых метаполей. Подумаешь: эка невидаль - избирательный их вывод при редактировании страниц.

Но тут вся прелесть в том, что мы можем создавать свои метаполя, как нам вздумается, называть их по-своему, реализовывая логику функционирования метаполя в файле с соответствующим именем.

Как пример, добавил тип метаполя type_select_lookup_page.

Это метаполе позволяет осуществлять подстановку значений из других страниц. Можно, кроме типа отображения, задать тип страниц для подстановки, поле для подстановки и, отображаемое поле при подстановке.

Собственно, это поле работает как поле "Родительская страница" а отличается возможностью сузить выпадающий список страниц до страниц определенного типа.

Пример : type_select_lookup_page.

Вот текст примерного дефолтного meta.ini, где проиллюстрировано использование этого типа метаполей.

  1.  options_key = for_catalog
  2.  type = type_select_lookup_page
  3.  description = "Выберите"
  4.  default =
  5.  page_type = catalog
  6.  source_type = static
  7.  result_field = page_id
  8.  lookup_field = page_title

В этом примере, в админке редактирования страниц, для страниц с типа "catalog" (и только для них) добавится поле for_catalog с выпадающим списком заголовков всех страниц типа "static"; а при выборе конкретной страницы - в метаполе будет сохраняться номер выбранной страницы.

Можно создавать метаполя любого типа, создав файл с соответствующим именем в папке meta_types.

А вот как реализовано добавление формы редактирования этого метаполя в файле meta_types/type_select_lookup_page.php

  1.  // получим тип нужных страниц
  2.  if (!isset($row['page_type'])) $row['page_type'] = '';
  3.  if ($row['page_type'])
  4.  {
  5.   $CI = & get_instance();
  6.   $CI->db->select('page_id, page_slug, page_title , page_type_name ');
  7.   $CI->db->where('page_date_publish <', date('Y-m-d H:i:s'));
  8.   $CI->db->where('page_status', 'publish');
  9.   $CI->db->where('page_id', $page_id);
  10.   $CI->db->where('page_type_name', $row['page_type']);
  11.   $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');
  12.   $CI->db->from('page');
  13.   $CI->db->order_by('page_id', 'random');
  14.  
  15.   $query = $CI->db->get();
  16.  
  17.   if ($query->num_rows() > 0) // текущая страница нужного типа
  18.   {
  19.   $type_desc = '';
  20.   foreach ($query->result_array() as $r)
  21.   if (isset($r['page_type_name'])) $type_desc = $r['page_type_name'];
  22.  
  23.  
  24.   // выясняем какого типа таблица из которой подставляется поле
  25.   $source_type = $row['source_type'];
  26.   // какое поле нужно подставлять
  27.   $result_field = $row['result_field'];
  28.   // какое поле нужно отображать
  29.   $lookup_field = $row['lookup_field'];
  30.  
  31.   // получаем нужные поля нужного имени для всех таблиц нужного типа
  32.  
  33.   $CI = & get_instance();
  34.   $CI->db->select($result_field . ',' . $lookup_field);
  35.   $CI->db->where('page_date_publish <', date('Y-m-d H:i:s'));
  36.   $CI->db->where('page_status', 'publish');
  37.   $CI->db->where('page_type_name', $source_type);
  38.   $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');
  39.   $CI->db->from('page');
  40.   $CI->db->order_by('page_id', 'random');
  41.  
  42.   $query = $CI->db->get();
  43.   $lookup_count = $query->num_rows();
  44.  // $f .= '' . t('Страницы типа ', 'admin') . $type_desc . ' (' . $lookup_count . ')';
  45.  
  46.   if ($lookup_count > 0) // есть страницы
  47.   {
  48.   $f .= '<select name="' . $name_f . '">';
  49.   foreach ($query->result_array() as $r)
  50.   {
  51.   $val = $r[$result_field];
  52.   $val_t = $r[$lookup_field];
  53.   if ($value == $val) $checked = 'selected="selected"';
  54.   else $checked = '';
  55.  
  56.   $f .= NR . '<option value="' . $val . '" ' . $checked . '>' . $val_t . '</option>';
  57.   }
  58.   $f .= NR . '</select>' . NR;
  59.   }
  60.   else
  61.   {
  62.   //если страниц для выбора нет, тогда выведем как текстовое поле
  63.   $value = str_replace('_QUOT_', '"', $value);
  64.   $f .= '<input type="text" name="' . $name_f . '" value="' . $value . '">' . NR;
  65.   }
  66.   }
  67.   }
Похожие страницы
Комментариев: 2
  1. skylabs 7 октября 2010 в 23:30:23 (ссылка)

    Супер! То что надо! В Друпале это называется CCK и считается одним из самых крутых фишек Друпала (наряду с Views и таксономией).

    Спасибо за работу! smile

    (только меня удивляет, почему больше никто не поблагодарил?.. ну то ладно, всякое бывает)

  2. Sadovnik 13 октября 2010 в 03:04:12 (ссылка)

    Самое интересное, "одна из самых крутых фишек Друпала" сделалась за час.

Оставьте комментарий!

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

Авторизация: Авторизация MaxSite CMS. Facebook.

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)