Blog

  • Ajax редактирование таблиц и табличных данных

    Ajax редактирование таблиц и табличных данных

    Ссылка на исходники обновлена 25.06.2020 (пока без комментариев)

    По просьбам трудящихся – исходники. В архиве .sql и .php – всё в одном, и вывод и обработчик, всё с подробными комментариями.


     

    Привет тебе дорогой читатель, сегодня мы немного поговорим об инлайновом редактировании данных в таблицах без перезагрузки страницы (inline edit ajax).

    Как я уже сказал, передо мной встала задача редактирования данных в таблицах. После непродолжительных поисков нашел подходящий вариант, который не использует дополнительные плагины и библиотеки кроме самой jQuery. А таких на самом деле вагон и целая тележка и у каждого есть свои преимущества и недостатки. Один из самых неплохих по функционалу – jqGrid, но о нём мы поговорим в следующий раз.

    Представим, что наши данные, по умолчанию, хранятся в базе. В моём примере это будет MySql, обновляться они будут с помощью JS и PHP по технологии AJAX.

    AJAX, Ajax (ˈeɪdʒæks, от англ. Asynchronous Javascript and XML — «асинхронный JavaScript и XML») — подход к построению интерактивных пользовательских интерфейсов веб-приложений, заключающийся в «фоновом» обмене данными браузера с веб-сервером. В результате, при обновлении данных веб-страница не перезагружается полностью, и веб-приложения становятся быстрее и удобнее.

    Источник: Википедия

    Итак обсудим то, что у нас имеется, и то, что мы хотим получит в итоге

    Исходные данные:

    ТаблицЫ с данными, которые генерируются на PHP, запросом из нашей базы данных.
    Допустим у нас есть две таблицы: клиенты (clients) и сотрудники (workers)
    Поля наших таблиц на самом деле неважно какие, но возьмём для примера такие:

    • id – первичный уникальный ключ с авто инкрементом.
    • firstname – имя сотрудника или клиента
    • lastname – фамилия сотрудника или клиента
    • phone – телефон сотрудника или клиента

    Необходимый результат:

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

    Что нам для этого потребуется?

    • jquery.js – jQuery javascript framework
    • Заполненные таблицы в БД
    • Азы PHP + JS
    • Смекалка

    Приступим к выполнению нашей задачи

    Первым делом подключаем необходимую библиотеку (jQuery) внутри тегов <head></head>. Я обычно использую самую последнюю версию, чтобы поддерживать актуальность знаний о возможностях этой чудно библиотеки и подключаю её минифицированную версию из репозитория Google Hosted Library. На момент написания статьи актуальная версия 1.9.1, её и подключаем.

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>

    Далее присваиваем нашей таблице уникальный идентификатор id, который соответствует названию таблицы в базе (это важно!).
    Выводим все строки циклом и присваиваем строкам класс – edit, класс с названием столбца в БД и числовой класс с идентификатором строки в БД.

    </pre>
    <table id="clients">
    <tbody>
    <tr>
    <th>Имя</th>
    <th>Фамилия</th>
    <th>Телефон</th>
    </tr>
    <!--Эта часть выводится с помощью php -->
    <tr>
    <td class="edit firstname '.$rows['id'].'">'.$rows['firstname'].'</td>
    <td class="edit lastname '.$rows['id'].'">'.$rows['lastname'].'</td>
    <td class="edit phone '.$rows['id'].'">'.$rows['phone'].'</td>
    </tr>
    </tbody>
    </table>
    <pre>
    

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

    //при нажатии на ячейку таблицы с классом edit
    $('td.edit').click(function(){
    //находим input внутри элемента с классом ajax и вставляем вместо input его значение
    $('.ajax').html($('.ajax input').val());
    //удаляем все классы ajax
    $('.ajax').removeClass('ajax');
    //Нажатой ячейке присваиваем класс ajax
    $(this).addClass('ajax');
    //внутри ячейки создаём input и вставляем текст из ячейки в него
    $(this).html('<input id="editbox" size="'+ $(this).text().length+'" type="text" value="' + $(this).text() + '" />');
    //устанавливаем фокус на созданном элементе
    $('#editbox').focus();
    });
    

    Итак форма для редактирования текста у нас появилась, что же мы с ней будем делать дальше?
    Теперь нам необходимо сохранять введенные данные при каком то событии, я приведу пример сохранения данных при нажатии Enter.

    //определяем нажатие кнопки на клавиатуре
    $('td.edit').keydown(function(event){
    //получаем значение класса и разбиваем на массив
    //в итоге получаем такой массив - arr[0] = edit, arr[1] = наименование столбца, arr[2] = id строки
    arr = $(this).attr('class').split( " " );
    //проверяем какая была нажата клавиша и если была нажата клавиша Enter (код 13)
       if(event.which == 13)
       {
    //получаем наименование таблицы, в которую будем вносить изменения
    var table = $('table').attr('id');
    //выполняем ajax запрос методом POST
     $.ajax({ type: "POST",
    //в файл update_cell.php
     url:"update_cell.php",
    //создаём строку для отправки запроса
    //value = введенное значение
    //id = номер строки
    //field = название столбца
    //table = собственно название таблицы
     data: "value="+$('.ajax input').val()+"&id="+arr[2]+"&field="+arr[1]+"&table="+table,
    //при удачном выполнении скрипта, производим действия
     success: function(data){
    //находим input внутри элемента с классом ajax и вставляем вместо input его значение
     $('.ajax').html($('.ajax input').val());
    //удаялем класс ajax
     $('.ajax').removeClass('ajax');
     }});
     }});
    

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

    $('#editbox').live('blur',function(){
    $('.ajax').html($('.ajax input').val());
    $('.ajax').removeClass('ajax');
    });
    

    Вам остаётся только обработать полученные данные в файле update_cell.php, все необходимые переменные у Вас есть, пусть это будем вашей самостоятельной работой.
    Таким образом мы получаем компактный, универсальный скрипт для быстрого редактирования любых табличных данных.

    Если кому нужны будут полные исходники моего варианта скрипта – пишите в коменты.

    Дополнение №1

    В версии jQuery 1.9.1 отключен метод .live. Вместо него нужно использовать метод .on, сравните синтаксис сами:

    $(document).on('blur', '#editbox', function(){
    $('.ajax').html($('.ajax input').val());
    $('.ajax').removeClass('ajax');
    });
    

    По материалам http://www.iwebux.com

  • Облачный провайдер Tucha: личный опыт использования

    Облачный провайдер Tucha: личный опыт использования

    Привет всем, кто меня читает!

    Сегодня хочу вам рассказать об облачном провайдере Tucha, чьим партнером я являюсь и чьими услугами я сам пользуюсь. Думаю, что для вас эта информация будет полезна, ведь компанией я доволен на 100% и вам сервис тоже рекомендую – сэкономите кучу времени и нервов.

    Итак, что же такое Tucha?

    Это облачная среда, позволяющая разместить в облаке ИТ-инфраструктуру любой сложности.

    Компания предоставляет готовые решения, так сказать, «под ключ». Ресурсы и лицензионное ПО сдаются в аренду за адекватные деньги. Да, это не бесплатно, но за качество и надежность заплатить стоит. Лично я разместил на виртуальных серверах все данные, которые для меня представляют ценность, чтобы эти самые данные максимально обезопасить, ведь серверы находятся в Европе – и это тоже большой дополнительный плюс.

    Ребята из Tucha предлагают несколько различных услуг:

    TuchaFlex (ЦОД с возможностями индивидуальной настройки любых параметров);

    TuchaHost (хостинг готовых серверов в облаке, масштабируется блоками);

    TuchaOffice (вынос в облако всего офиса или отдельных приложений (1С, CRM и т.д.);

    TuchaHosting (в облако можно вынести сайт или почту).

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

    Основные преимущества я для себя выделил следующие:

    • Грамотная техподдержка (русский/английский, есть тикет-система, отвечают и, главное, решают вопросы по почте или в телефонном режиме реально круглосуточно (24/7), всё быстро и четко. Если есть необходимость и возможность, то стоит обратить внимание на расширенную техподдержку).
    • Адекватная стоимость (TuchaHost обходится мне в 25 евро в месяц, за эти деньги я получаю CPU 1 ядро, RAM 2 ГБ и целых 125 ГБ HDD).
    • Расположение серверов и уровень площадки (во Франкфурте, в дата-центре уровня Tier3).
    • Расположение компании (Tucha находится в Украине, поэтому они понимают всю нашу специфику и дела с ними вести одно удовольствие).

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

  • Как избавиться от jQuery.noconflict в разных CMS?

    Как избавиться от jQuery.noconflict в разных CMS?

    По умолчанию, в некоторых системах управления, таких как например Joomla и WordPress у библиотеки jQuery включен noConflict() режим, который при подключении пользовательских скриптов доставляет немало хлопот, пока вы не поймёте в чём причина. Итак, я расскажу какими способами можно отключить этот режим.

    В WordPress подключается jQuery.js который встроен в ядро и который периодчески обновляется, вы конечно можете убрать в нём последнюю строку, но после обновления WP, файл обновится и ваши правки канут в лету, а сайт перестанет нормально работать. На самом деле, всё более чем просто.
    Необходимо добавить в ваш шаблон одну строку, в файл header.php, сразу после вызова <?php wp_head(); ?>:

    <script>var $ = jQuery.noConflict();</script>

    Все остальные скрипты должны вызываться после этой строки.

     


     

    В Joomla 3.x чтобы отключить этот режим необходимо в index.php шаблона добавить тоже, как это ни странно, одну строку:

    unset($doc->_scripts[JURI::root(true) . '/media/jui/js/jquery-noconflict.js']);

    Добавлять её необходимо перед закрывающим тегом ?> перед объявлением доктайпа:

    unset($doc->_scripts[JURI::root(true) . '/media/jui/js/jquery-noconflict.js']);
    ?><!DOCTYPE html>
    <html>
    

    В следующей статье я расскажу как проделать тоже самое с помощью плагинов.
    И не забудьте написать в комментариях как это делаете Вы – это будет полезно общественности!

  • Вставка рекламных блоков в запись WordPress после абзаца

    Вставка рекламных блоков в запись WordPress после абзаца

    Искал подходящую функцию для вставки рекламных блоков в определённом месте внутри поста на WordPress и наткнулся на неплохую функцию:

    add_filter( 'the_content', 'quato_google_insert' );
    function quato_google_insert( $content ) {
            if( !is_single() )
                return $content;
                $paragraphAfter = 3; //Введите номер абзаца, после которого вставляем.
                $content = explode ( "</p>", $content );
                $new_content = '';
                    for ( $i = 0; $i < count ( $content ); $i ++ ) {
                        if ( $i == $paragraphAfter ) {
                        $new_content .= '
                        //Здесь вставьте ваш код рекламного блока
                        ';
                        }
                $new_content .= $content[$i] . "</p>";
                }
                return $new_content;
        }
    

    Вставляет рекламный блок или любой другой код после определённого абзаца только на страницах записей. В пятой строке переменная $paragraphAfter определяет после какого параметра вставлять ваш код.
    Функцию вставлять в конец файла functions.php вашей темы перед закрывающим тегом

  • Центрируем по вертикали модальные окна bootstrap

    Центрируем по вертикали модальные окна bootstrap

    Для центрирования модальных окон bootstrap вы можете использовать следующую функцию:

    function centerModals(){
    			  $('.modal').each(function(i){
    			    var $clone = $(this).clone().css('display', 'block').appendTo('body');
    			    var top = Math.round(($clone.height() - $clone.find('.modal-content').height()) / 2);
    			    top = top > 0 ? top : 0;
    			    $clone.remove();
    			    $(this).find('.modal-content').css("margin-top", top);
    			  });
    			}
    

    Вызов функции прост – centerModals();
    Также не забудьте повесить функцию центрирования модальных окошек на событие on.resize:

    $(window).on('resize', centerModals);
    
  • Импорт/экcпорт больших CSV в MySQL в консоли SSH

    Импорт/экcпорт больших CSV в MySQL в консоли SSH

    Представим что у вас есть очень большой файл CSV, который нужно импортировать быстро и без проблем.
    Приведу пример структуры файла, для кода которым будем испортировать:

    id,имя,телефон,адрес
    1,James,505-234-2123,3456 Super St.
    2,Mark,254-342-6732,7351 Roger Rd.
    Код необходимо исполнять в консоли SSH
    mysqlimport  --ignore-lines=1 --fields-terminated-by=, --columns='ID,Name,Phone,Address' --local -u root -p Database /path/to/csvfile/TableName.csv
    

    Параметры:
    –ignore-lines – указывает сколько строк будет пропущено в начале файла
    –columns – соответственно столбцы базы данных, которым соотвтетствуют столбцы в вашем файле
    –local – указывает на то что файл будет считываться локально
    -u – логин пользователя
    -p – указывает что необходимо будет запросить пароль для подключения к БД
    Database – имя базы данных в которую необходимо будет произвести импорт
    /path/to/csvfile/TableName.csv – путь к файлу импорта.

    Важно! Файл необходимо называть именем таблицы если она уже существует чтобы данные попали в неё.


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

    mysqldump -u [USER_NAME] -p "--where=[WHERE]" "--fields-terminated-by=," "--tab=./" [DB_NAME] [TABLE] > [TABLE].txt
    

    Эта команда производит экспорт и создаёт два файла – txt и sql

  • Smooth Scrolling или плавная прокрутка к элементу

    Smooth Scrolling или плавная прокрутка к элементу

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

    $(function(){
        $("a[href*=#]:not([href=#])").click(function(){
            if(location.pathname.replace(/^\//,"")==this.pathname.replace(/^\//,"")&&location.hostname==this.hostname){
                var t=$(this.hash);
                if (t = t.length ? t : $("[name="+this.hash.slice(1)+"]"), t.length)
                return $("html,body").animate({
                    scrollTop:t.offset().top
                },1000),!1
            }
        })
    });
  • Postfix Shortcodes

    Postfix Shortcodes

    Если у вас стоит postfix в качестве обработчика почты:
    postqueue -p — позволит вывести почтовую очередь
    postsuper -dALL — удалит её.

  • Устанавливаем кодировку utf-8 в php функцией header

    Устанавливаем кодировку utf-8 в php функцией header

    Всё время забываю синтаксис, запишу на всякий случай как прописать utf-8 в php

    header('Content-Type: text/html; charset=utf-8');

    Важно! Данную строчку необходимо вставлять до вывода любого контета тегами echo, print или любыми другими.
    Также сам файл должен быть сохранён в utf-8, иначе вместо текста вы увидите иероглифы или знаки вопросов.

  • Убираем дубли в nginx – index и www

    Убираем дубли в nginx – index и www

    Привет дорогие читатели, расскажу Вам сегодня немного о настройке Джинксе под наши любимые поисковики, которые не любят дубли страниц. Инфа специально для тех у кого установлен чистый nginx без связки с Apache и правила rewrite в .htaccess не применяются.

    И так, поехали. Открываем конфиг, у меня стоит CentOS 6, поєтому его путь такой: /etc/nginx/nginx.conf
    Находим ваш сайт, обычно настройка конкретного домена начинается с директивы

    server {

    Далее находим параметр server_name вашсайт.ком
    Если тут у вас прописан домен так: server_name вашсайт.ком www.вашсайт.ком
    то, Вам необходимо убрать www.вашсайт.ком и далее следовать инструкцией.

    Выше директивы

    server {

    создаёте еще одну и вписываете в неё такие данные

    server {
                server_name www.вашсайт.ком;
                rewrite ^(.*) http://вашсайт.ком$1 permanent;
            }

    После этого nginx будет перенаправлять все запросы c www на без www, и это собственно то, чего мы добивались. Но не будем расслабляться, index.php нам тоже ни к чему. Чтобы убрать index.php и index.html из адресной строки нужно провести всего лишь одну нехитрую манипуляцию. Внутри основной директивы server добавляем:

    if ($request_uri ~ "^/index.(php|html?)") {
                rewrite ^ /$1 permanent;
            }

    Теперь у нас практически идеальный сайт с точки зрения Яндекса и Гугла. Шучу конечно, до идеала еще далеко. Но в следующих моих записях я расскажу о кешировании, и о том как оно влияет на параметр скорости загрузки Google PageSpeed.

    P.S. Не забывайте перезагружать nginx после изменений в конфиге иначе ничего не изменится. Удачи!