Плагин пользовательских типов метаполей Custom Meta для MaxSite CMS
Плагин пользовательских типов метаполей 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, где проиллюстрировано использование этого типа метаполей.
- options_key = for_catalog
- type = type_select_lookup_page
- description = "Выберите"
- default =
- page_type = catalog
- source_type = static
- result_field = page_id
- lookup_field = page_title
В этом примере, в админке редактирования страниц, для страниц с типа "catalog" (и только для них) добавится поле for_catalog с выпадающим списком заголовков всех страниц типа "static"; а при выборе конкретной страницы - в метаполе будет сохраняться номер выбранной страницы.
Можно создавать метаполя любого типа, создав файл с соответствующим именем в папке meta_types.
А вот как реализовано добавление формы редактирования этого метаполя в файле meta_types/type_select_lookup_page.php
- // получим тип нужных страниц
- if (!isset($row['page_type'])) $row['page_type'] = '';
- if ($row['page_type'])
- {
- $CI = & get_instance();
- $CI->db->select('page_id, page_slug, page_title , page_type_name ');
- $CI->db->where('page_date_publish <', date('Y-m-d H:i:s'));
- $CI->db->where('page_status', 'publish');
- $CI->db->where('page_id', $page_id);
- $CI->db->where('page_type_name', $row['page_type']);
- $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');
- $CI->db->from('page');
- $CI->db->order_by('page_id', 'random');
- $query = $CI->db->get();
- if ($query->num_rows() > 0) // текущая страница нужного типа
- {
- $type_desc = '';
- foreach ($query->result_array() as $r)
- if (isset($r['page_type_name'])) $type_desc = $r['page_type_name'];
- // выясняем какого типа таблица из которой подставляется поле
- $source_type = $row['source_type'];
- // какое поле нужно подставлять
- $result_field = $row['result_field'];
- // какое поле нужно отображать
- $lookup_field = $row['lookup_field'];
- // получаем нужные поля нужного имени для всех таблиц нужного типа
- $CI = & get_instance();
- $CI->db->select($result_field . ',' . $lookup_field);
- $CI->db->where('page_date_publish <', date('Y-m-d H:i:s'));
- $CI->db->where('page_status', 'publish');
- $CI->db->where('page_type_name', $source_type);
- $CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');
- $CI->db->from('page');
- $CI->db->order_by('page_id', 'random');
- $query = $CI->db->get();
- $lookup_count = $query->num_rows();
- // $f .= '' . t('Страницы типа ', 'admin') . $type_desc . ' (' . $lookup_count . ')';
- if ($lookup_count > 0) // есть страницы
- {
- $f .= '<select name="' . $name_f . '">';
- foreach ($query->result_array() as $r)
- {
- $val = $r[$result_field];
- $val_t = $r[$lookup_field];
- if ($value == $val) $checked = 'selected="selected"';
- else $checked = '';
- $f .= NR . '<option value="' . $val . '" ' . $checked . '>' . $val_t . '</option>';
- }
- $f .= NR . '</select>' . NR;
- }
- else
- {
- //если страниц для выбора нет, тогда выведем как текстовое поле
- $value = str_replace('_QUOT_', '"', $value);
- $f .= '<input type="text" name="' . $name_f . '" value="' . $value . '">' . NR;
- }
- }
- }
Классификация пользоательских метаполей и способов их вывода для MaxSite CMS.
MaxSite CMS позволяет к существующим полям страницы добавлять произвольные ...
Автоматическое формирование раздела ссылок на сайте из закладок FasQu.

Часто на сайте присутствует раздел links. Как сформировать этот раздел? - не ...
Плагин Кнопка скроллинга вверх для MaxSite CMS
Совсем маленький плаги scrolltopcontrol, помещающий в правом нижнем углу окна ...
Taggallery 1.1. - плагин галерей изображений для Max Site CMS
Новая версия плагина с добавлением описанных в предыдущем посте ...
Taggallery 1.3. - плагин галерей изображений для Max Site CMS.
Новая версия плагина галерей изображений, включающая такие ...











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