Бложег

Подготовка к разработке будещего сайта

Опубликовано: 10.10.2018 в 22:57

Автор:

Категории: Бложег

Привет мой друг, эту статья написана не на чистом энтузиазме, а ради выгоды – контент то какой-то нужен, и эта статья по настоящему хороша, я напишу о том чего забывают или не пишут другие веб студии/разрабы в своих блогах, я сам придерживаюсь этого списка чтобы быть чуть-чуть виртуозом в своей работе =)

 

Первым делом нужно выбрать хостинг – пользовался несколькими, остановился на hostland.ru (уж очень быстро страницы грузятся и хороший аптайм + удобная панель с различными инструментами), еще неплох timeweb (но там просадки все же бывают, да и панель неудобная)

 

Заготовка для сайта, это у нас модифицированный bootstrap, в дальнейшем перенос в тему wordpess/другого движка.

 

Настройка сайта состоит из нескольких пунктов:

 

Robots.txt с запретом на индексацию (а то у заказчика могут возникнуть проблемы с индексацией текстов, они будут уже не уникальные)

 

User-agent: *
Disallow: /

Создание отдельного пользователя с данными заказчика и отдельного для себя (не храните пароли в браузерах только)

Установка запрета прав на обновления плагинов – если это wordpress – при разработка вам наверняка придется править файлы плагинов, и чтобы при обновлении ничего не сломалось, просто поставьте плагин

Настройка кеширования (чуть позже выйдет хорошая статья об этом)

Верстать с помощью препроцессора (сам предпочитаю scss, очень легок)

Установка минимальных плагинов, для wordpress это

Транслит ссылок, медиафайлов и т.д

Какой нибудь Yoast SEO не помешает для будущего продвижения

Compress JPEG & PNG images (панда которая) для оптимизации картинок, дают кажется 1к фри оптимизаций

Установка счетчиков посещения или какой нибудь статистики

 

Следить и помогать своим проектам, деньги деньгами а мертвые проекты в портфолио никому не нужны =)

Аналог Sypex Dumper или как импортировать большую БД

Опубликовано: 10.10.2018 в 22:44

Автор:

Категории: Бложег

Заливая огромную бд на вдс сервер был удивлен что сервер то падает, то зависает, пошел гуглить и нашел Sypex Dumper, однако он не так хорош по мне, завести его оказалось ну что-то трудно, особенно на непонятных конфигах VDS, наткнулся на хороший софт – называется SQL Dump File Splitter, он просто дробит большой дамп на много маленьких и все успешно заливается =)

Скачать удивительный софт

Contact form ошибка 404

Опубликовано: 10.10.2018 в 22:39

Автор:

Категории: Wordpress,Бложег

Разрабатывая очередной сайт http://bsk.kg/ я столкнулся что плагин контактной формы начал отдавать в ответе запроса ошибку 404, выяснил что ошибка эта происходит из-за некоторых строк оптимизации WP, а точнее отключения какого-то там API, которое нужно хрен пойми кому =)

Решение глупое и простое – нужно обновить постоянные ссылки

Slick slider overflow fix

Опубликовано: 10.10.2018 в 17:04

Автор:

Категории: JQ,Бложег,Верстка

Тэги:

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

У меня при hover должен выскакивать блок с инфой, но slick slider режет его, указал для body overflow-x: hidden, и все бы хорошо, но у слайдера есть контейнер, он не во всю ширину, и вот нагуглил такое единственное решение на css

Помещаем это в css

.slick-list {
overflow: visible!important;
}
.slick-slide {
opacity: 0;
transition: opacity 500ms;
}
.slick-slide.slick-active {
opacity: 1;
}

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

centerMode: false

и радуемся глазу

Узнать адрес phpmyadmin или как слить бд ?

Опубликовано: 14.08.2018 в 20:43

Автор:

Категории: php,Бложег

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

Но не всегда выходит найти адрес phpmyadmin, хостинги его скрывают в целях безопасности, а ставить плагины в админку не всегда удобно и это займет время (особенно если это вордпресс), наша цель сделать бекап.

Создаем php фаил с любым названием и заливаем скрипт

<?php 
/**
 * This file contains the Backup_Database class wich performs
 * a partial or complete backup of any given MySQL database
 * @author Daniel López Azaña <daniloaz@gmail.com>
 * @version 1.0
 */

/**
 * Define database parameters here
 */
