Меня заинтересовало это предложение и немного поразмыслив, я приступил к работе. На самом деле, расширить таким образом компонент Joomla com_contact несложно. Правда есть один «нехороший» момент: если внести изменения в файлы компонента, то обновлять его больше будет невозможно, потому что при обновлении все ваши изменения будут потеряны.
Можно попытаться клонировать компонент. Но так как он встроен в систему, сделать это тоже не так просто — в нем много различных зависимостей, поэтому работающая копия компонента com_contact у меня не получилась. В итоге решение получилось совсем не идеальным, но работающим :).
Уже по завершении работы я «наткнулся» на одну статью на сайте с документацией для Joomla. В ней говориться о том, что для расширения формы обратной связи (и других системных компонентов) нужно создавать плагин. Таким образом вы не изменяете файлы в системном компоненте и не теряете возможность обновлять CMS.
Правда, в статье не указано, как добавить логику (в данном случае проверку и отправку файла вместе с остальными данными) не изменяя файлы компонента.
Сейчас я опишу весь процесс изменения компонента обратной связи, который я проводил для добавления в форму поля типа “file”.
Итак, сначала вносим небольшие изменения в административной части сайта:
► Изменяем языковые файлы.
/administrator/language/ru-RU/ru-RU.com_contact.ini
Добавляем следующие строки:
В файл /administrator/language/en-EN/en-EN.com_contact.ini добавляем те же строки, только с их значением будут фразы на английском языке. Таким образом обеспечиваем многоязычность.
► Редактируем файлы: /administrator/components/com_contact/config.xml (секция fieldset name="Contact_Form") и /administrator/components/com_contact/models/form/contact.xml (секция fieldset name="email") добавляем в оба файла следующий код:
XML
В результате этих двух действий в административной части сайта на странице компонента Joomla com_contact, появится возможность включать и выключать показ поля для добавления файлов в форме обратной связи.
Напомню читателю, что при изменении параметров контакта в админке, они сохраняются в БД: таблица __contact_details, поле params.
Теперь переходим к изменению файлов компонента в публичной части сайта.
► Теперь в шаблоне компонента com_contact станет доступно значение добавленного параметра allow_images_attach. Перед внесением изменений в код шаблона, его следует скопировать в папку шаблона сайта: /templates/имя_шаблона/html/com_contact/contact/default_form.php
Для проверки можно разместить в указанном файле следующий код.
PHP
Если ошибок нет, то странице компонента в публичной части сайта выведется цифра «1».
► Далее добавляем описание поля для прикрепления файла (изображения) в xml-файл с описанием полей формы в модели (/components/com_contact/models/forms/contact.xml).
XML
► В языковые файлы нужно добавить подпись (label) и описание (description) для нового поля (/language/ru-RU/ru-RU.com_contact.ini):
В файл /language/en-EN/en-EN.com_contact.ini добавляем те же строки, только с английским текстом в качестве значения.
► Добавляем в шаблон формы (/templates/имя_шаблона/html/com_contact/contact/default_form.php) следующий код:
PHP
После добавления этого кода на странице с компонентом обратной связи появляется поле для добавления файла.
Чтобы форма отрабатывала правильно, необходимо добавить в тег <form> следующее выражение:
PHP
Кроме того, добавим скрытое поле, в котором будет хранится максимальный размер прикрепляемого файла:
PHP
► Теперь можно подумать о валидации добавленного поля. Для начала в блок с описанием поля в файле /components/com_contact/models/forms/contact.xml добавим элемент validate.
XML
Затем нужно создать файлы с кодом (правилами) для проведения валидации. Файл будет называться contactemailattachment.php и располагаться в папке /components/com_contact/models/rules/.
Изначально в системе нет валидации поля формы для прикрепления файлов, поэтому необходимо добавить еще один файл в /libraries/joomla/form/rule/. Назовем его attachment.php
В этом файле создадим класс JFormRuleAttachment, от которого будет наследоваться класс JFormRuleContactEmailAttachment, расположенный в файле /components/com_contact/models/rules/contactemailattachment.php
PHP
В нем, как мы видим размещен код для проверки полей на пустоту. Кроме того проверяется обязательно ли поле для заполнения или нет.
PHP
В этом, созданном нами классе, мы проверяем значение «нашего» нового добавленного поля. Файл, который пользователь прикладывает к сообщению, должен быть исключительно изображением, плюс проводится проверка на пустоту, в случае, если поле обязательное для заполнения (код из родительского класса).
► После валидации можно переходить непосредственно к отправке сообщения. Для этого добавим необходимый код в метод ContactControllerContact::_sendEmail в контроллере компонента (файл - /components/com_contact/controllers/contact.php).
PHP
Код, который был добавлен мной, я разместил между комментариев (/*attach files*/).
Ну вот, собственно, и все изменения.
Теперь, если все сделано правильно, у посетителей вашего сайта, желающих отправить вам сообщение появилась возможность приложить к нему графический файл, а вы можете управлять этой возможностью через админку сайта: в любой момент отключить поле для добавления файла из формы обратной связи Joomla3 или включить его снова.