четверг, 11 апреля 2013 г.

Контакты в шапке сайта (урок 3)


В сегодняшнем уроке:
- создадим формы в админ-панели ( номер, иконка и имя);
- выведем данные, из выше упомянутых форм, в нужное нам место (шапку OpenCart).

Будем править следующие файлы (делаем их копии):

\admin\controller\setting\setting.php
\admin\view\template\setting\setting.tpl
\admin\language\russian\setting\setting.php
\admin\language\russian\russian.php
\catalog\controller\common\header.php
\catalog\view\theme\default\template\common\header.tpl
Делалось на OpenCart 1.5.4.1

1.0. Начнем с
\admin\controller\setting\setting.php

1.1. ищем:
this->data['entry_address'] = $this->language->get('entry_address');

после вставляем:
// контакты - подключаем вывод языкового модуля.
$this->data['entry_contact_namber'] = $this->language->get('entry_contact_namber');
$this->data['entry_contact_icon'] = $this->language->get('entry_contact_icon');
$this->data['entry_contact_name'] = $this->language->get('entry_contact_name');
$this->data['entry_contact_margin_left'] = $this->language->get('entry_contact_margin_left');
$this->data['entry_contact_img_from'] = $this->language->get('entry_contact_img_from');

1.2. находим:
$this->data['button_cancel'] = $this->language->get('button_cancel');

после вставляем:
$this->data['tab_contacts'] = $this->language->get('tab_contacts');

1.3. в этом же файле ищем:
$files = glob(DIR_SYSTEM . 'smsgate/*.php');

после вставляем:
// Покажет ошибку, если путь к папке с иконками задан не правильно.
if (isset($this->error['img_from_error'])) {
$this->data['error_config_contact_img_from'] = $this->error['img_from_error'];
} else {
$this->data['error_config_contact_img_from'] = '';
}

// Покажет ошибку, если отступ указан неверно.
if (isset($this->error['margin_left_error'])) {
$this->data['error_config_contact_margin_left'] = $this->error['margin_left_error'];
} else {
$this->data['error_config_contact_margin_left'] = '';
}

1.4. далее по файлу находим:
if (isset($this->request->post['config_address'])) {
$this->data['config_address'] = $this->request->post['config_address'];
} else {
$this->data['config_address'] = $this->config->get('config_address');
}

после вставляем:
// Добавляет и берет данные формы "Путь к папке с иконкой"
if (isset($this->request->post['config_contact_img_from'])) {
$this->data['config_contact_img_from'] = $this->request->post['config_contact_img_from'];
} else {
$this->data['config_contact_img_from'] = $this->config->get('config_contact_img_from');
}

// Добавляет и берет данные формы "Отступ текста слева"
if (isset($this->request->post['config_contact_margin_left'])) {
$this->data['config_contact_margin_left'] = $this->request->post['config_contact_margin_left'];
} else {
$this->data['config_contact_margin_left'] = $this->config->get('config_contact_margin_left');
}

///contact 1  ------------------------------------------------------------------------
if (isset($this->request->post['config_contact_namber1'])) {
$this->data['config_contact_namber1'] = $this->request->post['config_contact_namber1'];
} else {
$this->data['config_contact_namber1'] = $this->config->get('config_contact_namber1');
}
if (isset($this->request->post['config_contact_icon1'])) {
$this->data['config_contact_icon1'] = $this->request->post['config_contact_icon1'];
} else {
$this->data['config_contact_icon1'] = $this->config->get('config_contact_icon1');
}
if (isset($this->request->post['config_contact_name1'])) {
$this->data['config_contact_name1'] = $this->request->post['config_contact_name1'];
} else {
$this->data['config_contact_name1'] = $this->config->get('config_contact_name1');
}
if (isset($this->request->post['config_contact_phontime1'])) {
$this->data['config_contact_phontime1'] = $this->request->post['config_contact_phontime1'];
} else {
$this->data['config_contact_phontime1'] = $this->config->get('config_contact_phontime1');
}
if (isset($this->request->post['config_contact_department1'])) {
$this->data['config_contact_department1'] = $this->request->post['config_contact_department1'];
} else {
$this->data['config_contact_department1'] = $this->config->get('config_contact_department1');
}

