Це стара версія документу!
Внесення змін
Цілком можливо вам знадобиться внести будь-які зміни в код NoDeny+, наприклад, поміняти деякі тексти, повідомлення, а можливо видалити або додати якусь фічу. Ми наполегливо рекомендуємо не правити безпосередньо існуючий код, оскільки наступні оновлення затруть ваші зміни і вам доведеться їх заново вносити. NoDeny+ не стоїть на місці, постійно з'являються нові можливості, тому необхідно час від часу оновлювати його. Практично гарантовано оновлення не порушать роботу вашої системи, вони проходитимуть безболісно. В особливих випадках, ми будемо попереджати у форумі про важливі зміни та їх наслідки. У будь-якому випадку, svn дозволяє дуже просто відкотитися до будь-якої з попередніх версій, якщо раптом щось не запрацює або просто з'явиться почуття, що щось не так.
У NoDeny+ є система, яка накладає патчі на код. Вона працює за іншим принципом, ніж, скажімо, утиліта patch. Остання вимагає, щоб у файлі був певний фрагмент у певному рядку коду, якщо він буде іншим, то патч не буде застосований. Через таку поведінку, часто не вдасться накласти патч іншу версію файлу, тобто. Майже пишуться під конкретну версію продукту.
У NoDeny+ ми постаралися, щоб патчі не залежали від версії білінгу. Тут не змінюються будь-які фрагменти коду, тут вносяться цілісні фрагменти коду у певні місця, які називаються «хуками». Хук - це мітка у файлі, що починається з фрагмента “#<HOOK>”. При зміні файлу, наприклад, при виході нової версії NoDeny+ або накладанні патча від іншого модуля, положення мітки може змінитися, що не призведе до проблем як утиліти patch.
Давайте напишемо патч “web-заглушки” - змінимо текст повідомлень для клієнтів. Скопіюємо в папку /usr/local/nodeny/modules/MyNetwork файл web/lang/RU_cap.pl та перейменуємо його на create.lang.RU_cap.pl.
cd /usr/local/nodeny/modules/MyNetwork cp ../../web/lang/RU_cap.pl create.lang.RU_cap.pl
Якщо ім'я файлу починається з create. - інсталятор (install.pl -x) створюватиме новий файл, якщо «patch.» - Модифікувати існуючий. Друга частина імені не є важливою, але автор рекомендує давати їй осмислене ім'я. У цьому випадку ми натякнули (собі), що буде створено файл lang/RU_cap.pl. Ім'я файлу, що створюється, знаходиться всередині самого файлу і воно буде web/lang/RU_cap.pl. Найчастіше правляться файли в папці web, тому ми вирішили в іменах файлів опускати слово web.
Абсолютно всі створені та змінені файли матимуть імена, що починаються зі знака підкреслення! Це фантоми. Фантом вважається головнішим за основний файл, тобто. якщо існує фантом – основний файл ігнорується. Якщо видалити фантом, дані братимуться з основного файлу. Запам'ятайте, що основні файли не змінюються. Створюється фантом на основі основного файлу і до нього вносяться зміни. Під час оновлення NoDeny+ оновлюються основні файли. install.pl -x знову створює фантоми на основі змін в основних файлах.
Інсталятор створить web/lang/_RU_cap.pl, який матиме пріоритет перед web/lang/RU_cap.pl, вірніше, останній ігноруватиметься системою.
Також ми згадали, що ім'я створюваного файлу задається в самому файлі create.lang.RU_cap.pl, тому на початку цього файлу додаємо рядок:
#<ACTION> file=>'web/lang/RU_cap.pl',hook=>'new'
Також вносимо зміни до тексту. Запускаємо патчинг:
cd /usr/local/nodeny perl install.pl -x less web/lang/_RU_cap.pl
Якщо ж необхідно внести будь-яку зміну в існуючий файл, а не створювати новий, то нагадуємо ім'я файлу, починаємо з «patch.», скажімо, patch.RU.pl з текстом:
#<ACTION> file=>'web/lang/RU.pl',hook=>'end' $test_test = { msg => 'Yes!!!' };
Тут ми дали вказівку додати текст «$test_test…» у файл web/lang/RU.pl у місце, де знаходиться рядок «#<HOOK>end». Якщо вам не вистачає якихось хуків, тобто ви хочете внести зміну в місце, де немає хука, зверніться до форуму – ми внесемо цей хук у код.
Зміна меню клієнтської статистики
Прочитавши як слід вносити зміни в NoDeny, змінимо назву пункту меню Liqpay клієнтської статистики. Для цього необхідно змінити мовні файли web/lang/RU.pl та web/lang/UA.pl. Створимо файл modules/MyNetwork/patch.LANG.pl:
#<ACTION> file=>'web/lang/RU.pl',hook=>'user_menu_buttons' u_lpay => 'сплатити пластиковою карткою',