Что удобнее использовать - стандартный тип материала product или свой собственный? Product 1. Работает со стандартным каталогом уберкарта. 2. Позволяет набивать в себя дополнительные ССК поля 3. Темизация шаблона вывода (node-product.tpl.php) 4. Работа с таксономией и views. и т.д. My type 1. Работает со стандартным каталогом уберкарта. 2. Позволяет набивать в себя дополнительные ССК поля 3. Темизация шаблона вывода (node-product.tpl.php) 4. Работа с таксономией и views. и т.д. Краткий вывод: Разницы в использовании своих типов материалов, либо особой нет, это лишь дело вкуса и пристрастий каждого из разработчиков. В реальных разработках мы иногда сталкиваемся с необходимостью использовать несколько типов продуктов с разными наборами полей к примеру продажа Книг, Копмакт дисков, Журналов либо каких-то других периодических изданий. У каждого из этих товаров в любом случае имеется свой набор соответствующих полей которые специфичны для того или иного вида к примеру у книги это ISBN, у журнала периодичность издания, у диска тип или жанр предоставляемой на нем информации. В таком случае нам волей неволей придется использовать несколько типов материалов и помнить что такое product не всегда удобно да и нужно. В таких случаях проще отказаться от типа по умолчанию и создать свои типы «book», «disk», «magazine» зарегистрировать их в уберкарте.
Переходим на Url Типы материалов можно создать до установки или включения уберкарта, после включения модулей магазина, главное правильно ввести названия машинного типа. После регистрации данных типов уберкарт автоматически добавит в них филдсет «Product information» с ценами, весом, позицией в каталоге, габаритами, количеством в упаковке количеством добавляемом в корзину по умолчанию. Данный набор может дополнятся либо уменьшаться в зависимости от подключаемых модулей. Неизменными остаются цена, SKU, тип продукта (доставляемый или нет). SKU уникальный номер товара в Вашем магазине некоторые отказываются от его использования посредством автоматизации присваивания
Что лучше использовать для категоризации товаров? Taxonomy: 1. Входит в ядро друпала. 2. Использует для навигации taxonomy/term/tid работающий при отсутсвии вьюсов. 3. Неограниченная вложеность категорий 4. Расширямеость функционала дополнительными модулями типа taxonomy_menu, taxonomoy_image и т.д. Category: 1. Категория нода. 2. Расширяемость ССК полями 3. Возможность шаблонизации в виде node-category_cat.tpl.php 4. Имеет собственное меню (недостатки аналогичны taxonomy_menu, но нет необходимости устанавливать дополнительный модуль). 5. Возможность отображения товаров на странице категории любой из набора созданных views. 6. Возможность отображать на своей-же странице подкатегории помимо товаров (вообще благодаря шаблонизации имеется возможность вывести неограниченное количество любой информации на странице). 7. Для синхронизации с taxonomy использует обертку которая синхронизирует изменения и дополнения в таблицах term_*. 8.Допускается вложенность контейнера в контейнер.
Платежный модуль своими руками для Drupal 5.х Регистрация страницы результата платежа 5.х Перекрытие кнопки submit на форме оформления заказа: Для 6-й ветки hook_menu выглядит несколько иначе.
Регистрация платежного метода в уберкарт Id ключ метода Name имя метода Title Название которое выводится на странице при выборе метода платежа Desc описание метода Weight Вес (необязательно) Callback функция строящая форму настроек метода платежа Checkout булевый параметр (истинное предназначение пока не известно)
Форма настроек для платежного метода Будет отображаться по адресу:
Функция построения формы для отправки данных на сервер приема платежей Вызывает внутри себя функцию получения данных для построения формы см. ниже. Формат построения данной формы напрямую зависит от требований сайта приемки Платежа, имеет режим для тестирования и режим live
Функция подготовки данных для отправки Различия с get_data_testing только в использовании действующих переменных. Формат подготовки данных может отличаться в зависимости от требований платежного Метода В данной функции так-же в зависимости от требований собирается и кодируется строка сигнатуры платежа.
Функции обработки платежа 1. Функция кодирования сигнатуры 2. callback_menu страница отображения результатов платежа 3. Вспомогательная функция (была необходима для подмены http на https по требованиям Платежной системы) 4. Функция кодов ошибок возвращаемых сервером приема платежей.
Dataimport и с чем его едят 1. Права доступа к выполнению импорта. 2. Регистрация меню для модуля 3. Функция регистрации доступных плагинов для импорта данных 4. Функция обработки настроек импорта для плагина 5. Функция включения batch процесса 6. hook регистрации плагина 7. Ведение уникальности импортируемых данных 8. Обработка уникальности импортируемых данных 9. Хуки для импорта пользователей и комментариев, могут не использоваться.
Пример написания плагина для импорта тем форумов для 6.х Processing массив с callback функциями участвующими в процессе импорта данных м.б. «process», «delete» каждый ключ может содержать несколько callback Settings_form функция построения формы на странице импорта (можем задать параметры или условия для успешного выполнения импорта) Fifnished, final callback для завершения batch процесса (может быть несколько).
function import_books_row_callback($row, $ret) { global $user; if ($row['data']['price'] >= 4 && (!empty($row['data']['description']) or !empty($row['data']['parent']) or !empty($row['data']['author']) or !empty($row['data']['series']))){ $nid = dataimport_get_nid('books', $row['data']['id']); if ($nid) { $node = node_load($nid); $ret['update'] = isset($ret['update']) ? $ret['update']+1 : 1; } else { $node = new StdClass(); $node->nid = 0; $node->type = 'pbook'; $node->status = 1; $ret['create'] = isset($ret['create']) ? $ret['create']+1 : 1; } $node->uid = $user->uid; $node->shippable = 1; $node->dataimport['type'] = 'books'; $node->dataimport['sku'] = $row['data']['id']; $node->model = $row['data']['id']; if (isset($row['data']['name'])) $node->title = $row['data']['name']; if (isset($row['data']['price'])) $node->sell_price = $row['data']['price']; //The changed timestamp is always updated for bookkeeping purposes (revisions, searching,...) if (isset($row['data']['isbn'])) $node->field_pbook_isbn[0]['value'] = $row['data']['isbn']; if (isset($row['data']['author'])) $node->field_pbook_authorstr[0]['value'] = $row['data']['author']; if (isset($row['data']['description'])) { $node->field_pbook_description[0]['value'] = $row['data']['description']; $node->field_pbook_description[0]['format'] = '3'; } if (isset($row['data']['publisher'])) $node->field_pbook_publisherstr[0]['value'] = $row['data']['publisher']; if (isset($row['data']['year'])) $node->field_pbook_year[0]['value'] = $row['data']['year']; if (isset($row['data']['series'])) $node->field_pbook_seriesstr[0]['value'] = $row['data']['series']; if (isset($row['data']['cover'])) $node->field_pbook_cover[0]['value'] = $row['data']['cover']; if (isset($row['data']['pages'])) $node->field_pbook_pages[0]['value'] = $row['data']['pages']; if (isset($row['data']['lang'])) { $node->field_pbook_lang[0]['value'] = $row['data']['lang']; } else {$node->field_pbook_lang[0]['value'] = 1;} if (isset($row['data']['parent'])) { $sku_keys = explode(',', $row['data']['parent']); $node->category = array(); foreach($sku_keys as $sku_key) { if ($nid = dataimport_get_nid('categories', intval($sku_key))) { $node->category[$nid] = new stdClass(); $node->category[$nid]->nid = $nid; $node->category[$nid]->cid = $nid; $node->category[$nid]->cnid = db_result(db_query("SELECT cnid FROM {category} WHERE cid = %d", $nid)); } node_save($node); }
Спасибо за внимание! Юрий Глушков