• Как сделать индикатор загрузки?

    BRAGA96
    @BRAGA96
    Так? Codepen

    $('body').text('Loading...');
    makeAjax(function(data) {
    	$('body').html(function() {
    		var result = '';
    		for (var user in data) {
    			result += '<div>'+ data[user].name + ' (' + data[user].email +')</div>';
    		}
    		return result;
    	}());
    });
    
    function makeAjax(done) {
    	return $.ajax({
    		url: 'https://jsonplaceholder.typicode.com/users',
    		method: 'GET',
    		dataType: 'json',
    		success: function(data) {
    			setTimeout(function() {
    				if (done) done(data);
    			}, function(min, max) {
    				return Math.random() * (max - min) + min
    			}(2e3, 3e3));
    		}
    	});
    }
    Ответ написан
    Комментировать
  • Как сделать индикатор загрузки?

    @Flying
    Используйте Promise.all для двух промисов:
    • В первом будет загрузка (jQuery.ajax() возвращает jqXHR в котором есть метод always, в нём и будете вызывать resolve())
    • Во втором будет setTimeout() с убиранием надписи и вызовом resolve() с нужной вам задержкой
    Ответ написан
    Комментировать
  • Как растянуть таблицу по ширине?

    @mr_molodoy
    Не совсем понял суть вопроса.
    Возможно Вам это нужно?

    <table style = "width: 100%;">
        <tr>
            <td style = "width: 100px;">100px</td>
            <td>Адаптивная ширина (оставшееся место)</td>
            <td style = "width: 100px;">100px</td>
        </tr>
    </table>
    Ответ написан
    Комментировать
  • Как растянуть таблицу по ширине?

    Vlad_IT
    @Vlad_IT Куратор тега CSS
    Front-end разработчик
    table-layout установите на fixed.
    Ответ написан
    2 комментария
  • Как получить данные из БД по двум значениям?

    longclaps
    @longclaps
    SELECT DISTINCT A.PARENT_ID
    FROM T AS A
      JOIN T AS B USING (PARENT_ID)
    WHERE A.PARAM = 200 AND B.PARAM = 300;

    Наверное DISTINCT лишнее - но из условий это неочевидно.
    Ответ написан
    1 комментарий
  • Как правильно соединять данные Классов?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    3 таблицы объединяются через join по соответствующим ключам, полученный набор уже распихать по объектам. Иначе получится слишком большой объем выборки и непонятный ордер, все же бд для этого больше подходит чем сортировка на пхп.
    Ответ написан
    5 комментариев
  • Как правильно вывести часть данных?

    @red-barbarian
    Танцуй от DI
    Т.е. нужно решить какие методы нужны от класса.
    Если выборка всех фирм, то что-нибудь типа getAll
    Если выборка по ид, то getById(id)
    и т.д.
    Исходить надо из интерфейса который требует клиент класса. А сам класс реализует его.
    Так ты сделаешь скрытым то, что не требуется клиенту и дашь себе возможность менять реализацию класса, без изменения его клиента.
    Реализацию класса старайся делать без повторений используя скрытые методы.
    Если в классе есть места которые будут часто изменяться, то выноси их в другие классы и делегируй им выполнение. SRP
    Ну и прочитай про остальные принципы SOLID. Что бы использовать их. Без фанатизма. Это очень поможет тебе делать понятный для себя и других код. Ну и тестируемый.
    Ответ написан
    Комментировать
  • Как правильно вывести часть данных?

    @maltsever
    Если правильно понял, то лучше сделать два метода. Один на весь список, второй на пагинацию. Но внутри них часть кода будет одинаковая, её можно вынести в отдельный метод (если она большая).
    Ответ написан
    1 комментарий
  • Как делать интеграцию?

    @Yan-s
    Перед изучением PHP стоит потратить час времени на базовое изучение протокола HTTP, с которым вам неизбежно придется работать в вебе, на всё там же PHP.

    HTTP Basic Auth.
    REST
    /GET/.....
    /POST/

    По 5-10 минут гугления на каждый запрос и уже нет вопросов. Это всё базовые вещи.

    Короче всё делаю через CURL

    Есть ощущение что вы не знаете и что такое CURL (хотя, не знаете 100%, если не знаете что такое HTTP).

    В любом случае. Вместо прямого использоваения CURL значительно удобнее будет использовать guzzle docs.guzzlephp.org/en/stable
    Ответ написан
    2 комментария
  • Как делать интеграцию?

    @alekssamos
    Программист любитель
    Интеграция - это по сути присоединить к вашему проекту другой (сторонний) сервис.
    Это происходит через специальный API интерфейс, через него ваша программа может легко взаимодействовать с сервисом. REST - один из видов.
    Про авторизацию: samag.ru/archive/article/1631
    GET POST - это методы: https://ru.wikipedia.org/wiki/HTTP

    PHP - один из множества языков программирования, на котором и будет делаться программа для взаимодействия.

    Всё, что вы перечислили - легко находится в гугле.
    Ответ написан
    Комментировать
  • Как правильно обрабатывать ошибки и исключения?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если я правильно понял функционал

    class AppException extends Exception {}
    
    class Test{
      public function create(array $data){
        if(empty($data['message'])){
          throw new AppException('Сообщение не может быть пустым');
        }
      }
    }
    
    $test = new Test();
    
    try{
      $test->create(array('message' => 'v'));
      // redirect
    }catch(AppException $e){
      echo $e->getMessage();
    }


    Идея в том, что при использовании исключений, никаких ручных проверок делать не надо. Если исключения не было - значит всё нормально. А если было, то код попросту не будет исполнен.
    Ответ написан
    1 комментарий
  • Как правильно обрабатывать ошибки и исключения?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Стоит разделять публичные и приватные исключения. Пользователям не стоит видеть внутреннюю кухню. Так что:
    class HttpExcepton extends RuntimeException {}
    class ExampleHttpException extends HttpExcepton {}
    
    //
    
    throw new ExampleHttpException('Сообщение не может быть пустым', 422);


    Так что всё это дело можно свести к одному единственному try/catch, который будет выводить текст из всех HttpExcepton (и статус код, например, в данном примере 422), и выводить сообщения "Internal Server Error" от любых других.
    Ответ написан
    4 комментария
  • Как программировать сайты на android?

    @MADSMILEXD
    и редактор кода, и файл менеджер и даже ssh консоль
    Codeanywhere - IDE, редактор кода, SSH, FTP, HTML
    Ответ написан
    Комментировать
  • Как программировать сайты на android?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Для веб-разработки использую DroidEdit (умеет работать по фтп) + AndFTP + Total Commander
    P.S. Для андроид разработки (java) - androport (open jdk + intellij idea)
    Ответ написан
    Комментировать
  • Как программировать сайты на android?

    @vasilek-nik
    QuickEdit - текстовый редактор с подсветкой кода, поддерживает соединения FTP/SFTP
    Ответ написан
    Комментировать
  • Будет ли работать транзакция?

    ivankomolin
    @ivankomolin
    1. Транзакция не блокирует таблицу на чтение и запись. Блокировки и транзакции - это два разных механизма.
    Транзакция отвечает за изоляцию операций(производимых внутри транзакции) от других операций.
    2. Необходимо разобраться какой уровень изоляции вам нужен и какой установлен сейчас для этой транзакции.

    По указанному коду непонятно сработает ли транзакция. Чтобы стало понятно, нужен код запросов внутри транзакции, а также знать текущий уровень изоляции.
    Ответ написан
    2 комментария
  • Как зафиксировать аргументы в методе?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    Eсли нет 7ки, то только так:
    <?php
    // Обработчик типов аргументов функций
    final class TypeHint
    {
    	static private $TypeHints = array(
    		'boolean'   => 'is_bool',
    		'bool'      => 'is_bool',
    		'string'    => 'is_string',
    		'resource'  => 'is_resource',
    		// Подменил ряд стандартных функий, чтобы числа переданные строкой не вызывали ошибок
    		'integer'   => 'self::is_int',
    		'int'       => 'self::is_int',
    		'float'     => 'self::is_float',
    		'double'    => 'self::is_float',
    		// Для примера добавил несколько собственных типов:
    		'strict'    => 'self::is_strict',    // Имена классов\функций\аргуметов
    		'url_param' => 'self::is_url_param', // Параметры ЧПУ ссылки
    		'filename'  => 'self::is_filename',  // Има файлов
    	);
    	
    	// Проверка на соотвествие типу integer \ int
    	static private function is_int($value)
    	{
    		if ((is_numeric($value) AND is_string($value) AND preg_match('/^[-]{0,1}[0-9]+$/u', $value )) OR is_int($value))
    		{
    			return TRUE;
    		}
    		return FALSE;
    	}
    	
    	// Проверка на соотвествие типу float \ double
    	static private function is_float($value)
    	{
    		if ((is_numeric($value) AND is_string($value) AND preg_match('/^[-]{0,1}[0-9]+\.[0-9]+$/u', $value)) OR is_float($value))
    		{
    			return TRUE;
    		}
    		return FALSE;
    	}
    	
    	// Проверка на соотвествие типу strict
    	static private function is_strict($value)
    	{
    		if (is_string($value) AND preg_match('/^[a-z_\x7f-\xff]{2,}[a-z0-9_\x7f-\xff]*$/iu', $value))
    		{
    			return TRUE;
    		}
    		return FALSE;
    	}
    	
    	// Проверка на соотвествие типу url_param
    	static private function is_url_param($value)
    	{
    		if ((is_string($value) OR is_int($value)) AND preg_match('/^[a-z0-9_\x7f-\xff]+$/iu', $value))
    		{
    			return TRUE;
    		}
    		return FALSE;
    	}
    	
    	// Проверка на соотвествие типу filename
    	static private function is_filename( $value )
    	{
    		if (is_string($value) AND preg_match('/^[a-z0-9_\x7f-\xff]+\.[a-z0-9_\x7f-\xff]+$/iu', $value))
    		{
    			return TRUE;
    		}
    		return FALSE;
    	}
    	
    	// Создание объекта возможно только через метод initializeHandler
    	private function __construct(){}
    	private function __clone(){}
    	private function __wakeup(){}
    	
    	// Инициализация обработчика
    	static public function initializeHandler()
    	{
    		set_error_handler('TypeHint::handleTypeHint');
    		return TRUE;
    	}
    	
    	// Получение аргументов функции
    	static private function getTypeHintedArgument($ThBackTrace, $ThFunction, $ThArgIndex, & $ThArgValue)
    	{
    		foreach ($ThBackTrace as $ThTrace)
    		{
    			if (isset($ThTrace['function']) AND $ThTrace['function'] == $ThFunction)
    			{
    				$ThArgValue = $ThTrace['args'][$ThArgIndex-1];
    				return TRUE;
    			}
    		}
    		return FALSE;
    	}
    	
    	// Обработчик
    	static public function handleTypeHint($ErrLevel, $ErrMessage, $ErrFile, $ErrLine)
    	{
    		if ($ErrLevel === E_RECOVERABLE_ERROR)
    		{
    			if (preg_match('/^Argument (\d)+ passed to (?:(\w+)::)?(\w+)\(\) must be an instance of (\w+), (\w+) given/u', $ErrMessage, $ErrMatches))
    			{
    				list($ErrMatch, $ThArgIndex, $ThClass, $ThFunction, $ThHint, $ThType) = $ErrMatches;
    				if (isset(self::$TypeHints[$ThHint]))
    				{
    					$ThBacktrace = debug_backtrace();
    					$ThArgValue  = NULL;
    					if (self::getTypeHintedArgument($ThBacktrace, $ThFunction, $ThArgIndex, $ThArgValue))
    					{
    						if (call_user_func(self::$TypeHints[$ThHint], $ThArgValue))
    						{
    							return TRUE;
    						}
    						throw new ErrorException($ErrMessage, 0, $ErrLevel, $ErrFile, $ErrLine);
    					}
    				}
    			}
    		}
    		return FALSE;
    	}
    }
    
    // Инициализируем обработчик
    TypeHint::initializeHandler();
    
    // Тест
    function test(strict $arg1, filename $arg2, $arg3 = 1)
    {
    	echo "It's work! {$arg1} | {$arg2} | {$arg3}";
    }
    
    try
    {
    	test('func_2', array(1,2))
    }
    catch (ErrorException $e)
    {
    	var_export($e->getMessage());
    }
    
    try
    {
    	test(10.1, 'str')
    }
    catch (ErrorException $e)
    {
    	var_export($e->getMessage());
    }
    
    try
    {
    	test('class_name', '02.jpg')
    }
    catch (ErrorException $e)
    {
    	var_export($e->getMessage());
    }
    Ответ написан
    Комментировать
  • Надо делать наследование или нет?

    Есть хороший способ определить рациональность использования наследования. Для этого нужно ответить на ряд вопросов:
    - оба класса из одной предметной области;
    - наследник отвечает принципу подстановки Барбары Лисков;
    - код наследуемого класса необходим либо хорошо подходит для наследника;
    - наследник в основном добавляет логику.
    Чем больше положительных ответов, тем больше вероятность, что вы не промахнетесь с выбором наследования.

    Конкретно в вашем случае я рискну предположить, что использование наследования излишне, и даже может стать бомбой замедленного действия при дальнейшем развитии системы. Здесь наследование выступает в роли выбора возможных алгоритмов действий пользователя в системе и введение новых ролей может оказаться очень дорогим, особенно если один пользователь должен будет обладать сразу несколькими ролями.
    Ответ написан
    Комментировать
  • Надо делать наследование или нет?

    @Arik
    if($user instanceof UserAdmin) {
    //admin
    }
    public function openWebsite(UserAdmin $userAdmin) {
    // 
    }

    Точно знаем что юзер админ или просим чтоб юзер был только админом, как там реализована проверка на админство уже этот код не касается.
    Ответ написан
    Комментировать
  • Надо делать наследование или нет?

    Morpheus_God
    @Morpheus_God
    У вас может быть в классе User описано лишь поле Name и поле LastName.
    А в конкретной реализации вы можете дописать для каждого конкретного юзера уже свои методы и дополнительные поля. Все от проекта зависит.
    Ответ написан
    2 комментария