Forumlar / National / Russian / Тех. поддержка / Запросы документации

<<<1...5...10...32333435363738>>>

Принимаем вопросы от населения

webitproff
#511 2023-05-29 22:25
#46726 Dayver:

Совет номер три - опять же как рекомендовали выше код инициализации работы срипта следует внедрять с помощью функций типа Resources::addEmbed тогда установка движка будет автоматической без необходимости правки файлов js.js тем

Для ясности можете посмотреть как устроена работа коробочного плагина autocomplete там есть rc часть плагина отвечающая за подключение ресурсов

 Павел, а с этим не подскажите?

if ($env['ext'] == 'users' && $_GET['m'] == 'register')

чтобы подключить на конкретной странице ?

аккаунт удален - не срослось с разработчиками
ушел на другой движок
Dayver
#512 2023-05-29 22:47
#46727 webitproff:

 Павел, а с этим не подскажите?

if ($env['ext'] == 'users' && $_GET['m'] == 'register')

чтобы подключить на конкретной странице ?

Для проверок в коде подключаемом через хуки в модуле пользователей подошёл бы код

if ($env['ext'] == 'users' && $m == 'register')

Но из-за того что код выполняющися через хук rc вызывается ранеее в common.php то и переменные $env['ext'] и $m еще пусты потому нужно через озвученую выше связку проверок:

if (isset($_GET['e']) && $_GET['e'] == 'users' && isset($_GET['m']) && $_GET['m'] == 'register')

только для того что бы не было предупреждений генерируемых PHP8 нужно добавить проверки isset (как показано выше) или !empty - в зависимости от конкретной ситуации

Pavlo Tkachenko aka Dayver
webitproff
#513 2023-05-29 22:49
#46728 Dayver:
#46727 webitproff:

 Павел, а с этим не подскажите?

Но из-за того что код выполняющися через хук rc вызывается ранеее в common.php то и переменные $env['ext'] и $m еще пусты потому нужно через озвученую выше связку проверок:

if (isset($_GET['e']) && $_GET['e'] == 'users' && isset($_GET['m']) && $_GET['m'] == 'register')

только для того что бы не было предупреждений генерируемых PHP8 нужно добавить проверки isset (как показано выше) или !empty - в зависимости от конкретной ситуации

четко! работает на 8.1 yes laugh

Очень благодарен! давно копался с этим

аккаунт удален - не срослось с разработчиками
ушел на другой движок
Dayver
#514 2023-05-29 23:01
#46724 Kabak:

Было бы неплохо создать отдельную ветку, где высказывались бы по улучшению этого плагина.  Я отправил этот плагин на утверждение на этом сайте и , вероятно, к нему можно будет писать комментарии и улучшения. Постараюсь всё изменить, чтобы было корректно.  Жаль, что Павел и Алексей не высказываются и не помогают адаптировать этот плагин к движку корректно.  По-моему, этот плагин достоин интеграции в базовую поставку движка, при использовании модуля users

 

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

И замечание номер четыре. Ваш плагин даже после проделанных манипуляций не будет работать у других потому что код инициализации 

