UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: DZHETIGAPA от 11 Октября 2011, 19:59:37

Название: Поделиться ссылкой
Отправлено: DZHETIGAPA от 11 Октября 2011, 19:59:37
Как можно на юми реализовать следующее: Поделиться ссылкой

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

Как такое можно реализовать? Хотя бы принцип, дальеш я сам пойму.

Заранее благодарен за ответ.
Название: Re:Поделиться ссылкой
Отправлено: admin от 11 Октября 2011, 21:15:32
пишешь кастом который отправляет письмо , кастому передаешь значения формы (email друга, имя, содержимое письма если нужна только ссылка на данную страницу, то сформируй её в кастоме)

пример отправления письма посмотри в документации, на wiki.umisoft есть примеры, ну и добавь ссылку которая раскрывает скрытую форму в actions которой будет твой кастомный макрос
Название: Re:Поделиться ссылкой
Отправлено: DZHETIGAPA от 11 Октября 2011, 22:13:32
Я как понял это можно реализовать без макросов, а с помощью форм? Верно я предположил?
Название: Re:Поделиться ссылкой
Отправлено: admin от 12 Октября 2011, 03:20:56
если у тебя в распоряжении есть форма обратной связи то да, по сути она вполне подойдет (но опять же, не для всех случаев или подойдет но надо будет кастомизировать)
Название: Re:Поделиться ссылкой
Отправлено: DZHETIGAPA от 12 Октября 2011, 15:17:55
Ну вот если подумать.  Можно полностью на форме обратной связи сделать. Кому слать пишем через%email%, где email - это идентификатор поля имейла, которое заполняет пользователь. Тело письма аналогично сделать,

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

Только щас обратил внимание, что в шаблоне формы нет поля Кому отправить.. Выходит точно надо как-то кастомизировать модуль. Будем разбираться.
Название: Re:Поделиться ссылкой
Отправлено: admin от 12 Октября 2011, 15:51:14
есть поле кому, оно генерится автоматом, но можно и руками задать  <input type="hidden" name="system_email_to" value="info@umihelp.ru" />

а в остальном все верно, вопрос только в том, что все что ты отправляешь через формы обратной связи сохраняется в системе (а если у тебя большой проект, то ты можешь значительно увеличить размер базы данных сохраняя каждое "поделиться ссылкой")
 
Название: Re:Поделиться ссылкой
Отправлено: DZHETIGAPA от 12 Октября 2011, 16:08:37
Щас попробую написать свой макрос. Хочу сделать так:. Форму сделаю вручную и после отправки формы будет вызываться макрос. Как я понимаю, макрос я должен написать в файле custom.php и например функция send_mail и запрос к нему будет следующий

document('udata://custom/send_mail/param1/param2/paramn')

Верно я мыслю? А то я свои макросы еще не писал. Только несколько дней юми изучаю.
Название: Re:Поделиться ссылкой
Отправлено: admin от 12 Октября 2011, 16:15:30
мыслишь верно
Название: Re:Поделиться ссылкой
Отправлено: DZHETIGAPA от 13 Октября 2011, 00:11:01
Вопрос: Написал макрос, но почему-то не пашет и половину страницы не отображает. Попробовал в адресной строке сделать запрос на это макрос. В результате появилось следующее сообщение:

<error code="require-more-permissions">
    Ваших прав недостаточно, чтобы совершить это действие
</error>

В чем дело? Где права надо изменить?
Название: Re:Поделиться ссылкой
Отправлено: admin от 13 Октября 2011, 00:24:43
если ты пишешь макрос в
/classes/modules/custom.php
то права назначать не надо, а если пишешь макрос в
/classes/modules/какой-нибудь_модуль_например_content/__custom.php,
то необходимо назначить права. Для этого создаешь файл
/classes/modules/какой-нибудь_модуль_например_content/permissions.custom.php
в него копируешь содержимое
/classes/modules/какой-нибудь_модуль_например_content/permissions.php
и в нужную группу прав (в которой содержаться методы доступные для просмотра гостю) добавляешь свой метод.

Например, ты написал кастомный макрос
public function custom_m(){...}
поместил его в
/classes/modules/content/__custom.php
, тогда в файле
/classes/modules/какой-нибудь_модуль_например_content/permissions.custom.php
у тебя будет следущее содержимое

<?php
$permissions = Array(
'content' =>
Array('custom_m')
);
?>

а вообще, лучше приведи сюда код своей функции, может она обращается к чему-то что требует доп. прав
Название: Re:Поделиться ссылкой
Отправлено: DZHETIGAPA от 13 Октября 2011, 01:41:30
Спасибо вам огромной за помощь. В этом разобрался. Но все равно появляется следующая ошибка:

Ошибка синтаксического анализа XML: элемент не найден

Для простоты действий имейл отправителя и получателя одинаков.
public function sendmail($from1="admin@mail.ru"){

            if(!empty($from1)){
                custom::send_mime_mail("ТNAME",$from1,"NAME",$from1, 'CP1251','CP1251',"Письмо уведомление", "Привет, МИР!!!");
            }
 }