define("DB_USER", '');
define("DB_PASSWORD", '');
define("DB_NAME", '');
define("DB_HOST", 'localhost');
define("BACKUP_DIR", 'myphp-backup-files'); // Comment this line to use same script's directory ('.')
define("TABLES", '*'); // Full backup
//define("TABLES", 'table1, table2, table3'); // Partial backup
define("CHARSET", 'utf8');
define("GZIP_BACKUP_FILE", true);  // Set to false if you want plain SQL backup files (not gzipped)

/**
 * The Backup_Database class
 */
class Backup_Database {
    /**
     * Host where the database is located
     */
    var $host;

    /**
     * Username used to connect to database
     */
    var $username;

    /**
     * Password used to connect to database
     */
    var $passwd;

    /**
     * Database to backup
     */
    var $dbName;

    /**
     * Database charset
     */
    var $charset;

    /**
     * Database connection
     */
    var $conn;

    /**
     * Backup directory where backup files are stored 
     */
    var $backupDir;

    /**
     * Output backup file
     */
    var $backupFile;

    /**
     * Use gzip compression on backup file
     */
    var $gzipBackupFile;

    /**
     * Content of standard output
     */
    var $output;

    /**
     * Constructor initializes database
     */
    public function __construct($host, $username, $passwd, $dbName, $charset = 'utf8') {
        $this->host            = $host;
        $this->username        = $username;
        $this->passwd          = $passwd;
        $this->dbName          = $dbName;
        $this->charset         = $charset;
        $this->conn            = $this->initializeDatabase();
        $this->backupDir       = BACKUP_DIR ? BACKUP_DIR : '.';
        $this->backupFile      = 'myphp-backup-'.$this->dbName.'-'.date("Ymd_His", time()).'.sql';
        $this->gzipBackupFile  = defined('GZIP_BACKUP_FILE') ? GZIP_BACKUP_FILE : true;
        $this->output          = '';
    }

    protected function initializeDatabase() {
        try {
            $conn = mysqli_connect($this->host, $this->username, $this->passwd, $this->dbName);
            if (mysqli_connect_errno()) {
                throw new Exception('ERROR connecting database: ' . mysqli_connect_error());
                die();
            }
            if (!mysqli_set_charset($conn, $this->charset)) {
                mysqli_query($conn, 'SET NAMES '.$this->charset);
            }
        } catch (Exception $e) {
            print_r($e->getMessage());
            die();
        }

        return $conn;
    }

    /**
     * Backup the whole database or just some tables
     * Use '*' for whole database or 'table1 table2 table3...'
     * @param string $tables
     */
    public function backupTables($tables = '*') {
        try {
            /**
            * Tables to export
            */
            if($tables == '*') {
                $tables = array();
                $result = mysqli_query($this->conn, 'SHOW TABLES');
                while($row = mysqli_fetch_row($result)) {
                    $tables[] = $row[0];
                }
            } else {
                $tables = is_array($tables) ? $tables : explode(',', str_replace(' ', '', $tables));
            }

            $sql = 'CREATE DATABASE IF NOT EXISTS `'.$this->dbName."`;\n\n";
            $sql .= 'USE `'.$this->dbName."`;\n\n";

            /**
            * Iterate tables
            */
            foreach($tables as $table) {
                $this->obfPrint("Backing up `".$table."` table...".str_repeat('.', 50-strlen($table)), 0, 0);

                /**
                 * CREATE TABLE
                 */
                $sql .= 'DROP TABLE IF EXISTS `'.$table.'`;';
                $row = mysqli_fetch_row(mysqli_query($this->conn, 'SHOW CREATE TABLE `'.$table.'`'));
                $sql .= "\n\n".$row[1].";\n\n";

                /**
                 * INSERT INTO
                 */

                $row = mysqli_fetch_row(mysqli_query($this->conn, 'SELECT COUNT(*) FROM `'.$table.'`'));
                $numRows = $row[0];

                // Split table in batches in order to not exhaust system memory 
                $batchSize = 1000; // Number of rows per batch
                $numBatches = intval($numRows / $batchSize) + 1; // Number of while-loop calls to perform
                for ($b = 1; $b <= $numBatches; $b++) {
                    
                    $query = 'SELECT * FROM `'.$table.'` LIMIT '.($b*$batchSize-$batchSize).','.$batchSize;
                    $result = mysqli_query($this->conn, $query);
                    $numFields = mysqli_num_fields($result);

                    for ($i = 0; $i < $numFields; $i++) {
                        $rowCount = 0;
                        while($row = mysqli_fetch_row($result)) {
                            $sql .= 'INSERT INTO `'.$table.'` VALUES(';
                            for($j=0; $j<$numFields; $j++) {
                                if (isset($row[$j])) {
                                    $row[$j] = addslashes($row[$j]);
                                    $row[$j] = str_replace("\n","\\n",$row[$j]);
                                    $sql .= '"'.$row[$j].'"' ;
                                } else {
                                    $sql.= 'NULL';
                                }

                                if ($j < ($numFields-1)) {
                                    $sql .= ',';
                                }
                            }

                            $sql.= ");\n";
                        }
                    }

                    $this->saveFile($sql);
                    $sql = '';
                }

                $sql.="\n\n\n";

                $this->obfPrint(" OK");
            }

            if ($this->gzipBackupFile) {
                $this->gzipBackupFile();
            } else {
                $this->obfPrint('Backup file succesfully saved to ' . $this->backupDir.'/'.$this->backupFile, 1, 1);
            }
        } catch (Exception $e) {
            print_r($e->getMessage());
            return false;
        }

        return true;
    }