///contact 2 ------------------------------------------------------------------------
if (isset($this->request->post['config_contact_namber2'])) {
$this->data['config_contact_namber2'] = $this->request->post['config_contact_namber2'];
} else {
$this->data['config_contact_namber2'] = $this->config->get('config_contact_namber2');
}
if (isset($this->request->post['config_contact_icon2'])) {
$this->data['config_contact_icon2'] = $this->request->post['config_contact_icon2'];
} else {
$this->data['config_contact_icon2'] = $this->config->get('config_contact_icon2');
}
if (isset($this->request->post['config_contact_name2'])) {
$this->data['config_contact_name2'] = $this->request->post['config_contact_name2'];
} else {
$this->data['config_contact_name2'] = $this->config->get('config_contact_name2');
}
if (isset($this->request->post['config_contact_phontime2'])) {
$this->data['config_contact_phontime2'] = $this->request->post['config_contact_phontime2'];
} else {
$this->data['config_contact_phontime2'] = $this->config->get('config_contact_phontime2');
}
if (isset($this->request->post['config_contact_department2'])) {
$this->data['config_contact_department2'] = $this->request->post['config_contact_department2'];
} else {
$this->data['config_contact_department2'] = $this->config->get('config_contact_department2');
}

///contact 3 ------------------------------------------------------------------------
if (isset($this->request->post['config_contact_namber3'])) {
$this->data['config_contact_namber3'] = $this->request->post['config_contact_namber3'];
} else {
$this->data['config_contact_namber3'] = $this->config->get('config_contact_namber3');
}
if (isset($this->request->post['config_contact_icon3'])) {
$this->data['config_contact_icon3'] = $this->request->post['config_contact_icon3'];
} else {
$this->data['config_contact_icon3'] = $this->config->get('config_contact_icon3');
}
if (isset($this->request->post['config_contact_name3'])) {
$this->data['config_contact_name3'] = $this->request->post['config_contact_name3'];
} else {
$this->data['config_contact_name3'] = $this->config->get('config_contact_name3');
}
if (isset($this->request->post['config_contact_phontime3'])) {
$this->data['config_contact_phontime3'] = $this->request->post['config_contact_phontime3'];
} else {
$this->data['config_contact_phontime3'] = $this->config->get('config_contact_phontime3');
}
if (isset($this->request->post['config_contact_department3'])) {
$this->data['config_contact_department3'] = $this->request->post['config_contact_department3'];
} else {
$this->data['config_contact_department3'] = $this->config->get('config_contact_department3');
}

///contact 4 ------------------------------------------------------------------------
if (isset($this->request->post['config_contact_namber4'])) {
$this->data['config_contact_namber4'] = $this->request->post['config_contact_namber4'];
} else {
$this->data['config_contact_namber4'] = $this->config->get('config_contact_namber4');
}
if (isset($this->request->post['config_contact_icon4'])) {
$this->data['config_contact_icon4'] = $this->request->post['config_contact_icon4'];
} else {
$this->data['config_contact_icon4'] = $this->config->get('config_contact_icon4');
}
if (isset($this->request->post['config_contact_name4'])) {
$this->data['config_contact_name4'] = $this->request->post['config_contact_name4'];
} else {
$this->data['config_contact_name4'] = $this->config->get('config_contact_name4');
}
if (isset($this->request->post['config_contact_phontime4'])) {
$this->data['config_contact_phontime4'] = $this->request->post['config_contact_phontime4'];
} else {
$this->data['config_contact_phontime4'] = $this->config->get('config_contact_phontime4');
}
if (isset($this->request->post['config_contact_department4'])) {
$this->data['config_contact_department4'] = $this->request->post['config_contact_department4'];
} else {
$this->data['config_contact_department4'] = $this->config->get('config_contact_department4');
}

