Обычной ситуацией является вопросы клиента “Как мне поменять почту внизу сайта?” “Как поменять телефоны в шапке?” – этих полей нет в админке, так как разработчик просто вписал их в шаблон, а лазить по файлам сайта клиент уж никак не должен. Решить эту проблему может дополнительное поле в настройках сайта.

! информация устарела, некоторый код битый, статья готовится к удалению.

Для примера будем добавлять поле со ссылкой на страницку клиента в соц. сети.

Имеем чистый 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; ?-->

и получаем значение, заданное в админке.

На этом все, задавайте вопросы в коментариях.