    /**
     * Save SQL to file
     * @param string $sql
     */
    protected function saveFile(&$sql) {
        if (!$sql) return false;

        try {

            if (!file_exists($this->backupDir)) {
                mkdir($this->backupDir, 0777, true);
            }

            file_put_contents($this->backupDir.'/'.$this->backupFile, $sql, FILE_APPEND | LOCK_EX);

        } catch (Exception $e) {
            print_r($e->getMessage());
            return false;
        }

        return true;
    }

    /*
     * Gzip backup file
     *
     * @param integer $level GZIP compression level (default: 9)
     * @return string New filename (with .gz appended) if success, or false if operation fails
     */
    protected function gzipBackupFile($level = 9) {
        if (!$this->gzipBackupFile) {
            return true;
        }

        $source = $this->backupDir . '/' . $this->backupFile;
        $dest =  $source . '.gz';

        $this->obfPrint('Gzipping backup file to ' . $dest . '... ', 1, 0);

        $mode = 'wb' . $level;
        if ($fpOut = gzopen($dest, $mode)) {
            if ($fpIn = fopen($source,'rb')) {
                while (!feof($fpIn)) {
                    gzwrite($fpOut, fread($fpIn, 1024 * 256));
                }
                fclose($fpIn);
            } else {
                return false;
            }
            gzclose($fpOut);
            if(!unlink($source)) {
                return false;
            }
        } else {
            return false;
        }
        
        $this->obfPrint('OK');
        return $dest;
    }

    /**
     * Prints message forcing output buffer flush
     *
     */
    public function obfPrint ($msg = '', $lineBreaksBefore = 0, $lineBreaksAfter = 1) {
        if (!$msg) {
            return false;
        }

        $output = '';

        if (php_sapi_name() != "cli") {
            $lineBreak = "<br />";
        } else {
            $lineBreak = "\n";
        }

        if ($lineBreaksBefore > 0) {
            for ($i = 1; $i <= $lineBreaksBefore; $i++) {
                $output .= $lineBreak;
            }                
        }

        $output .= $msg;

        if ($lineBreaksAfter > 0) {
            for ($i = 1; $i <= $lineBreaksAfter; $i++) {
                $output .= $lineBreak;
            }                
        }


        // Save output for later use
        $this->output .= str_replace('<br />', '\n', $output);

        echo $output;


        if (php_sapi_name() != "cli") {
            ob_flush();
        }

        $this->output .= " ";

        flush();
    }

    /**
     * Returns full execution output
     *
     */
    public function getOutput() {
        return $this->output;
    }
}

/**
 * Instantiate Backup_Database and perform backup
 */

// Report all errors
error_reporting(E_ALL);
// Set script max execution time
set_time_limit(900); // 15 minutes

if (php_sapi_name() != "cli") {
    echo '<div style="font-family: monospace;">';
}

$backupDatabase = new Backup_Database(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, CHARSET);
$result = $backupDatabase->backupTables(TABLES, BACKUP_DIR) ? 'OK' : 'KO';
$backupDatabase->obfPrint('Backup result: ' . $result, 1);

