some image

Работа

zend framework 2 (zf2) — Url Helper для Wildcard маршрута

Метки: , Работа

Есть маршрут:

'application' => array(
	'type' => 'segment',
	'options' => array(
		'route'    => '/application[/:controller][/:action]',
		'defaults' => array(
			'__NAMESPACE__' => 'Application\Controller',
			'controller'    => 'Index',
			'action'        => 'index',
		),  
	),
	'may_terminate' => true,
	'child_routes' => array(
			'default' => array(
					'type'    => 'Wildcard',
					'options' => array(
					),
			),
	),
),  

URL helper для него выглядит следующим образом (обратите внимание на application/default):

$this->url('application/default', array('controller' => 'advert', 'action' => 'index', 'phone' => $row->data['phone'] ) );

zend framework 2 (zf2) — маршрут с неограниченным числом параметров

Работа

При переходе на ZF2 с первого, столкнулся с проблемой что параметры теперь нужно хардкодить прямо в маршруте, во всех уроках так сделано и все довольны. Я же привык, еще с первой версии, что могу использовать ЧПУ вообще не меняя маршрутизацию, добавлять сколько угодно новых параметров.

Вот маршрут для обеспечения такой же функциональности в ZF2, используем тип WildCard:

'application' => array(
	'type' => 'segment',
	'options' => array(
		'route'    => '/application[/:controller][/:action]',
		'defaults' => array(
			'__NAMESPACE__' => 'Application\Controller',
			'controller'    => 'Index',
			'action'        => 'index',
		),  
	),
	'may_terminate' => true,
	'child_routes' => array(
			'default' => array(
					'type'    => 'Wildcard',
					'options' => array(
					),
			),
	),
), 

После этого легко будут обрабатываться ссылки вида /aplication/user/add/param1/value1/param2/value2.

php preg_match длинные строки

Метки: Работа

Если при работе с длинной строкой регулярное выражение возвращает false вместо результата — добавьте

ini_set('pcre.backtrack_limit', '5000000');

simple_html_dom утечка памяти

Метки: , , Работа

Если при работе с simple_html_dom вы получаете следующую ошибку: Fatal error: Allowed memory size of bytes exhausted, значит, скорее всего, вы забыли после работы с отдельной страницей выполнить $html->clear();

Пример:

$html = file_get_html($url);
foreach($html->find('div[class=posts]') as $element){
    foreach($element->find('img') as $el){
      // do smth
    }
}
$html->clear();
unset($html);

jQuery ready bug в Internet Explorer 9

Работа

Возможно вы пришли сюда, т.к. ready событие в вашем jQuery запускается раньше полной загрузки станицы, раньше построения DOM дерева.
Так вот хочу поделиться очень странным и несвойственным для jQuery багом:

http://bugs.jquery.com/ticket/12282

Суть в том, что в jQuery 1.8.0 нельзя пользоваться ready событием, вообще. Т.к. в IE9 оно срабатывает как попало. Вы можете не обнаружить элементы в DOM (как это было в моем случае), код может не прогрузиться. Это очень опасно и ведет к совершенно неисправимым багам.

Решение — срочно обновить jQuery с сайта, т.к. баг там уже поправили.

MSSQL, TSQL, динамический SQL, динамическое формирование запросов

Метки: , , Работа

Задача: в stored procedure динамически формировать SQL для получения данных. Динамическими должны быть все части: названия таблиц, количество условий, названия колонок. В идеале нужно просто составлять строку, а потом выполнять запрос из нее, при этом вообще хорошо, если удастся обеспечить параметризацию.

Решение: использование sp_executesql
Сразу на примере, ситуация.

Пусть у нас есть несколько сущностей в системе. Есть пользователи, есть записи в блоге, есть статьи.
Все они хранятся в трех разных таблицах account, blog_post, content_page (primary keys: account_id, blog_post_id, content_page_id).
В каждой из этих таблиц есть, соответственно, поля acc_created, bp_created, cp_created. И представьте теперь, что в одной из sp нам необходимо за заданному id и типу сущности получить creation date. Можно написать 3 запроса — легко, ну а если сущностей, скажем, 50? Тогда простое решение становится уж очень некрасивым.

На помощь приходит динамический sql.
Attention. Я знаю про перфоманс и про все остальное, я знаю что 50 отдельных запросов будут быстрее. Речь не об этом, а о ситуации, когда принято решение, что делать нужно так.

set @sql =     N'select @created =  ' + @pspAbbrev + '_created from ' + @pspFull + ' where ' + @pspFull + '_ID = @id;';

set @params =  N'@id     integer, ' +
	       N'@created   datetime OUTPUT';
			   
exec sp_executesql @sql, @params, @id = @id, @created = @created OUTPUT

Прежде всего, нам необходимо определить @pspAbbrev (например, ‘usr’) и @pspFull(например, ‘user’).
После чего сформировать @sql, определить input-output параметры, вызвать sp_executesql и далее пользоваться полученным значением из переменной @created.