private function send_mime_mail($name_from, // имя отправителя
                        $email_from, // email отправителя
                        $name_to, // имя получателя
                        $email_to, // email получателя
                        $data_charset, // кодировка переданных данных
                        $send_charset, // кодировка письма
                        $subject, // тема письма
                        $body // текст письма
                        ) {
            $to = custom::mime_header_encode($name_to, $data_charset, $send_charset)
                 . ' <' . $email_to . '>';
            $subject = custom::mime_header_encode($subject, $data_charset, $send_charset);
            $from =  custom::mime_header_encode($name_from, $data_charset, $send_charset)
                     .' <' . $email_from . '>';
            if($data_charset != $send_charset) {
                $body = iconv($data_charset, $send_charset, $body);
            }
            $headers = "From: $from\r\n";
            $headers .= "Content-type: text/plain; charset=$send_charset\r\n";
            $headers .= "Mime-Version: 1.0\r\n";

            return mail($to, $subject, $body, $headers);
        }

        private function mime_header_encode($str, $data_charset, $send_charset) {
            if($data_charset != $send_charset) {
                $str = iconv($data_charset, $send_charset, $str);
            }
            return '=?' . $send_charset . '?B?' . base64_encode($str) . '?=';
        }
Ввожу в адресной строке следующее:

mysite/udata/custom/sendmail/admin@mail.ru  

И не работает, а пишет ошибку, которую я описал выше.

Если же я в самом макросе удалю все условия и оставлю только это:
public function sendmail($from1="admin@mail.ru"){
        
                custom::send_mime_mail("ТNAME",$from1,"NAME",$from1, 'CP1251','CP1251',"Письмо уведомление", "Привет, МИР!!!");
    
 }
То с аналогичным запросом все работает, письма приходят. Объясните пожалуйста, в чем проблема?

Вроде заработало. Даже не знаю почему не работало. Как-то странно.
Название: Re:Поделиться ссылкой
Отправлено: admin от 13 Октября 2011, 02:24:46
попробуй вызвать функцию так
mysite/udata/custom/sendmail/(admin@mail.ru)   
Название: Re:Поделиться ссылкой
Отправлено: DZHETIGAPA от 13 Октября 2011, 02:53:58
Вроде заработало. Даже не знаю почему не работало. Как-то странно.
Название: Re:Поделиться ссылкой
Отправлено: admin от 13 Октября 2011, 04:19:53
заработало при таком запросе
mysite/udata/custom/sendmail/(admin@mail.ru)
?
Название: Re:Поделиться ссылкой
Отправлено: DZHETIGAPA от 13 Октября 2011, 10:33:20
Даже при моем запросе щас все работает, хотя ничего не менял.. как-то странно...

Возник вопрос. Если отправляем ссылку другу и перегружаем страницу, то запрос отправляется заново, еще раз перегружаем - опять отправляется. Обычно я решаю эту проблему так:

header("Location: ".$_SERVER['REQUEST_URI']);

Также вставляю эту строчку в макрос, но все равно отправляются повторные запросы.
Название: Re:Поделиться ссылкой
Отправлено: admin от 13 Октября 2011, 10:51:31
каким образом он еще раз отправляется, я так понимаю само событие отправлении ссылки другу начиная в тот момент когда мы жмем кнопку отправить под формой, нас перекидывает на страницу выполнения скрипта, а выполнивший скрипт возвращает нас обратно на страницу откуда мы делились ссылкой или у тебя все без перезагрузки страницы?
Название: Re:Поделиться ссылкой
Отправлено: DZHETIGAPA от 13 Октября 2011, 11:02:25
у меня все выполнение идет на одной странице. Так как поделиться другу - это будет всплывающее окошко, которое будет скрыто. То есть когда пользователь заполняет форму, жмет сабмит, то скрипт выполняется на этой же странице - поэтому, если я снова перезагружаю страницу, то запрос идет по новой и письмо опять отправляется.

Кстати, о чем я подумал, ведь можно все сделать на аджаксе. Просто передавать данные с формы на скрипт, к которому делать аджакс запрос. Тогда, в принципе, и макрос не нужен, а просто отдельный файл пхп.
Название: Re:Поделиться ссылкой
Отправлено: admin от 13 Октября 2011, 11:09:12
лучше сделай так, страница при формировании, формирует форму для отправки ссылки другу. Форма скрыта и показывается только по щелчку на определенную ссылку. при submit формы её перехватывает jquery и посылает  ajax запрос на url вида mysite/udata/custom/sendmail/(admin@mail.ru) и скрывает форму добавления ссылки очистив её при  этом.

можешь еще поиграть с обработкой результатов твоего скрипта (ну типа удачно\не удачно было выполнено отправление)
Название: Re:Поделиться ссылкой
Отправлено: DZHETIGAPA от 13 Октября 2011, 11:31:47
Спасибо. Я так и сделал.
Название: Re:Поделиться ссылкой
Отправлено: admin от 19 Ноября 2011, 17:43:21
погоди... ты на странице http://site.ru/1/ там нажимаешь на ссылку или на кнопку отправления формы, на адрес своего скрипта, скрипт отрабатывает отправления и возвращает тебя обратно, где у тебя перегрузка повторная и повторное отправление письма?