Блог Вячеслава Волкова

Тому, что действительно нужно знать, никто не научит.

— Оскар Уайльд

Раздел блога / Веб-технологии

JSON Сериализация класса php с помощью JsonSerializable

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

Например, мы можем это сделать с помощью такой конструкции.
<?php
class Test {
	public $a = 'A';
	public $b = 'B';
}

$b = new Test();
echo json_encode($b);
?>

На выходе мы получим вот такой результат:
{"a":"A","b":"B"}

Но как быть, например, если у класса у нас есть приватные или продектед свойства, а при сериализации они все равно должны быть видны. Например, вот такой пример:
<?php
class Test {
	protected $a = 'A';
	protected $b;
}

$b = new Test();
echo json_encode($b);

На выходе мы получим просто пустой объект {}.

Для исправления этой проблемы в PHP существует интерфейс JsonSerializable, который и позволяет нам сериализовать класс по каки-то условиям. Например,
<?php
class Test implements JsonSerializable {
	protected $a = 'A';
	protected $b = true;
	public function jsonSerialize() {
		$result = array(
			'value' => $this->a,
			'result' => $this->b
		);
		return $result;
	}
}
$b = new Test();
echo json_encode($b);
?>

Нам нужно лишь реализовать метод jsonSerialize. Теперь на выходе у нас будет вот такой результат:
{"value":"A","result":true}

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

И базовый класс модели сериализации выглядит уже вот так.
<?php namespace App\Model;
class BaseJsonModel extends Base implements \JsonSerializable {
	public function __construct() {
		parent::__construct();
	}
	public function jsonSerialize() {
		$reflect = new \ReflectionClass($this);
		$props   = $reflect->getProperties(\ReflectionProperty::IS_PUBLIC | \ReflectionProperty::IS_PROTECTED);
		$result = array();
		foreach($props as $item) {
			$name = $item->getName();
			$result[$name] = $this->$name;
		}
		return $result;
	}
	public function __toString() {
		return json_encode($this->jsonSerialize(), JSON_UNESCAPED_UNICODE);
	}
}

Сборка backbone+requirejs проекта с помощью grunt

Моей основной задачей в последнее время является создание одностраничных javascript приложений. В основном я использую фреймворк Backbone и requirejs. Обычно публикация приложения была простым действием "svn update" но из-за этого возникала куча проблем, начиная с несжатых файлов стилей, огромного количества js файлов и заканчивая кэшированием файлов браузером.

Поэтому я решил озадачится и воспользоваться сборщиком проектов, который должен был решить все возможные проблемы с публикацией проектов. Выбор пал на Grunt. Почему именно он? Возможно потому что для него сейчас уже существует огромное количество плагинов и им легко пользоваться.

Не буду вдаваться в описание этого сборщика, в Интернете есть достаточное количество уже информации. Расскажу о том, как он помогает решать непосредственно мои задачи.

Узнать больше »

Сортировка DOM элементов с jQuery

Очень часто может возникнуть ситуация когда необходима сортировка html элементов в DOM с помощью javascript.

Для решения данной задачи можно воспользоваться встроенной функцией sort.

Например, у нас есть вот такой неупорядоченный список.
<button class="sort-elements">Сортировать</button>

<div class="sorting">
    <ul class="elements">
        <li>Элементы</li>
        <li>Для</li>
        <li>Проверки</li>
        <li>Сортировки</li>
        <li>На</li>
        <li>jQuery</li>
    </ul>
</div>

Для его сортировки можно использовать следующий метод
$('.sort-elements').click(function(){
    var $elements = $('.elements li');
    var $target = $('.sorting ul');
    
    $elements.sort(function (a, b) {
        var an = $(a).text(),
            bn = $(b).text();
        
        if (an && bn) {
            return an.toUpperCase().localeCompare(bn.toUpperCase());
        }
        
        return 0;
    });
    
    $elements.detach().appendTo($target);
});

