В какой файл вставить код

Форум для авторов модов для phpBB 3.0.x. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
paa66
phpBB 1.0.0
Сообщения: 7
Стаж: 14 лет 6 месяцев
Благодарил (а): 2 раза

В какой файл вставить код

Сообщение paa66 »

Сделал файл, которые при создании новой темы автоматически рассылал бы уведомления о появлении этой новой темы зарегистрированным пользователям. Сейчас подключаю этот файл из файла posting.php, который находится в корне форума. Вот код, который я добавил в 21 строку этого файла:

Код: Выделить всё

require_once($phpbb_root_path . '/school.' . $phpEx);
В результате отправляется по электронке не менее 20 уведомлений на каждый почтовый ящик. Сейчас я считаю, что это из-за того, что файл posting.php при создании темы сам подключается раз 20, отсюда такое количество отправленных уведомлений. В какой файл добавить строку

Код: Выделить всё

require_once($phpbb_root_path . '/school.' . $phpEx);
, чтобы он отработал только один раз?
Аватара пользователя
HAMMER663
Former team member
Сообщения: 2032
Стаж: 16 лет 5 месяцев
Откуда: Зеленоград
Благодарил (а): 77 раз
Поблагодарили: 249 раз

Re: В какой файл вставить код

Сообщение HAMMER663 »

Попробовать вставить перед

Код: Выделить всё

$change_topic_status = $post_data['topic_status'];
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 17 лет 6 месяцев
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 3 раза
Поблагодарили: 351 раз

Re: В какой файл вставить код

Сообщение MIT »

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

И вызов твоей функции должен производиться из функции includes/function_posting.php::[b]submit_post[/b](), причём не в случайном месте, а где-нибудь в районе кода

Код: Выделить всё

	if (($mode == 'reply' || $mode == 'review' || $mode == 'quote' || $mode == 'post') && $post_approval)
	{
		user_notification($mode, $subject, $data['topic_title'], $data['forum_name'], $data['forum_id'], $data['topic_id'], $data['post_id']);
	}
Причём, что бы твоя функция вызывалась только при создании темы, её вызов надо заключить в соответствующее условие:

Код: Выделить всё

	if ($mode == 'post' && $post_approval)
	{
		you_super_mega_send_function();
	}
paa66
phpBB 1.0.0
Сообщения: 7
Стаж: 14 лет 6 месяцев
Благодарил (а): 2 раза

Re: В какой файл вставить код

Сообщение paa66 »

HAMMER663 писал(а):Попробовать вставить перед

Код: Выделить всё

$change_topic_status = $post_data['topic_status'];
Вставил и меня забросало письмами.
paa66
phpBB 1.0.0
Сообщения: 7
Стаж: 14 лет 6 месяцев
Благодарил (а): 2 раза

Re: В какой файл вставить код

Сообщение paa66 »

В моей версии phpbb код в файле function_posting.php выглядит немного иначе:

Код: Выделить всё

if (($mode == 'reply' || $mode == 'quote' || $mode == 'post') && $post_approval) 
Я в это место воткнул рекомендуемый код и у меня получилось так:

Код: Выделить всё

if (($mode == 'reply' || $mode == 'quote' || $mode == 'post') && $post_approval)
	{
		user_notification($mode, $subject, $data['topic_title'], $data['forum_name'], $data['forum_id'], $data['topic_id'], $data['post_id']);
              if ($mode == 'post' && $post_approval)
    {
        function send() {
        $MailFrom = "почто_админа";
     $mysql_database="моя_БД"; //Имя базы данных
$mysql_username="имя_админа"; //Имя пользователя базы данных
$mysql_password="пароль"; //Пароль пользователя базы данных
$mysql_host="сервер; //Сервер базы данных 
//Соединяемся с базой данных
$mysql_connect = mysql_connect($mysql_host, $mysql_username, $mysql_password);
//Выбираем базу данных для работы
mysql_select_db($mysql_database);
    $sql = "SELECT * FROM таблица_users"; 
     $name = mysql_query($sql); 
     $row = mysql_fetch_array($name);    
while($row) { 
    mail($row[email], $MailFrom, "Создана новая тема на форуме класса, которую необходимо обсудить. Пожалуйста, примите участие в обсуждении.");
}

} 
    }
Создал новую тему и никаких писем. Что-то не так?
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 17 лет 6 месяцев
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 3 раза
Поблагодарили: 351 раз

Re: В какой файл вставить код

Сообщение MIT »

Не так две вещи:
1) То, что ты привёл, больше похоже на результат взрыва на плодоовощной фабрике, чем на код. ЭТО совершенно невозможно читать
2) Было бы здорово на твоём месте подучить синтаксис PHP. Вот зачем ты объявляешь функцию внутри функции? Да ещё и не вызываешь её.
paa66
phpBB 1.0.0
Сообщения: 7
Стаж: 14 лет 6 месяцев
Благодарил (а): 2 раза