///contact 5 ------------------------------------------------------------------------
if (isset($this->request->post['config_contact_namber5'])) {
$this->data['config_contact_namber5'] = $this->request->post['config_contact_namber5'];
} else {
$this->data['config_contact_namber5'] = $this->config->get('config_contact_namber5');
}
if (isset($this->request->post['config_contact_icon5'])) {
$this->data['config_contact_icon5'] = $this->request->post['config_contact_icon5'];
} else {
$this->data['config_contact_icon5'] = $this->config->get('config_contact_icon5');
}
if (isset($this->request->post['config_contact_name5'])) {
$this->data['config_contact_name5'] = $this->request->post['config_contact_name5'];
} else {
$this->data['config_contact_name5'] = $this->config->get('config_contact_name5');
}
if (isset($this->request->post['config_contact_phontime5'])) {
$this->data['config_contact_phontime5'] = $this->request->post['config_contact_phontime5'];
} else {
$this->data['config_contact_phontime5'] = $this->config->get('config_contact_phontime5');
}
if (isset($this->request->post['config_contact_department5'])) {
$this->data['config_contact_department5'] = $this->request->post['config_contact_department5'];
} else {
$this->data['config_contact_department5'] = $this->config->get('config_contact_department5');
}
///contact end ------------------------------------------------------------------------

1.5. найти:
if ((utf8_strlen($this->request->post['config_email']) > 96) || !preg_match('/^[^\@]+@.*\.[a-z]{2,6}$/i', $this->request->post['config_email'])) {
$this->error['email'] = $this->language->get('error_email');
}

после вставить:
if ((utf8_strlen($this->request->post['config_contact_img_from']) < 3) || !preg_match('/^[\/][a-z]\S+[\/]\S+/i',$this->request->post['config_contact_img_from'])) {
$this->error['img_from_error'] = $this->language->get('error_config_contact_img_from');
}

if ((utf8_strlen($this->request->post['config_contact_margin_left']) < 0) || !preg_match('/^[0-9]/i',$this->request->post['config_contact_margin_left'])) {
$this->error['margin_left_error'] = $this->language->get('error_config_contact_margin_left');
}
С этим файлом мы закончили.

2.0. Открываем
\admin\view\template\setting\setting.tpl

находим:
<a href="#tab-general"><?php echo $tab_general; ?></a>

после вставляем:
<a href="#tab-store"><?php echo $tab_store; ?></a>

2.1. в этом же файле ищем:
<tr>
<td><?php echo $entry_fax; ?></td>
<td><input type="text" name="config_fax" value="<?php echo $config_fax; ?>" /></td>
</tr>
</table>
</div>