$("section.div_block_register input[name=rusername]").after(...
$("section.div_block_register input[name=ruseremail]").after(...
$("section.div_block_register input[name=rusername]").blur(....
$("section.div_block_register input[name=ruseremail]").blur(...

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

Добавлено 8 минут спустя:

Это основные замечания которые влияют на работу плагина и стоило бы исправить\учесть ... остальные замечания (по типу стиля написания кода) являются не влияющими на работу и потому пока можно не упоминать в разрезе начала обучения написания плагинов .... но если желание продолжать творить не пропадёт все же рекомендовал бы ознакомится с соотв. документацией

 

Если резюмировать то пункты замечаний 1-3 могут не влиять на работоспособность плагина и кое-как работать он может но вот пункт 4 критически важен и из-за этого он скорее всего не будет работать у всех остальных которые захотят им воспользоватся но в силу недостатка знаний не поймут почему он не работает

Pavlo Tkachenko aka Dayver

Bu konu Dayver tarafından düzenlendi(2023-05-30 00:53, 11 aylar önce)
Kabak
#515 2023-05-30 06:55

Ошибка номер один - хук для основной части вашего плагина судя по логике его работы должен быть не standalone а ajax . Только не забудьте потом в своём файле GetUserInfo.js вместо index.php?e=nevalidate&name= написать index.php?r=nevalidate&name=

Где посмотреть как именно + качественно нужно оформить работу плагина через Ajax?  Я пока не понимаю как это сделать через Ajax

 

Безусловно, я хочу сделать плагин качественным.

 

Помогите, пожалуйста, правильно оформить и загружать части плагина.

   

Для меня 

Resources::linkFileFooter

Resources::embedFooter   

 - тёмный , незнакомый лес.


Bu konu Kabak tarafından düzenlendi(2023-05-30 07:08, 11 aylar önce)
webitproff
#516 2023-05-30 07:27
#46731 Kabak:

Где посмотреть как именно + качественно нужно оформить работу плагина через Ajax?  Я пока не понимаю как это сделать через Ajax

 - тёмный , незнакомый лес.

лично я далеко не php-программист, - так читать код, что-то по конкретным примерам, используя конструкции, что-то пересобрать на свой лад, гд потом куча запчастей лишних ))

поэтому и не умствую по php, потому что компетентности только на чтение кода и то далеко не всегда.

Но вам бы порекомендовал, по вашему вопросу, начать с перелопачивания темы, в которой максимально собрано для написания расширения с нуля

Добавлено 13 минут спустя:

по Ajax - статейка старенькая, но наверное всё что есть

аккаунт удален - не срослось с разработчиками
ушел на другой движок

Bu konu webitproff tarafından düzenlendi(2023-05-30 07:41, 11 aylar önce)
Kabak
#517 2023-05-30 08:03

Дело в том, что все мои плагины c 2014 года я так и писал, - подсматривая в чужие плагины и анализируя код, а по выходу у меня в голове фрагменты знаний и нет системы особой.  Как видите, мои подсмотренные решения - не соответствуют качеству и требованиям Cotonti.  А получить исчерпывающие знания изучая чужой код возможно с огромными временными затратами. У меня уже нет столько временного ресурса sad

Попробую по мере возможностей довести всё до хорошего качества.   ( плагины не разработчиков движка поэтому и не совершенны, потому что нет подробной документации на движок ) Это не обвинение к разработчикам.  Я всё понимаю...

Добавлено 3 минуты спустя:

Я попытался указать плагину hook=ajax и переделал вызов php скрипта, но Ajax пишет ошибку вызова.  Разбираться с этим вслепую - чувствую слишком затратно по времени.  Это как brute force пароля к чему-нибудь.

Kopusha
#518 2023-05-30 09:32

1. в users/inc/ создаем users.ajax.php
 

<?php
defined('COT_CODE') or die('Wrong URL');
global $db_users, $db;
include_once cot_incfile("users", "module");
$a = cot_import('a', 'G', 'TXT');
$m = cot_import("m", "G", "TXT");
$login = cot_import("login", "G", "TXT");
$email = cot_import("email", "G", "TXT");
$data["success"] = false;

if ($a == "checklogin") {
	$user_exists = (bool)cot::$db->query("SELECT user_id FROM ".cot::$db->users." WHERE user_name = ? LIMIT 1",
        array($login))->fetch();
	$data["text"] = //как отработать оповещение, у каждого свое
	$data["user_exists"] = $user_exists;
    print json_encode($data);
}

if ($a == "checkemail") {
	$email_exists = (bool)cot::$db->query("SELECT user_id FROM ".cot::$db->users." WHERE user_email = ? LIMIT 1",
        array($email))->fetch();
	$data["text"] = //как отработать оповещение, у каждого свое
	$data["email_exists"] = $email_exists;
    print json_encode($data);
}

в корне users - users.rc.php

<?php

/* ====================
  [BEGIN_COT_EXT]
  Hooks=rc
  Order=9999
  [END_COT_EXT]
  ==================== */

defined('COT_CODE') or die('Wrong URL');

if ($usr['id'] > 0) {
}
else
{
	if ($_GET['e'] == 'users' && $_GET['m'] == 'register') {
		cot_rc_link_footer("modules/users/js/users.js");
	}
}

Далее users/js/users.js

$(function () {
		$('#form input:text[name="rusername"]').blur(function() {
			    if($(this).val().length>=2)
				{
			        $login = $(this).val();
			        $.ajax({
			            url: 'index.php?e=users&m=ajax&a=checklogin&login=' + $login,
			            method: "GET",
			        }).done(function (h) {
						d = $.parseJSON(h);
						
			            if (d.user_exists) {
							//тут как фронэнд отработает код ошибки
}
			        });
			        return false;
			    }
		});	
		$('#useremail').blur(function() {
			    if($(this).val().length>=2)
				{
			        $email = $(this).val();
			        $.ajax({
			            url: 'index.php?e=users&m=ajax&a=checkemail&email=' + $email,
			            method: "GET",
			        }).done(function (h) {
						d = $.parseJSON(h);
						
			            if (d.email_exists) {
							//тут как фронэнд отработает код ошибки
							$('.email input').parent().removeClass('success');
			            }
			            else
			            {
							//email validation
							var regex = new RegExp(
						        '^(([^<>()[\\]\\\\.,;:\\s@\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\"]+)*)|' +
						        '(\\".+\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])' +
						        '|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$'
						    );
						    $('.email input').on('keyup', function(e) {
						        $(this).parent().toggleClass('success', regex.test($(this).val()));
						    }); 
}
});
			        return false;
			    }
		});	
});    

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

модуль есесно обновить

Dayver
#519 2023-05-30 11:27
#46734 Kopusha:

1. в users/inc/ создаем users.ajax.php

Оговорка номер один - советовать хакать дефолный модуль - не очень потому что при очередном обновлении все хаки уплывут в мир забвения. И первоначальный подход к решению задачи в виде плагина самый правильный а фаршировать хаками свой или сайт клиента это путь в невозможность обновлять движок на этом сайте. Почему народ это делает?! Возможно проект такой - на этапе создания понятно что быстреее и проще сделать как есть быстро хакнув нужные файлы понимая что на этом сайте обновления движка никогда не будут производится. А возможно народ подумал что проект мёртв и обновлений ожидать не стоит - но чудеса случаются)

Возможно кто-то посмотрев на вышеупомянутый код и файлы скажет что хака как такового нет поскольку рекомендуемые действия не затрагивают существующие в дефолтном модуле файлы, но тут всплывает оговорка номер два - урл из приведённого примера index.php?e=users&m=ajax.... работать не будет потому что в модуле есть проверка, а потому что б приведённое решение заработало нужно в указанную проверку добавить элемент 'ajax' а это уже будет именно хаком который отвалится при очередном обновлении.

Добавлено 3 минуты спустя:

#46731 Kabak:

Помогите, пожалуйста, правильно оформить и загружать части плагина.

1) в файле nevalidate.php поменяли хук с standalone на ajax ?