Сортировка dropdown(select) списка на jQuery

Метки: , Работа

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

        //Sorting by text value asc
        jQuery('.class').each( function(){
            jQuery(this).html( jQuery(this).find('option').sort(function(a, b) {
                return a.text == b.text ? 0 : a.text < b.text ? -1 : 1
         }) );
        });

Я люблю javascript

Метки: Работа

Уже не раз писал заметки о JS, но еще ни разу не говорил о своем отношении к нему. Так вот, я считаю, что если продолжительное время писать на нем и использовать как основной язык — прежним ты уже не станешь. Я действительно считаю, что этот язык не просто плох, а очень плох. Потому что я не знаю второго такого языка, который бы позволял накидать столько логических ошибок на 1 строчку кода. Такого количества неявных вещей, упрощений и тп нет ни в одном другом языке. И меня бы мало это волновало, если бы это был какой-нибудь Lisp или Haskell. Но это язык, на котором приходится писать половину кода браузерного приложения, существующую на стороне клиента.

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

Я хочу рассказать в этой заметке о самом жестоком виде логических ошибок, который мне приходилось встречать. Это перемешивание глобальных и локальных переменных. А все идет корнями в дебильный синтаксис javascript. Почему если я пишу

function alertURL(){
 alert(url);
}

я не могу предугадать то что получу? Почему это вообще никаким образом не зависит от меня? Это зависит от того до jQuery я вызвал мою функцию или после, от того какие вообще пакеты я включал в head, от того какой сегодня день, как зовут маму Брендана Айка, но только не от меня.

Правильно! Потому что я не добавил волшебное слово var! Этот целебный эликсир  предотвращающий ошибки, которые вообще не поддаются отладке. А теперь вопрос: накой черт дергать все из глобальной области видимости? Как часто вам внутри функции нужны глобальные переменные? Что, действительно чаще, чем локальные? Почему Zend догадались сделать слово global, a в JS его нет?

Так вот представьте. Мне дают 2 библиотеки, большущие библиотеки в несколько тысяч строк кода каждая, где нет не одного слова var, нет какого-то подобия namespaces, вообще ничего, отделяющего область видимости, нет. Ну не думал тот программист, который писал каждую из них, что их понадобится использовать вместе, а может он вообще не знал что такое var, лабал да лабал себе потихоньку. И они начинают падать, неистово падать из-за смешения глобальных переменных. Само даже допущение такой ситуации — это ошибка в дизайне языка.

Казалось бы — ну введите вы namespaces, и все, и нет проблем, хотя бы на уровне смешения пакетов. Чтоб я мог написать просто в начале каждого пакета ‘use namespace popa’ и все, и решить все проблемы. Но нет, все в очередной раз пользуются гипер костылем, эмулирующим namespaces в js.

И nobody cares, все лабают быдлокод не поддающийся пониманию, и все счастливы.

Не писал две недели :)

Работа

Все это время упорно работал с http://arshaw.com/fullcalendar/

Интегрирую в проект наших клиентов http://usovolunteer.org, немного грустно, что помогаю армии США если честно. Вот музеям, библиотекам и национальным паркам — это всегда пожалуйста. А армейцам чужой страны… не по себе как-то. Ну что поделать, задачи не выбирают, делаю старательно, как своим:)

Если в кратце про fullCalendar, то это самый зрелый и полнофункциональный на сегодняшний день jQuery календарь. Drag and drop эвентов, аякс загрузка-подгрузка всгео чего только можно, поддержка всяких кастомных фишек ( у меня все управление календарем настраиваемое и рендерится через контролы Smarty ), экспорт в гугл календарь, наконец просто огромное количество решенных проблем в гугле по всем возможным запросам. Просто маст хэв всем проектам с каким-либо сложным расписанием, сложно представить сколько бы я писал все что мне понадобилось с нуля.

Вообщем доволен, работать приятно с ним, следующая стадия разработки продлится до конца января по плану.

Параллельно читаю ‘PHP: Objects, Patterns, and Practice‘, книжки по проектированию не читал курса со второго если честно, все как-то больше статейками урывал. А здесь еще и последнее издание с описанием фишек последних в PHP. Честно не знал про позднее статическое связывание, а как раз пришлось в классе-родителе создать экземпляр класса-наследника при реализации server-side календаря. Очень кстати было.

Как дочитаю — будет ревью.

SQL optimization. Join против In и Exists. Что использовать?

Метки: , Работа

«Раньше было проще» — Подумал я, садясь за оптимизацию очередного запроса в SQL management studio. Когда я писал под MySQL, реально все было проще — или работает, или нет. Или тормозит или нет. Explain решал все мои проблемы, больше ничего не требовалось. Сейчас у меня есть мощная среда разработки, отладки и оптимизации запросов и процедур/функций, и все это нагромождение создает по-моему только больше проблем. А все почему? Потому что встроенный оптимизатор запросов — зло. Read More