Или вот здесь можно посмотреть рабочий пример сортировки.

Как сменить значения двух столбцов в mysql

Очень часто мы можем ошибиться при внесении данных в БД mysql, например, такое часто может возникнуть когда вы спутаете параметры широты или долготы. Что бы быстро сменить значения двух столбцов в БД вам пригодится вот такой простой запрос который меняет значения и для NULL столбцов тоже.
UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;

Ошибка «upstream sent too big header» при установке xdebug в symfony 2

После установки xdebug и запуске DEV environment в Symfony 2 можно получить ошибку Bad Gateway. В логах nginx можно найти следующую ошибку:
upstream sent too big header while reading response header from upstream

Для ее исправления необходимо увеличить параметры в конфигурации виртуального хоста Nginx.
fastcgi_buffer_size 32k;
fastcgi_buffers 4 32k;

В итоге получаем вот такой конфиг:
location ~ ^/(app|app_dev|config)\.php(/|$) {
          fastcgi_buffer_size 32k;
          fastcgi_buffers 4 32k;
          fastcgi_pass    unix:/tmp/site.sock;
          fastcgi_split_path_info ^(.+\.php)(/.*)$;
          include fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param  HTTPS off;
        }

Передача JSON объекта в iframe или в новое окно через postMessage

Передача информации между родительским окном и iframe на странице или дочерним окном стала возможна благодаря новым возможностям HTML5. Теперь запросто можно отправить JSON объект, например, в открытый iframe на другом домене. Это стало возможным благодаря window.postMessage. Узнать больше »

wordpress: get_the_content() с форматированием

Если вы пользовались функцией get_the_content(), то замечали, что она возвращает данные в не форматированном виде. Функция the_content() же возвращает форматированные данные.
<?php echo get_the_content(); ?>
<?php the_content(); ?>

Для того, что бы функция get_the_content() возвращала форматированные данные, к ней необходимо применить фильтр the_content. Для этого напишем свою функцию get_formatting_content() и поместим ее в файл "functions.php".
function get_formatting_content ($more_link_text = '(more...)', $stripteaser = 0, $more_file = '') {
	$content = get_the_content($more_link_text, $stripteaser, $more_file);
	$content = apply_filters('the_content', $content);
	$content = str_replace(']]>', ']]&gt;', $content);
	return $content;
}

Пишем плагин-виджет для WordPress и публикуем в репозитории

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

Создание виджета ничем не отличается от написания плагина для Wordpress, которую я писал в предыдущей статье. Но в этот раз, я хотел бы рассказать не только о том, как написать свой виджет, но о том, как добавить плагин в репозиторий Wordpress. Узнать больше »

Лови moment.js или удобная библиотека для работы со временем на JavaScript

Работа с датой в javascript для разработчиков в том виде, в котором она реализована, порой предоставляется не совсем удобной. Для того, что бы отформатировать дату в нужном формате приходится использовать множество функций объекта Date. Например, куда проще с этим делом обстоит в языке PHP в котором с помощью функции date можно форматировать дату в нужный формат. В JavaScript же нам понадобиться использовать методы объекта, например, getFullYeargetHours или им подобные, да и еще проверять что бы у числа были впереди идущие нули.

Все это порождает огромное количество кода с разными проверками. Чтобы этого избежать хочу порекомендовать вам одну из удобных (на мой взгляд) библиотек для работы со временем на JavaScript. Это - moment.js.

Данная библиотека предоставляет не только удобные функции для форматирования даты, но и различные возможности для операций над временем и главное - ее можно использовать вместе с node.js, что позволит вам сократить время разработки ваших приложений. Кроме того, библиотека имеет множественную локализацию включая русскую. Скачать последнюю версию библиотеки вы всегда сможете на GitHub. Дальше рассмотрим несколько основных возможностей библиотеки. Узнать больше »
Страница 1 из 41234