Re: В какой файл вставить код

Сообщение paa66 »

Я не программист и увлёкся программированием совсем недавно. Если новичкам здесь не место, то так и скажите.
1) Делать читабельным код я тоже не научился ввиду причины, указанной выше.
Больше всего удручило, что вместо помощи получаю критику. Давайте посмотрим, что получится, если я буду отвечать на ваши вопросы.
2) По поводу синтаксиса. Использовал NuSphere phpEditor, который подсвечивает ошибки. Он ошибки не показал, поэтому так и оставил. Теперь почему я вызываю функцию внутри функции. Я неправильно понял совет из-за ограниченности моих познаний в программировании, потому так и сделал. Я сейчас исправил, вот код:

Код: Выделить всё

if (($mode == 'reply' || $mode == 'quote' || $mode == 'post') && $post_approval)
	{
		user_notification($mode, $subject, $data['topic_title'], $data['forum_name'], $data['forum_id'], $data['topic_id'], $data['post_id']);
              if ($mode == 'post' && $post_approval)
    {  requre_once (school.php);
        send(); 
    }
	}
Вот функция, которая должна сработать:

Код: Выделить всё

function send() {
      
  $MailFrom = "моя_почта";
  
  $mysql_database="моя БД"; //Имя базы данных
  
  $mysql_username="логин_admin"; //Имя пользователя базы данных
  
  $mysql_password="пароль"; //Пароль пользователя базы данных
  
  $mysql_host="сервер"; //Сервер базы данных 
  
            //Соединяемся с базой данных
  $mysql_connect = mysql_connect($mysql_host, $mysql_username, $mysql_password);
  
            //Выбираем базу данных для работы
  mysql_select_db($mysql_database);
  
    $sql = "SELECT * FROMтаблица_users"; 
    
    $name = mysql_query($sql); 
    
    $row = mysql_fetch_array($name);    
    
while($row) { 
    
    mail($row[email], $MailFrom, "Создана новая тема на форуме класса, которую необходимо обсудить. Пожалуйста, примите участие в обсуждении.");
} 
}
Добавлено спустя 8 минут 38 секунд:
Всё равно закидало письмами :(
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 17 лет 6 месяцев
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 3 раза
Поблагодарили: 351 раз

Re: В какой файл вставить код

Сообщение MIT »

paa66 писал(а):Если новичкам здесь не место
Правила данной конференции подразумевают обладание квалификацией, необходимой для понимания вопроса обсуждения:
Правила, пункт 1.7 писал(а):Следует также учитывать неизбежность применения "профессионализмов" и "жаргонизмов" в речи участников конференции, и понимать, что упоминание, например, "кривизны рук" и "включения мозга" не преследует целей оскорбления вас лично, а всего лишь кратко резюмирует, что при выполнении каких-либо действий, вы недостаточно внимательно отнеслись к их выполнению, без должного учёта инструкций, документации и базовых знаний о предмете, в которых вы обязаны быть компетентны.
paa66 писал(а):Я сейчас исправил
Молодец, теперь значительно лучше.
paa66 писал(а):Всё равно закидало письмами
Как ты, наверно, обратил внимание, твой код находится рядом с вызовом стандартной функции user_notification(), которая как раз и рассылает уведомления. Тот факт, что данная функция вызывается в правильном месте и правильное количество раз, говорит нам о том, что и твоя функция будет вызываться в те же правильные моменты.

Могу предположить, что по невнимательности ты забыл убрать вызов своего кода из других мест.

Добавлено спустя 1 минуту 23 секунды:
paa66 писал(а):NuSphere phpEditor
Кстати, не самая удобная среда разработки. Попробуй NetBeans.
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 19 лет 7 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2756 раз

Re: В какой файл вставить код

Сообщение Sheer »

paa66 писал(а):Я не программист
Здесь программистов практически нет.
paa66 писал(а):увлёкся программированием
Похвально. Тогда в помощь http://www.phpbbguru.net/useful/codeboo ... uidelines/

Добавлено спустя 2 минуты 3 секунды:
MIT писал(а):Попробуй NetBeans.
Ну тогда уж и http://netbeans.org/features/php/
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
paa66
phpBB 1.0.0
Сообщения: 7
Стаж: 14 лет 6 месяцев
Благодарил (а): 2 раза

Re: В какой файл вставить код

Сообщение paa66 »

MIT писал(а):Правила данной конференции подразумевают обладание квалификацией, необходимой для понимания вопроса обсуждения:
Кстати, в приведённой цитате из Правил про это не сказано. Там сказано, что не надо обижаться на "кривизну рук" и т.д.
MIT писал(а):Как ты, наверно, обратил внимание, твой код находится рядом с вызовом стандартной функции user_notification(), которая как раз и рассылает уведомления. Тот факт, что данная функция вызывается в правильном месте и правильное количество раз, говорит нам о том, что и твоя функция будет вызываться в те же правильные моменты.
Я не сказал в своём первом посте, что изначально я вставлял код, подсоединяющий другой файл, именно в файл function_posting.php, правда в другое место, но тоже срабатывало и закидывало письмами. Коды убрать я не забыл. Я пробовал создавать темы после уборки моих кодов, рассылка писем не работала. Так что причина в другом. В подтверждение результат моей проверки: я убрал все свои коды, куда я их вставлял, проверил, делается ли рассылка после создания темы. Уведомления не рассылались и я вставил в один из файлов раздела сайта код, подсоединяющий другой файл, а файл с функцией разместил в этом разделе. В результате при вхождении в раздел сайта код подсоединил рассылку и меня опять закидало письмами. Значит я неправильно написал функцию, хотя не имею представления где в ней могла закрасться ошибка. И ещё: хотя в БД 2 адреса е-mail, письмами заваливает первый адрес из таблицы. При вхождении в раздел (или ранее при создании новой темы на форуме) браузер зависает. Чтобы не мучить, я останавливаю его. Такие вот дела. Думаю, что тему можно закрывать, т.к. решение проблемы не относится к phpbb. Всем спасибо!
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 19 лет 7 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2756 раз

Re: В какой файл вставить код

Сообщение Sheer »

paa66
posting.php
Найти

Код: Выделить всё

$redirect_url = submit_post($mode, $post_data['post_subject'], $post_data['username'], $post_data['topic_type'], $poll, $data, $update_message, ($update_message || $update_subject) ? true : false); 
После вставить

Код: Выделить всё

if (!isset($post_data['topic_first_post_id']))
    {
        // здесь вызов вашей функции рассылки
    } 
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
paa66
phpBB 1.0.0
Сообщения: 7
Стаж: 14 лет 6 месяцев
Благодарил (а): 2 раза

Re: В какой файл вставить код

Сообщение paa66 »

Функцию подправил:

Код: Выделить всё

 $name = mysql_query($sql); 
    
while($row = mysql_fetch_assoc($name)) { 
    
    mail($row['email'], $MailFrom   // и т.д.
}
}
Sheer писал(а):if (!isset($post_data['topic_first_post_id']))
    {
        // здесь вызов вашей функции рассылки
    } 
Спасибо, исправил, но всё равно заваливает письмами. Сделал всё на своём компе, работает безукоризненно (в папке дэнвэра tmp\!sendmail\ на каждый адрес отправляется по одному письму). Я обратился к хостэру, скорее всего у него что-то не так. Пока жду от него ответа.
paa66
phpBB 1.0.0
Сообщения: 7
Стаж: 14 лет 6 месяцев
Благодарил (а): 2 раза

Re: В какой файл вставить код

Сообщение paa66 »

Хостэр пожал плечами, пришлось экспериментировать.
В прошлых своих кодах обращался к таблицам Джумлы, в этот раз решил поработать с таблицами phpbb. В результате эксперимент удался и окончательно код выглядит так:

Код: Выделить всё

$MailFrom = "мой_адрес"; 
    
     $title = "Новая тема на форуме класса";

     $sql = 'SELECT * FROM ' . USERS_TABLE; // таким образом можно обратиться к таблицам phpbb
                               
     $name = $db->sql_query($sql);       
      
while ($row = $db->sql_fetchrow($name)){  // пришлось выдёргивать через sql_fetchrow, через mysql_fetch_assoc заваливало письмами

    if (!$row['user_email'] == null){  // здесь отбрасываю всех пользователей с пустыми адресами почты. В эту таблицу phpbb кроме пользователей внесены разные боты, они тоже отбрасываются
    
    mail($row['user_email'], $title, "Создана новая тема на форуме класса, которую необходимо обсудить. Пожалуйста, примите участие в обсуждении.", 'From:'.$MailFrom);
} 
}
Также выяснилось, что данный код можно вставлять с одинаковым успехом в файлы functions_posting.php или posting.php. Всем спасибо за участие!

Вернуться в «Для авторов (phpBB 3.0.x)»