// Use $output variable for further processing, for example to send it by email
$output = $backupDatabase->getOutput();

if (php_sapi_name() != "cli") {
    echo '</div>';
}

Настраиваем конфиги которые мы находим на фтп и теперь можно смело работать =)

Убрать белые поля у картинок opencart

Опубликовано: 08.08.2018 в 22:02

Автор:

Категории: Opencart,Бложег

Очень часто, практически всегда при заливки картинок для слайдера/контента приходиться подрезать/обрабатывать картинки для корректного отображения, т.к Opencart добавляет отступы если будет не хватать размеров для картинки, случайно наткнулся в поисках другого плагина, протестировано opencart 2.3.

 

Установка самая стандартная

 

imagefix_ocmod

Универсальный конфиг для opencart

Опубликовано: 08.08.2018 в 14:38

Автор:

Категории: Opencart,php,Бложег

Делали тут совместный проект с кодером, подсказал он универсальный конфиг для opencart, его суть – упростить перенос и не искать пути, а так же он может пригодиться для зеркалов сайта

<?php
// HTTP
define('HTTP_SERVER', 'http://'.$_SERVER['SERVER_NAME'].'/');

// HTTPS
define('HTTPS_SERVER', 'http://'.$_SERVER['SERVER_NAME'].'/');

// DIR
define('DIR_APPLICATION', $_SERVER['DOCUMENT_ROOT'].'catalog/');
define('DIR_SYSTEM', $_SERVER['DOCUMENT_ROOT'].'system/');
define('DIR_IMAGE', $_SERVER['DOCUMENT_ROOT'].'image/');
define('DIR_LANGUAGE', $_SERVER['DOCUMENT_ROOT'].'catalog/language/');
define('DIR_TEMPLATE', $_SERVER['DOCUMENT_ROOT'].'catalog/view/theme/');
define('DIR_CONFIG', $_SERVER['DOCUMENT_ROOT'].'system/config/');
define('DIR_CACHE', $_SERVER['DOCUMENT_ROOT'].'system/storage/cache/');
define('DIR_DOWNLOAD', $_SERVER['DOCUMENT_ROOT'].'system/storage/download/');
define('DIR_LOGS', $_SERVER['DOCUMENT_ROOT'].'system/storage/logs/');
define('DIR_MODIFICATION', $_SERVER['DOCUMENT_ROOT'].'system/storage/modification/');
define('DIR_UPLOAD', $_SERVER['DOCUMENT_ROOT'].'system/storage/upload/');

//тут ваш конфиг
?>

:checked не работает

Опубликовано: 07.08.2018 в 17:35

Автор:

Категории: JQ,Бложег,Верстка

Делал чебоксы для сайта, на мобильнике менялась чуть-чуть структура, пришлось скрывать чебоксы на < 1200, и показывать другой блок на < 767, всё бы ничего, но не срабатывали чебоксы на мобильниках, всё аналогичное…странно подумал я.
Оказалось что чебокс был занят и поэтому он не срабатывал (т.к был дубль ID), для того чтобы вернуть работоспособность я просто удалил кусок кода который был скрыт на мобильниках через jq

$(window).resize(function() {
    if ($(window).width() < 768) {
        $(".product-options.hidden-xs").remove()
    }
});

Адаптивные таблицы “на лету” и без велосипедов

Опубликовано: 12.05.2018 в 04:44

Автор:

Категории: JQ,Wordpress,Верстка

Нужна была адаптивная таблица, причем хорошая и без минимум внедрения и настройки, погуглив решения на флексах – понял что флексы еще не так хороши, вспомнил про добрый старый вариант который я использовал в обменнике, через data content, отличный вариант, только внедрять долго, а чего бы не сделать автоматическую подстановку из th ? Погуглив нашел отличное решение!

 

 

See the Pen jxxQRx by true404 (@true404) on CodePen.

Выключаем кеширование на время разработки для css

Опубликовано: 26.03.2018 в 17:49

Автор:

Категории: Бложег,Верстка

Надоело нажимать ctrl + f5 ? или получать сообщения от заказчиков о том что изменения не прошли на его планшете/компьютере ?

Добавляем

&amp;lt;?php echo time(); ?&amp;gt;

Для CSS файла, и получается нечто

&lt;link rel="stylesheet" type="text/css" href="/css/style.css?&lt;?php echo time(); ?&gt;"&gt;