2) в админке после этого нажали кнопку обновить?

3) после этих действий при посещении адреса http://ваш.сайт/index.php?r=nevalidate&name=admin что в ответ видите?

Добавлено 3 минуты спустя:

#46730 Dayver:

И замечание номер четыре. Ваш плагин даже после проделанных манипуляций не будет работать у других потому что код инициализации 

$("section.div_block_register input[name=rusername]").after(...
$("section.div_block_register input[name=ruseremail]").after(...
$("section.div_block_register input[name=rusername]").blur(....
$("section.div_block_register input[name=ruseremail]").blur(...

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

Для универсализации кода (что б он работал на любой разметке любой темы) почему бы не сократить условия селектора до вида:

$("input[name=rusername]").after(...
$("input[name=ruseremail]").after(...
$("input[name=rusername]").blur(....
$("input[name=ruseremail]").blur(...

Скорее всего такой вариант тоже продолжит работать у вас но и как бонус будет работать и у остальных

Pavlo Tkachenko aka Dayver
webitproff
#520 2023-05-30 11:37

по больше бы таких замечаний и внимания к деталям.

чувствуется профессионализм

аккаунт удален - не срослось с разработчиками
ушел на другой движок
Kabak
#521 2023-05-30 11:39

1) в файле nevalidate.php поменяли хук с standalone на ajax ?

Заменил

3) после этих действий при посещении адреса http://ваш.сайт/index.php?r=nevalidate&name=admin что в ответ видите?

получаю ответ

Добавлено 3 минуты спустя:

Но при попытке плагина проверить имя из формы регистрации получаю

 


Bu konu Kabak tarafından düzenlendi(2023-05-30 11:57, 11 aylar önce)
Dayver
#522 2023-05-30 11:44
#46731 Kabak:

Для меня 

Resources::linkFileFooter

Resources::embedFooter   

 - тёмный , незнакомый лес.

К сожалению исчерпывающей документации по класу /system/Resources.php нет и кроме не полных упоминаний на которые уже здесь давали ссылки ничего кроме как ориентироватся на комментарии формата phpDoc в указанном файле пока не могу посоветовать. Но стоит отметить что в указанном классе phpDoc'и весьма исчерпывающие ... возможно вечером постараюсь написать совсем краткий гайд по этому направлению.

 

З.Ы. Что касается поиска на этом сайте - понимаю, страдаете и взываете о исправлении .... но не думайте что эти призывы остаются не замеченные - работы по ремонту поиска ведутся, просто как и все остальное не теми темпами которыми хотлось бы

Pavlo Tkachenko aka Dayver
Kabak
#523 2023-05-30 11:44

1) Как правильно подключить GetUserInfo.js и строки для js.js  при установке плагина ?

2) и чтобы плагин заработал через Ajax у меня , а не как standalone

 

Добавлено 5 минут спустя:

js.js  исправил.

$("input[name=rusername]").after("<div id=\"divMy_Name\"></div>");
$("input[name=ruseremail]").after("<div id=\"divEmail\"></div>");
$("input[name=rusername]").blur(function() { process_name(); })
$("input[name=ruseremail]").blur(function() { process_email(); })

Тогда нужно чтобы скрипт выполнался только на одной странице сайта - регистрационной. Соотвественно js скрипт нужно грузить только на users.register.tpl

Добавлено 3 минуты спустя:

у меня получается оба скрипта GetUserInfo.js и js.js  находятся не в папке с плагином, а в папке themes\имя_темы\js\


Bu konu Kabak tarafından düzenlendi(2023-05-30 11:56, 11 aylar önce)
Dayver
#524 2023-05-30 12:01
#46737 Kabak:

получаю ответ

Добавлено 3 минуты спустя:

Но при попытке плагина проверить имя из формы регистрации получаю

 

Тут видно две проблемы:

1) из-за того что сайт на стадии разработки включен дебаг и отображение ошибок\предупреждений то предупреждение которое идёт в вывод ломатет структуру хмl возможно поэтому ваш код GetUserInfo.js ругается 

2) Исправить что б PHP не ругался

вместо

$name['user_name'] = cot_import('name','G','TXT');
$email['user_email'] = cot_import('email','G','TXT');

if (trim($name['user_name']) == ''){
....

написать такое:

кстати почему такой странный выбор имён для переменных в виде массива - можно ж проще

$verif_name = cot_import('name','G','TXT');
$verif_email = cot_import('email','G','TXT');

if (empty($verif_name)){
...

 

Pavlo Tkachenko aka Dayver
Kabak
#525 2023-05-30 12:03

Идеально, когда оба скрипта js прописываются и подключаются при установке плагина, но я не знаю как это сделать.

<<<1...5...10...32333435363738>>>