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] =&gt; Viagra is to be 
 
[!skip!] 
 
    [bundle] =&gt;
    [price_per_item] =&gt; 2.09
    [min_price_child_id] =&gt; 4735
    [sprice_per_item] =&gt; 3.97
    [group] =&gt; Array
        (
            [name] =&gt; Men's Health
            [id] =&gt; 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 =&gt; $value){
                   $ar[$key] = $value;
               }
            }
        return $ar;
        }
        else{
            return false;
        }
    }

и сохраняем.

Что необходимо знать. Во-первых, файлы с измененными значениями массива будут искаться в папке data/changed/ и названия их должны совпадать с названиями исходных файлов. Чуть подробнее объясню ниже. Во-вторых, эти файлы должны иметь строго оговоренную структуру, потому как проверку на валидность данных я не предусматриваю.

8. Порядок работы (в качестве резюме).

  1. В директории data создаем директорию changed.
  2. Делаем бекап файла core/item_data.cls.php и вносим в него изменения.
  3. Находим id препарата, данные которого необходимо изменить.
  4. Находим ключи массива, в которых хранятся данные, подлежащие изменению.
  5. Создаем в директории data/changed/ файл с именем item.{ID}.ser и в нем размещаем данные в следующем виде:

“Здесь измененный текст”,
Drug_Uses” => “Здесь измененный текст”,
Missed_Dose” => “Здесь измененный текст”,
Warnings_Precautions” => “Здесь измененный текст”

);

?>

6. Идем на страницу сайта с описанием препарата и проверяем, что получилось.

9. TODO.

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



This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.



Комментарии:

  1. fred | ноября 11, 2009 at 13:25

    В п.5 резюме пропущен кусок кода.

    Читать надо так:

    в нем размещаем данные в следующем виде:

    “Здесь измененный текст”,
    “Drug_Uses” => “Здесь измененный текст”,
    “Missed_Dose” => “Здесь измененный текст”,
    “Warnings_Precautions” => “Здесь измененный текст”

    );

    ?>

    Reply to this comment
  2. fred | ноября 11, 2009 at 13:27

    Сорри, тут что-то с добавлением кода не то

    “Здесь измененный текст”,
    “Drug_Uses” => “Здесь измененный текст”,
    “Missed_Dose” => “Здесь измененный текст”,
    “Warnings_Precautions” => “Здесь измененный текст”

    );

    ?>

    Reply to this comment
  3. Afigenskij | ноября 13, 2009 at 9:27

    Молодец Fred, не зажал инфу.Жаль не могу объективно оценить твой код, не шарю я в нем:)

    Reply to this comment
  4. MazaHaka | ноября 13, 2009 at 10:13

    отлично!

    Reply to this comment
  5. fred | ноября 13, 2009 at 12:34

    Всем, кому не хватает кода (движок этого блога не дает выложить php код как есть) – стучите 560535

    Reply to this comment
  6. Lucky-Max | ноября 13, 2009 at 15:17

    Исправил :)

    Reply to this comment
  7. alexf2000 | ноября 24, 2009 at 15:49

    Можно пхп запаковать в архив и прицепить к посту.

    Reply to this comment
  8. Lucky-Max | ноября 24, 2009 at 15:51

    alexf2000 – Отличная идея.

    Reply to this comment
  9. gertc | ноября 30, 2009 at 1:39

    Макс, разжевал бы чё нить про Драгов, очень бы помог

    Reply to this comment
  10. SERJ | февраля 21, 2010 at 14:12

    Большое спасибо, хоть где то подробно и по человечески описали главмед и всё разложили по полачкам, вот теперь и я попробую создать сателит и поднять бабло с главмеда.

    Reply to this comment

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





Dofollow Блог