Обычной ситуацией является вопросы клиента “Как мне поменять почту внизу сайта?” “Как поменять телефоны в шапке?” – этих полей нет в админке, так как разработчик просто вписал их в шаблон, а лазить по файлам сайта клиент уж никак не должен. Решить эту проблему может дополнительное поле в настройках сайта.
! информация устарела, некоторый код битый, статья готовится к удалению.
Для примера будем добавлять поле со ссылкой на страницку клиента в соц. сети.
Имеем чистый ocStore 2.1, начинаем поиски!
1. Открываем страничку куда нужно добавить – это настройки (добавляем в “витрину”, так как там телефоны и прочее).
Далее смотрим – какой же контроллер отвечает за эту страницу?
http://site/admin/index.php?route=setting/setting&token=gzaGAyqKnA1T9GmsZOyy6duFoflZEQGk |
?route=setting/setting – значит нам нужен контроллер админки, который называется setting и лежит в папке setting. Открываем его и работаем дальше с ним.
2. Копировать будем поле телефона, так как оно вполне нам подходит и выводится должно так же как и телефон. Ищем где получается переменная/ Поиск по слову telephone (определить это слово можно либо интуитивно, либо посмотрев шаблон tpl в котором выводится это поле) выдает нам несколько мест.
- $data['entry_telephone'] = $this->language->get('entry_telephone'); - if (isset($this->error['telephone'])) { $data['error_telephone'] = $this->error['telephone']; } else { $data['error_telephone'] = ''; } - if (isset($this->request->post['config_telephone'])) { $data['config_telephone'] = $this->request->post['config_telephone']; } else { $data['config_telephone'] = $this->config->get('config_telephone'); } - if ((utf8_strlen($this->request->post['config_telephone']) < 3) || (utf8_strlen($this->request->post['config_telephone']) > 32)) { $this->error['telephone'] = $this->language->get('error_telephone'); } |
Разбираемся по порядку:
3.
$data['entry_telephone'] = $this->language->get('entry_telephone'); |
Эта строчка нам говорит, что есть переменная в шаблоне $entry_telephone, которая берется из языкового файла. Значит нужно подниматься вверх по файлу контроллера и искать какие языковые файлы подключены, либо легче – поискать по файлам переменную entry_telephone. Первый вариант проще, так как подключен только один файл выше этой строчки:
$this->load->language('setting/setting'); |
И вправду – там есть строчка $_[‘entry_telephone’] = ‘Телефон:’;
добавляем под ней строчку
$_['entry_soc'] = 'Соцсеть:'; |
А в контроллер :
$data['entry_soc'] = $this->language->get('entry_soc'); |
4.
if (isset($this->error['telephone'])) { $data['error_telephone'] = $this->error['telephone']; } else { $data['error_telephone'] = ''; } |
Этот блок работает когда страница настроек сохраняется – валидация поля телефон. Так как никаких функций здесь не используется – просто копируем
if (isset($this->error['soc'])) { $data['error_soc'] = $this->error['soc']; } else { $data['error_soc'] = ''; } |
5.
if (isset($this->request->post['config_telephone'])) { $data['config_telephone'] = $this->request->post['config_telephone']; } else { $data['config_telephone'] = $this->config->get('config_telephone'); } |
Этот блок работает следущим образом:
Если страница перезагружается (есть переменная в POST) – записываем значение оттуда. Это чтоб не слетал номер при перезагрузке страницы либо при проверке полей.
Записывается в базу значение в начале контроллера, т.е. если что либо есть в POST и прошла валидация – пишем в БД.
Тоже просто копируем его:
if (isset($this->request->post['config_soc'])) { $data['config_soc'] = $this->request->post['config_soc']; } else { $data['config_soc'] = $this->config->get('config_soc'); } |
6. Последнее место в контроллере:
if ((utf8_strlen($this->request->post['config_telephone']) < 3) || (utf8_strlen($this->request->post['config_telephone']) > 32)) { $this->error['telephone'] = $this->language->get('error_telephone'); } |
это проверка, в ней мы поменяем значения и допишем переменную error_soc
if ((utf8_strlen($this->request->post['config_soc']) < 3) || (utf8_strlen($this->request->post['config_soc']) > 320)) { $this->error['soc'] = $this->language->get('error_soc'); } |
Получилось, что пройдет валидацию поле, которое больше 3 символов и меньше 320 (с головой для ссылки на соцсеть). Если не пройдет – надо вывести текст из error_soc. Для начала пощем в том же языковом файле, что и раньше: верно, писать нужно туда $_[‘error_soc’] = ‘Ссылка должна быть от 3 до 320 символов!’;
7. Таким образом у нас готов контроллер и языковой файл. Посмотрим куда отправляются на обработку все эти данные, это написано в конце функции index контроллера:
$this->response->setOutput($this->load->view('setting/setting.tpl', $data)); |
8. Открываем setting/setting.tpl нашего шаблона.
Мы уже знаем, что переменная, которую мы копируем имеет название $telephone, ищем ее:
И копируем идентично:
(я убрал required так как это не особо обязательное поле)
9. Заходим в админку чтоб проверить какие ошибки получились. Пока нету, это хорошо =). Сохраняем какое либо значение и идем в БД смотреть добавилось ли поле config_soc.
Для этого нам надо найти где сохраняется config_telephone – а это в oc_setting. Там тоже должно наблюдаться уже сохраненное значение.
10. Поле сохранено – нужно его теперь как то вывести, а выводить я его хочу к примеру, в футере. Берем контроллер футера: common/footer
Там подсматриваем как получается из бд любое значение в котором есть config (просто ищем любое значение, котороые вытягивается из конфигов)
получается вот так:
$data['soc'] = $this->config->get('config_soc'); |
Все, таким образом в шаблоне переменная $soc будет выводить значение из таблицы. В нужном месте шаблона вставляем
<!--?php echo $soc; ?--> |
и получаем значение, заданное в админке.
На этом все, задавайте вопросы в коментариях.