после вставляем:
<div id="tab_contacts">
<?php echo $entry_contact_img_from; ?> <input type="text" style="width: 250px;" name="config_contact_img_from" value="<?php echo $config_contact_img_from; ?>" />
<?php if ($error_config_contact_img_from) { ?>
<?php echo $error_config_contact_img_from; ?>
<?php } ?>
<?php echo $entry_contact_margin_left; ?> <input type="text" name="config_contact_margin_left" value="<?php echo $config_contact_margin_left; ?>" />px
<?php if ($error_config_contact_margin_left) { ?>
<?php echo $error_config_contact_margin_left; ?>
<?php } ?>
<table class="contact_list">
<thead>
<tr>
<td class="namber"> № </td>
<td class="center"><?php echo $entry_contact_namber; ?></td>
<td class="center"><?php echo $entry_contact_icon; ?></td>
<td class="center"><?php echo $entry_contact_name; ?></td>
</tr>
</thead>
<tbody>
<tr>
<td class="right">1</a>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_namber1" value="<?php echo $config_contact_namber1; ?>" /></td>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_icon1" value="<?php echo $config_contact_icon1; ?>" /></td>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_name1" value="<?php echo $config_contact_name1; ?>" /></td>
</tr>
<tr>
<td class="right">2</a>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_namber2" value="<?php echo $config_contact_namber2; ?>" /></td>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_icon2" value="<?php echo $config_contact_icon2; ?>" /></td>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_name2" value="<?php echo $config_contact_name2; ?>" /></td>
</td>
</tr>
<tr>
<td class="right">3</a>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_namber3" value="<?php echo $config_contact_namber3; ?>" /></td>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_icon3" value="<?php echo $config_contact_icon3; ?>" /></td>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_name3" value="<?php echo $config_contact_name3; ?>" /></td>
</td>
</tr>
<tr>
<td class="right">4</a>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_namber4" value="<?php echo $config_contact_namber4; ?>" /></td>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_icon4" value="<?php echo $config_contact_icon4; ?>" /></td>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_name4" value="<?php echo $config_contact_name4; ?>" /></td>
</td>
</tr>
<tr>
<td class="right">5</a>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_namber5" value="<?php echo $config_contact_namber5; ?>" /></td>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_icon5" value="<?php echo $config_contact_icon5; ?>" /></td>
<td class="left"><input type="text" style="width: 250px;" name="config_contact_name5" value="<?php echo $config_contact_name5; ?>" /></td>
</td>
</tr>
</tbody>
</table>
</div>

3.0. Работаем с файлом
\catalog\controller\common\header.php

3.1. ищем:
if ($this->config->get('config_logo') && file_exists(DIR_IMAGE . $this->config->get('config_logo'))) {
$this->data['logo'] = $server . $this->config->get('config_logo');
} else {
$this->data['logo'] = '';
}

после вставляем:
// отступ иконки левый (margin_left) и пусть к папку с иконками (img_from)
$this->data['config_contact_margin_left'] = $this->config->get('config_contact_margin_left');
$this->data['config_contact_img_from'] = $this->config->get('config_contact_img_from');
// контакт 1
$this->data['config_contact_namber1'] = $this->config->get('config_contact_namber1');
$this->data['config_contact_icon1'] = $this->config->get('config_contact_icon1');
$this->data['config_contact_name1'] = $this->config->get('config_contact_name1');

// контакт 2
$this->data['config_contact_namber2'] = $this->config->get('config_contact_namber2');
$this->data['config_contact_icon2'] = $this->config->get('config_contact_icon2');
$this->data['config_contact_name2'] = $this->config->get('config_contact_name2');

// контакт 3
$this->data['config_contact_namber3'] = $this->config->get('config_contact_namber3');
$this->data['config_contact_icon3'] = $this->config->get('config_contact_icon3');
$this->data['config_contact_name3'] = $this->config->get('config_contact_name3');

// контакт 4
$this->data['config_contact_namber4'] = $this->config->get('config_contact_namber4');
$this->data['config_contact_icon4'] = $this->config->get('config_contact_icon4');
$this->data['config_contact_name4'] = $this->config->get('config_contact_name4');

// контакт 5
$this->data['config_contact_namber5'] = $this->config->get('config_contact_namber5');
$this->data['config_contact_icon5'] = $this->config->get('config_contact_icon5');
$this->data['config_contact_name5'] = $this->config->get('config_contact_name5');

4.0. Открываем файл
\admin\language\russian\setting\setting.php

ищем:
// Entry

после вставляем:
$_['entry_contact_namber']   = 'Номер';
$_['entry_contact_icon']   = 'Иконка';
$_['entry_contact_name']   = 'Имя';
$_['entry_contact_phontime']  = 'Время работы';
$_['entry_contact_department']  = 'Отдел';
$_['entry_contact_img_from']   = 'Путь к папке с иконкой';
$_['entry_contact_margin_left'] = 'Отступ текста слева';

4.1. в этом же файле находим:
// Error

