Свое описание препаратов для шопов Glavmed by Fred
Glavmed ноября 9, 2009
1. Причины написания.
Главная причина – необходимость выразить благодарность Лаки за проделанную работу. Статьи его реально сэкономили мне время, может и мой опус кому-нибудь пригодится.
2. Задача.
Необходимо сделать добавление контента в описание препаратов на движке SE2 главмеда. Способ правки шаблонов работает, но он несколько прямолинеен и не универсален.
3. Теория.
Как известно (или неизвестно), все (т.е. абсолютно ВСЕ) данные по продаваемым лекарствам в главмедовском движке хранятся в виде XML файла. Насколько я успел разобраться (вникать особенно времени не было, поэтому поправлять меня можно и нужно), при установке движка, а также при выполнении операции ?xmlupdate через браузер происходит следующее:
- каждый препарат или группа препаратов, которые хранятся в файле data/data.xml извлекаются, преобразуются в ассоциативный массив;
- полученный массив сериализуется;
- сериализованный массив сохраняется в папке data с именем item.{ID}.ser или items_in_group.{ID}.ser.
Далее при работе движка обращение за данными по препарату или группе препаратов идет по id препарата или id группы соответственно к файлу item.{ID}.ser или items_in_group.{ID}.ser. Пытливый читатель спросит, что такое child.{ID}.ser, я отвечу так: это данные по подгруппам для тех препаратов, у которых есть несколько вариантов расфасовки.
4. Главная идея.
Мне не хочется лезть в шаблон каждый раз, когда у меня появляется новый, заказанный у Лаки
контент для очередного препарата. С другой стороны, мне нельзя править ser файлы в движке главмеда, ибо они не переживут обновления каталога. В таких нечеловеческих условиях приходится работать.
Выход есть. Когда в движке некая функция получает массив значений для препарата или группы, мне нужно вставить проверку на наличие измененных данных. Если они есть в наличии – значит заменить данные на мои, если нет – ничего не менять. И уже после этого возвращать данные из функции.
5. Конкретика.
Для работы нам понадобится минимальное знание php и наличие сервера с этим самым php. Для начала возьмем любой из ser файлов и преобразуем его содержимое в массив. Далее делаем простой print_r и получаем примерно следующее:
Array
(
[id] => 188
[name] => Viagra
[packages] => Array
(
[0] => Array
(
[id] => 4730
[parent_id] => 188
[pills_count] => 30
[pills_type] => pills
[dosage] => 25
[dosage_type] => mg
[price] => 145.38
[price_per_item] => 4.85
[name] => 30 pills x 25 mg
[save_money] => 0
[per_type] => pill
)
[1] => Array
(
[id] => 4731
[parent_id] => 188
[pills_count] => 60
[pills_type] => pills
[dosage] => 25
[dosage_type] => mg
[price] => 217.13
[price_per_item] => 3.62
[name] => 60 pills x 25 mg
[save_money] => 74
[per_type] => pill
)
[!skip!]
[description] =>
[Drug_name] => Viagra (Sildenafil)
[Drug_Uses] => Viagra is used for treating erectile dysfunction (e.g. male impotence). It works by helping the blood flow into the penis to achieve and maintain an erection during sexual stimulation.
[How_Taken] => Viagra is to be taken 30 minutes to 1 hour before sexual activity. You may take it up to 4 hours before sexual activity. Viagra is not supposed to be taken more often than once per day.
[Drug_Class_and_Mechanism] => Viagra is a phosphodiesterase type 5 inhibitor and it works by helping the blood flow into the penis to achieve and maintain an erection during sexual stimulation.
<img src="/img/viagra.jpg" alt="" />
<img src="/img/viagra_3d.jpg" alt="" />
[Missed_Dose] => Viagra is to be
[!skip!]
[bundle] =>
[price_per_item] => 2.09
[min_price_child_id] => 4735
[sprice_per_item] => 3.97
[group] => Array
(
[name] => Men's Health
[id] => 57
)
)Пропустить пришлось очень многое, потому как, повторюсь, тут хранится ВСЯ информация о препарате, включая описания на нескольких языках. На всякий случай приведу секретный код для получения всего массива:
Для чего это надо? Исключительно для того, чтобы видеть индексы в массиве именно того текста, который мы хотим изменить. Например, мы заказали у Лаки контент по препарату c id 188 (Viagra) и контент этот включает описание дозировки препарата.
Ищем прямо на странице главмедовского движка главмедовский текст, потом ищем его же в нашем массиве (который надо просматривать по F3 в браузере, он тогда удобнее для просмотра) и находим, например, ключ массива [Drug_Uses], для которого значение содержит искомый текст.
Отмечаем себе, что нам нужно будет изменить значение для $array['Drug_Uses'] и повторяем все шаги для остального контента.
Для определенности скажу, что я собираюсь менять следующие значения в массиве:
- [small_description]
- [Drug_Uses]
- [Missed_Dose]
- [Warnings_Precautions]
Наверное, нелишним будет указать, что порядок расположения не имеет никакого значения.
Идем дальше. Если опустить все лирические подробности, то файл, в котором вызывается ТА САМАЯ функция расположен в каталоге core и называется item_data.cls.php. И вот с этой самой минуты начинается очень тонкая работа.
6. ПРЕДУПРЕЖДЕНИЕ.
Далее идут советы по внесению изменений в ядро движка SE2. Все, что вы сделаете – вы сделаете своими руками на свой страх и риск. Если что-то перестанет работать, никто в этом не виноват и помощи ждать будет неоткуда. Я сказал.
7. Снова конкретика.
На самом деле все не так страшно, если вы понимаете простую вещь: резервная копия файла на создание потребует минуты, а сэкономить может часы. Поэтому копируем файл core/item_data.cls.php в core/item_data.cls.php.bck и начинаем “хирургию”.
Находим следующий код (у меня он на строке 289):
/* Читает данные из файла, сохраненые ранее в сериализованном виде
* @param $filename String Имя файла для сохранения
* @return Any Переменная сохраненая ранее.
*/
function load_data($filename){
global $SITE_ROOT;
if(file_exists($SITE_ROOT.'data/'.$filename.'.ser')){
$str = file_get_contents($SITE_ROOT.'data/'.$filename.'.ser');
return unserialize($str);
}
else{
return false;
}
}Заменяем его на следующий:
/* Читает данные из файла, сохраненые ранее в сериализованном виде
* @param $filename String Имя файла для сохранения
* @return Any Переменная сохраненая ранее.
*/
function load_data($filename){
global $SITE_ROOT;
if(file_exists($SITE_ROOT.'data/'.$filename.'.ser')){
$str = file_get_contents($SITE_ROOT.'data/'.$filename.'.ser');
$ar = unserialize($str);
if (file_exists($SITE_ROOT.'data/changed/'.$filename.'.ser')){
include_once ($SITE_ROOT.'data/changed/'.$filename.'.ser');
foreach ($changed as $key => $value){
$ar[$key] = $value;
}
}
return $ar;
}
else{
return false;
}
}и сохраняем.
Что необходимо знать. Во-первых, файлы с измененными значениями массива будут искаться в папке data/changed/ и названия их должны совпадать с названиями исходных файлов. Чуть подробнее объясню ниже. Во-вторых, эти файлы должны иметь строго оговоренную структуру, потому как проверку на валидность данных я не предусматриваю.
8. Порядок работы (в качестве резюме).
- В директории data создаем директорию changed.
- Делаем бекап файла core/item_data.cls.php и вносим в него изменения.
- Находим id препарата, данные которого необходимо изменить.
- Находим ключи массива, в которых хранятся данные, подлежащие изменению.
- Создаем в директории data/changed/ файл с именем item.{ID}.ser и в нем размещаем данные в следующем виде:
“Здесь измененный текст”,
“Drug_Uses” => “Здесь измененный текст”,
“Missed_Dose” => “Здесь измененный текст”,
“Warnings_Precautions” => “Здесь измененный текст”
);
?>
6. Идем на страницу сайта с описанием препарата и проверяем, что получилось.
9. TODO.
Я не предусматривал никакой фильтрации измененного контента. Т.е. не делается проверок на корректность текста, его размер, наличие специальных символов и т.д. Для моих целей вполне достаточно и того, что получилось. В принципе, вполне можно набросать скрипт, который будет автоматически создавать файлы для измененного контента, чтобы избежать ошибок. Но это уже другая история.




В п.5 резюме пропущен кусок кода.
Читать надо так:
в нем размещаем данные в следующем виде:
“Здесь измененный текст”,
“Drug_Uses” => “Здесь измененный текст”,
“Missed_Dose” => “Здесь измененный текст”,
“Warnings_Precautions” => “Здесь измененный текст”
);
?>
Сорри, тут что-то с добавлением кода не то
“Здесь измененный текст”,
“Drug_Uses” => “Здесь измененный текст”,
“Missed_Dose” => “Здесь измененный текст”,
“Warnings_Precautions” => “Здесь измененный текст”
);
?>
Молодец Fred, не зажал инфу.Жаль не могу объективно оценить твой код, не шарю я в нем:)
отлично!
Всем, кому не хватает кода (движок этого блога не дает выложить php код как есть) – стучите 560535
Исправил
Можно пхп запаковать в архив и прицепить к посту.
alexf2000 – Отличная идея.
Макс, разжевал бы чё нить про Драгов, очень бы помог
Большое спасибо, хоть где то подробно и по человечески описали главмед и всё разложили по полачкам, вот теперь и я попробую создать сателит и поднять бабло с главмеда.