Подборка публикаций по web-программированию, PHP, JavaScript, CSS, HTML, серверные вещи, браузеры, информационные технологии, и немного компьютерного юмора.
пятница, 17 октября 2014 г.
среда, 3 сентября 2014 г.
Сodeigniter нашёл нового хозяина
И вот недавно в официальном твитере, проскочила интригующая реплика, о том что нашли новый дом для CI:
Whew! Lengthy search and process is winding down. @codeigniter has a new home. Details will follow soon.Интрига держится до сих пор, других официальных сообщений со стороны EllisLab пока не поступало. Очень интересно, кто же, всё-таки, будет новым хозяином столь популярного фреймворка!
___
Update: проект был передан British Columbia Institute of Technology
пятница, 19 октября 2012 г.
CodeIgniter: Affected Rows fix on DB insert/update batch functions
During last phase of the development on another CodeIgniter based project, I did import/export functionality, and used Active Record’s insert/update batch functions.
I figured out, that CodeIgniter’s core with CI_VERSION=2.1.2 doesn’t allow you to calculate the number of affected rows on batch functions. That’s the function to get the affected rows doesn’t work when using the batch insert or update functions. More details posted in the issue https://github.com/EllisLab/CodeIgniter/issues/126, it was opened a year ago, though in the open state still.
I decided to fix that myself, patched the native CI’s Active Record Class. From now the batch functions could return the number of affected rows instead of only TRUE. If everything worked but no records were affected the function would return 0. When there's an error in the parameters passed it will return FALSE, so no confusion here.
Here are the methods I patched, so you could freely use them or just send that to CI’s devs to fix that issue in the newer versions of the framework:
/**
* Insert_Batch
*
* Compiles batch insert strings and runs the queries
* (affected rows fix by WebAurum (http://webaurum.blogspot.com),
* for more information see issue https://github.com/EllisLab/CodeIgniter/issues/126 )
*
* @param string the table to retrieve the results from
* @param array an associative array of insert values
* @return object
*/
public function insert_batch($table = '', $set = NULL)
{
if ( ! is_null($set))
{
$this->set_insert_batch($set);
}
if (count($this->ar_set) == 0)
{
if ($this->db_debug)
{
//No valid data array. Folds in cases where keys and values did not match up
return $this->display_error('db_must_use_set');
}
return FALSE;
}
if ($table == '')
{
if ( ! isset($this->ar_from[0]))
{
if ($this->db_debug)
{
return $this->display_error('db_must_set_table');
}
return FALSE;
}
$table = $this->ar_from[0];
}
$affected_rows = 0;
// Batch this baby
for ($i = 0, $total = count($this->ar_set); $i < $total; $i = $i + 100)
{
$sql = $this->_insert_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_keys, array_slice($this->ar_set, $i, 100));
//echo $sql;
$this->query($sql);
$affected_rows += $this->affected_rows();
}
$this->_reset_write();
return $affected_rows;
}
/**
* Update_Batch
*
* Compiles an update string and runs the query
* (affected rows fix by WebAurum (http://webaurum.blogspot.com),
* for more information see issue https://github.com/EllisLab/CodeIgniter/issues/126 )
*
* @param string the table to retrieve the results from
* @param array an associative array of update values
* @param string the where key
* @return object
*/
public function update_batch($table = '', $set = NULL, $index = NULL)
{
// Combine any cached components with the current statements
$this->_merge_cache();
if (is_null($index))
{
if ($this->db_debug)
{
return $this->display_error('db_must_use_index');
}
return FALSE;
}
if ( ! is_null($set))
{
$this->set_update_batch($set, $index);
}
if (count($this->ar_set) == 0)
{
if ($this->db_debug)
{
return $this->display_error('db_must_use_set');
}
return FALSE;
}
if ($table == '')
{
if ( ! isset($this->ar_from[0]))
{
if ($this->db_debug)
{
return $this->display_error('db_must_set_table');
}
return FALSE;
}
$table = $this->ar_from[0];
}
$affected_rows = 0;
// Batch this baby
for ($i = 0, $total = count($this->ar_set); $i < $total; $i = $i + 100)
{
$sql = $this->_update_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->ar_set, $i, 100), $this->_protect_identifiers($index), $this->ar_where);
$this->query($sql);
$affected_rows += $this->affected_rows();
}
$this->_reset_write();
return $affected_rows;
}
суббота, 29 сентября 2012 г.
Codeigniter Bootstrap Pagination
Twitter Bootstrap стал безумно популярным фронт-энд фреймворком. Всё чаще и чаще слышу от клиентов, хочу «бутстрэп» (хотя они до конца сами не понимают что это), это больше дань моде, ну это такое. В этой статье хочу рассказать, как адаптировать стандартый pagination класс CodeIgniter-а под новомодный Bootstrap style.
Я находил много решений, вплоть до кастомного MY_Pagination класса для стилизации Bootstrap под CI, каждый ухитряется, как может. Но, я полагаю, это не лучший выход. Вы лишаетесь гибкости, перекрывая нативный класс пагинации кодигнайтера, если выходит новая версия CodeIgniter обновился класс Pagination, то прийдётся заново его адаптировать и искать что изменилось.
Гораздо более удобный способ, это через конфигурацию самого Pagination навесить все необходимые стили и изменить только «обвёртку» для стандартных элементов интерфейса. Сделать это легко. Создаём в папке application/config/ файл с именем pagination.php. В этот файл дописываем следующий конфиг для Pagination Class:
/* twitter bootstrap overrides */
$config['full_tag_open'] = '<div class="pagination pagination-centered"><ul>';
$config['full_tag_close'] = '</ul></div><!--/pagination-->';
$config['first_link'] = '« First';
$config['first_tag_open'] = '<li class="prev page">';
$config['first_tag_close'] = '</li>';
$config['last_link'] = 'Last »';
$config['last_tag_open'] = '<li class="next page">';
$config['last_tag_close'] = '</li>';
$config['next_link'] = 'Next →';
$config['next_tag_open'] = '<li class="next page">';
$config['next_tag_close'] = '</li>';
$config['prev_link'] = '← Previous';
$config['prev_tag_open'] = '<li class="prev page">';
$config['prev_tag_close'] = '</li>';
$config['cur_tag_open'] = '<li class="active"><a href="">';
$config['cur_tag_close'] = '</a></li>';
$config['num_tag_open'] = '<li class="page">';
$config['num_tag_close'] = '</li>';
/* END twitter bootstrap overrides */Ну и финальный штрих, это подгрузить наш конфигурационный файл в место, где происходит инициализация pagination в самом контроллере, например:
…
$this->config->load('pagination', TRUE);
$config = array_merge($this->config->item('pagination'), Array(
'base_url' => site_url('items/'),
'total_rows' => $total,
'per_page' => 10,
'uri_segment' => 2
));
$this->load->library('pagination');
$this->pagination->initialize($config);
…Всё, теперь в любом месте, где вы будете рендерить элементы для постраничной навигации, будет выводиться Codeigniter Bootstrap Pagination. Приведеный выше пример гарантированно рабочий и отлаженный, работает на версии CodeIgniter Framework 2.1.2 и Twitter Bootstrap Version 2.1.1.
понедельник, 9 июля 2012 г.
Задержка события ready и особенности работы jQuery.holdReady()
jQuery.holdReady() появился c версии v.1.6 и позволяет отложить выполнение события ready. Наиболее часто используется для того чтобы задержать событие ready, в случае динамической загрузки скриптов (или плагинов jQuery).
Простейший пример использования:
$.holdReady(true);
$.getScript("myplugin.js", function() {
$.holdReady(false);
});
Вроде как всё лаконично и можно использовать, но не тут-то было. У него есть одна неприятная особенность: jQuery.holdReady() не будет иметь никакого эффекта, если перед этим уже произошло ready event.
Что это означает на практике? – Если мы попытаемся сделать динамическую загрузку дополнительных JavaScript файлов, к примеру ajax-ом после того как страница уже была загружена, и хотели бы придержать использование методов и объектов JS-плагинов, до полной загрузки необходимых файлов, то holdReady() не отработает вообще.
Выходом из ситуации, когда нужно подождать пока не инициализируются все объекты, а использование jQuery.holdReady() уже невозможно после наступления ready event-а может быть:
1. использование callback вызовов после успешной ajax-загрузки и только тогда использовать сами загруженные объекты;
2. Сделать периодический опрос по таймеру (setTimeout), пока объявляемая функция или объект не станут доступными.
понедельник, 28 ноября 2011 г.
Which is correct: "bare" or "bear"?
Забавная переписка была недавно с англоговорящим клиентом. Из-за очередной задержки со стороны клиента, он мне приносил извинения и прозвучала фраза наподобие:
... We are finalizing a UI person and hence the delay. Please bare with us ...
Ситуация забавна тем, что в английском языке есть два созвучных слова, но они имеют совершенно разное значение. Такого рода путаница может вас запросто поставить в совершенно неловкую ситуацию.
Так вот, как же всё-таки правильно надо было написать "bare" или "bear"? У обоих слов совершенно разные значения:
1. у слова bare значение "неприкрытый", "голый";
2. а слово bear – переносить/перевозить, выдерживать нагрузку, терпеть.
Таким образом, оборот вида "Bear with me" будет означать "потерпите немного", в то время как "Bare with me" будет к кому-то просьбой раздеться :-)
Правильным примером употребления, в нашем случае, могло бы стать предложение вида:
Please bear with us while we remodel our store.
конечно, если вы не преследуете цель предложить клиенту полностью раздеться и смотреть как вы работаете.
воскресенье, 23 октября 2011 г.
MySQL Replace Substring with Another String
В последнее время, часто начали задавать вопрос, как заменить подстроку в строке в MySQL во всей таблице и напрочь отказываются посмотреть в мануал.
Для того чтобы найти часть оригинальной строки и заменить её другой подстрокой в SQL запросах в MySQL применяется функция REPLACE(). Простейший запрос на поиск и обновление записей во всей таблице примет вид:
UPDATE [table_name] SET [field_name] = REPLACE([field_name],'[string_to_find]','[string_to_replace]');
Например, если ваш блог на WordPress переместился в директорию на уровень ниже или на другой домен, то для замены/обновления permalinks в WordPress нужен простой MySQL запрос на update:
UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://www.oldsite.com/blog', 'http://newsite.com');