после вставляем:
$_['error_config_contact_img_from'] = '<span style="color: red">Проверьте правильность пути папки. Должен начинаться на " / " и им заканчиваться " <b>/</b> ". <b>Без пробелов</b>. Например:  <b>/</b>image/contact_icon<b>/</b></span>';
$_['error_config_contact_margin_left'] = '<span style="color: red">Отступ примет значение только числового характера. Впишите <b>целое число</b> отступа!</span>';

5.0. Работаем с файлом:
\admin\language\russian\russian.php

находим
$_['tab_store']               = 'Витрина';

после вставляем:
$_['tab_contacts']     = 'Контакты';

6.0. Вставляем вывод контактов в нужное место. Файл:
\catalog\view\theme\default\template\common\header.tpl

вставьте эти данные в то место, где вы хотите их видить:
<div id="contact_bg">
<div id="contact_info_head1">
<div style="padding-left:<?php echo $config_contact_margin_left; ?>px; height: 16px; line-height: 16px; background: url('<?php echo $config_contact_img_from; ?><?php echo $config_contact_icon1; ?>') no-repeat; background-size: auto; "><?php echo $config_contact_namber1; ?> <?php echo $config_contact_name1; ?>
</div>
<div style="padding-left:<?php echo $config_contact_margin_left; ?>px; height: 16px; line-height: 16px; background: url('<?php echo $config_contact_img_from; ?><?php echo $config_contact_icon2; ?>') no-repeat; background-size: auto; "><?php echo $config_contact_namber2; ?> <?php echo $config_contact_name2; ?>
</div>
<div style="padding-left:<?php echo $config_contact_margin_left; ?>px; height: 16px; line-height: 16px; background: url('<?php echo $config_contact_img_from; ?><?php echo $config_contact_icon3; ?>') no-repeat; background-size: auto; "><?php echo $config_contact_namber3; ?> <?php echo $config_contact_name3; ?>
</div>
<div style="padding-left:<?php echo $config_contact_margin_left; ?>px; height: 16px; line-height: 16px; background: url('<?php echo $config_contact_img_from; ?><?php echo $config_contact_icon4; ?>') no-repeat; background-size: auto; "><?php echo $config_contact_namber4; ?> <?php echo $config_contact_name4; ?>
</div>
<div style="padding-left:<?php echo $config_contact_margin_left; ?>px; height: 16px; line-height: 16px; background: url('<?php echo $config_contact_img_from; ?><?php echo $config_contact_icon5; ?>') no-repeat; background-size: auto; "><?php echo $config_contact_namber5; ?> <?php echo $config_contact_name5; ?>
</div>
</div>
</div>
Примечание!
На этом примере, все данные выводятся в контейнер:
<div id="contact_bg">
<div id="contact_info_head1">
...
</div></div>

стиль которых:
#header #contact_bg {
position: absolute;
background: url("../image/contact_header_bg.gif") center no-repeat;
width: 277px;
height: 100px;
right: 0px;
left: 300px;
top: 5px;
}
#header #contact_info_head1 {
position: absolute;
width:240px;
left: 10px;
top: 10px;
text-align:left;
font-size: 12px;
color: #E8E8E8;
z-index: 8;

}

Будет правильно написать свой стиль контейнеров.


7.0. Результат



