Показаны сообщения с ярлыком Frameworks. Показать все сообщения
Показаны сообщения с ярлыком Frameworks. Показать все сообщения

среда, 3 сентября 2014 г.

Сodeigniter нашёл нового хозяина

Практически год прошёл с момента, когда EllisLab объявили о своих намерениях о прекращении поддержки CodeIgniter как отдельного продукта и старте поиска новых хозяев для проекта. Этого шага многие ожидали, ExpressionEngine выродился в самостоятельную единицу и уже больше не пересекался с CodeIgniter и поддержка двух движков для EllisLab не имела никакого экономического обоснования.
И вот недавно в официальном твитере, проскочила интригующая реплика, о том что нашли новый дом для 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'] = '&laquo; First';
$config['first_tag_open'] = '<li class="prev page">';
$config['first_tag_close'] = '</li>';

$config['last_link'] = 'Last &raquo;';
$config['last_tag_open'] = '<li class="next page">';
$config['last_tag_close'] = '</li>';

$config['next_link'] = 'Next &rarr;';
$config['next_tag_open'] = '<li class="next page">';
$config['next_tag_close'] = '</li>';

$config['prev_link'] = '&larr; 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.

вторник, 11 мая 2010 г.

Странное поведение query builder-а Kohana

Не перестаю удивляться всяким мелочам и неприятностям из Kohana PHP 5 Framework. Я сравнительно недавно на него перешёл, до того использовал в основном CodeIgniter. Как известно, Кохана зародилась как форк от CodeIgniter, из-за недостаточно быстрого развития и исправления ошибок в CI. Вокруг Kohana образовалось своё новое, мощное, комьюнити, которое все время единогласно твердит что наш framework лучше чем CI, меньше ошибок, более оптимизированный, быстрый… но не так это всё, на практике, увы.
Я всё больше и больше разочаровываюсь в их документации, в отсутствии обратной совместимости от версии к версии в большинстве модулей. Это из того, что я уже могу с уверенностью сказать, после полутора месяцев её использования. Думаю, что ситуация исправится в ближайшее время в лучшую сторону, но главное чтобы у этого фреймворка были свои сторонники и не разбегались уже приобретённые.
Яркий пример, который я только что поймал, на ровном месте – это использование метода update() из query builder. Использовал такую вот нехитрую конструкцию:

$db->update("news", Array('status'=>0));

Куда уже проще запрос?! – Необходимо поставить всем элементам таблицы News статус равный 0. Но Кохана завалилась, с ошибкой:

> ttm/system/libraries/drivers/Database/Mysql.php [392]:
There was an SQL error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 - UPDATE `news` SET `status` = 0 WHERE


Понятное дело, но зачем where сюда приплели, если даже нет условия? Мне нужно сделать Update для всех элементов таблицы.
Решение тут, конечно, простое – использовать условие-пустышку, но неприятный осадок всё-таки остался:

$db->where('status', 1)->update("news", $data);

Я использую не самую свежую версию KOHANA_VERSION = 2.3.2, но не думаю что ситуация сильно поменялась в следующих. Боюсь обновляться, чтобы проект не завалился где-то в другом месте на финишной стадии разработки =)

пятница, 22 января 2010 г.

Новый jQuery 1.4 + обновлённый jQuery CheatSheet

Не так давно вышла оновлённая библиотека jQuery 1.4, краткий список новшеств приведу ниже.

  • метод live полностью переделали, теперь он поддерживает во всех браузерах такие события, как: submit, change, mouseenter, mouseleave, focus, blur.
  • подкорректировано поведение метода add.
  • сильно увеличена производительность функций для работы с Document object model (в частности append, prepend).
  • стали быстрее работать функции find, empty, remove, addClass, removeClass, hasClass, attr и css.
  • добавлена jQuery.noop() - функция, которая ничего не делает.
  • новая вспомогательная функция jQuery.contains(container, contained), позволяющая проверить существование элемента DOM внутри другого элемента DOM.
  • добавлен весьма полезный метод .delay(duration, [queueName]), которые позволяет установить таймер задержки выполнения следующего пункта очереди.
  • и много других приятных дополнений, о которых можно почитать на официальном сайте jQuery.

Кстати, если нужно, вот ссылка на обновлённую шпаргалку по API jQuery 1.4 (cheetsheet)

воскресенье, 14 декабря 2008 г.

Kohana – быстро развивающийся PHP framework

В этой статье хочу рассказать вам об одном быстро развивающемся PHP framework-е. Так уж сложилось, что среди всех знакомых мне фреймворков, больше всего симпатизирует CodeIgniter (CI). На нём я пишу основную массу проектов, он лаконичный и очень лёгкий.

Один мой приятель, в процессе обсуждения инструментариев разработки на PHP скинул мне ссылку, чтобы я почитал про новый движок, довольно быстро развивающийся за счёт своего комьюнити. Открыв ссылку http://kohanaphp.com/, увидел Kohana – The Swift PHP Framework. Ещё больше меня заинтересовал этот движок после прочтения надписи, что он основан на CodeIgniter.

Итак, что же это за зверь, Kohana? Первое что пришло на ум – это разработка наших программистов, уж больно похоже название на одноимённое слово славянского происхождения. Оказалось что нет. Название Kohana было выбрано, когда разработчики начали просматривать словари коренных американцев для того, чтобы выбрать слово, не нарушающее авторские права. Kohana на языке Сиу значит 'быстрый'. Также на японском языке имеет значение 'маленький цветок', а на украинском 'быть любимой' и имя известной косатки (Kohana) – все эти значения не имеют отношения к названию. А изначально Kohana был создан как ветвь PHP фрэймворка CodeIgniter под именем Blue Flame. Главной причиной форка был переход к более открытой для общественности модели разработки, потому, что многие пользователи были недовольны скоростью разработки и исправления ошибок в CodeIgniter. В Июле 2007, Blue Flame был переименован в Kohana для того, чтобы избежать проблем с авторскими правами в будущем.

К особенностям данного PHP5 веб-фреймворка можно отнести:

  • высокие стандарты безопасности;
  • экстремальную легкость;
  • прост понимания и освоения;
  • использование MVC концепции;
  • интернационализация (есть полная поддержка UTF-8);
  • лёгкость расширения и масштабируемость.

Конечно, в своём большинстве эти особенности можно отнести и к CodeIgniter, но в Kohana всё было координально переработано, и местами даже их нельзя так напрямую сравнивать, это уже совершенно разные движки.

Основными системными требованиями для Kohana PHP framework являются:

  • сервер с поддержкой Unicode;
  • PHP версия >= 5.2.0;
  • сервер HTTP, работает на Apache 1.3+, Apache 2.0+, lighttpd, и MS IIS;
  • сервер базы данных (можно подключать различные драйвера, но сейчас встроены MySQL и PostgreSQL);
  • расширения PCRE, iconv, mcrypt, SPL могут потребоваться отдельным функциям ядра;
  • настоятельно рекомендуется поддержка mbstring, которая значительно ускоряет работу Kohana с UTF-8.

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

Рекоммендую

Попробуйте надёжный хостинг от Scala Hosting