37 комментариев:

  1. Анонимный21 апреля, 2013 17:38

    На 1.5.5.1 работает?

    ОтветитьУдалить
  2. Анонимный22 апреля, 2013 17:07

    автор написал: "Делалось на OpenCart 1.5.4.1".

    ОтветитьУдалить
  3. Для меня полезная статья!!!

    ОтветитьУдалить
  4. Анонимный07 июля, 2013 00:10

    Александр вы не поможете мне в чем ошибка в уроке 3 у меня tab_contacts повторяется во всех tabs

    ОтветитьУдалить
    Ответы
    1. Не понял сути вопроса, где оно повторяется? что не работает? какая ошибка и где?

      Удалить
    2. Александр с вами можно поговорить через Hangouts в google

      Удалить
    3. Можно попробовать.

      Удалить
    4. hyrpatсобакаgmail.ком

      Удалить
  5. Анонимный07 июля, 2013 00:35

    Когда я делаю шаг 2.1. у меня во всех tabs выходит то что должно выходить на одной и слово витрина не меняется на Контакты

    ОтветитьУдалить
    Ответы
    1. Пришлите файлы на Email. Только одно НО - файлы должны быть чистыми (без изменений оригинала) и версия OpenCart 1.5.4.1

      Удалить
    2. Do y write in English? & translated into Russian by an interpreter?

      Удалить
    3. Этот комментарий был удален автором.

      Удалить
    4. look at right column: contacts (контакты) on top.

      Удалить
  6. Анонимный25 июля, 2013 02:25

    Блин, а почему бы не создать модуль? для тех кто тяжело понимает в тегах :)

    ОтветитьУдалить
    Ответы
    1. Модуль - это уже продукт. который нужно интегрировать в систему.
      На данный момент могу только автоустановщик придумать, который будет работать ТОЛЬКО на голых версиях OCart.

      Удалить
  7. Что и в какой код добавить для назначения ссылки выводимым данным? Допустим, мне нужно вывести не только номера телефона, но и имэйл, имя сайта и т.п. Да и скайповый ник тоже хотелось бы сделать живым.

    ОтветитьУдалить
  8. Почему форма контактов дублируется на всех вкладках ?

    ОтветитьУдалить
    Ответы
    1. Что означает "дублируется"?

      Удалить
    2. в админке дублируется. Система-Настройки-изменить.
      Вкладки настроек и во всех эта форма присутствует. Ставил на чистый оренкарт 1.5.4.1 аналогично все.

      Удалить
    3. Я немного все сделала по другому и у меня получилось

      Удалить
    4. И что именно по другому, можно поинтересоваться ?

      Удалить
    5. У вас что то не получается

      Удалить
    6. Главное что получилось - а способов есть куча :-)

      Удалить
  9. Здравствуйте Александр.
    в пунте 2.0. у вас опечатка
    находим:

    после вставляем:

    нужно


    и вопрос уже был: как поправить, форма появляется во всех вкладках настройки магазина.
    P.S. Вариант хороший, подумайте над созданием модуля.

    ОтветитьУдалить
  10. Кладу картинку в корень сайта /image/contact_icon/ ничего не происходит.
    Делаю на денвере может в этом проблема или проблемы в коде

    ОтветитьУдалить
  11. Этот комментарий был удален автором.

    ОтветитьУдалить
  12. Ошибка в описании в пункте 2,0

    не tab-store добавляем(именно это дублирует вкладки на все) а tab_contacts

    Спасибо за описание!

    ОтветитьУдалить
  13. Анонимный14 ноября, 2013 10:19

    Ошибка в меню :
    Notice: Undefined variable: error_config_contact_img_from in Z:\home\store11.ru\www\admin\view\template\setting\setting.tpl on line 67Отступ текста слева px Notice: Undefined variable: error_config_contact_margin_left in Z:\home\store11.ru\www\admin\view\template\setting\setting.tpl on line 71

    ОтветитьУдалить
  14. При входи в панель пишет((((
    ]Warning: Cannot modify header information - headers already sent by (output started at /var/www/vhosts/u0087852.plsk.regruhosting.ru/httpdocs/dust-gold.ru/admin/language/russian/russian.php:1) in /var/www/vhosts/u0087852.plsk.regruhosting.ru/httpdocs/dust-gold.ru/system/engine/controller.php on line 28Warning: Cannot modify header information - headers already sent by (output started at /var/www/vhosts/u0087852.plsk.regruhosting.ru/httpdocs/dust-gold.ru/admin/language/russian/russian.php:1) in /var/www/vhosts/u0087852.plsk.regruhosting.ru/httpdocs/dust-gold.ru/system/engine/controller.php on line 29

    ОтветитьУдалить