Рубрика «yii» - 23

Вышел PHP-фреймворк Yii 1.1.15, исправляющий проблему безопасности, найденную в 1.1.14. Более ранние версии не затронуты. Если вы используете его, следует обновиться. 1.1.15 полностью совместим с 1.1.14.

Уязвимость затрагивает `CDetailView`. Если ваше приложение берёт значение `value` от пользователя, то атакующий имеет возможность выполнить произвольный PHP скрипт на вашем сервере. Мы не раскрываем подробностей сразу чтобы дать время обновиться. По нашим данным детали пока известны только основной команде разработчиков фреймворка.

Уязвимости присвоен номер CVE-2014-4672.

Забрать дистрибутив можно, как обычно, Читать полностью »

Долгожданный релиз Yii 2.0 Beta дал стимул многим разработчикам, использующих Yii, к переходу на вторую версию фреймворка. Разработчики фреймворка указали, что постараются не трогать обратную совместимость и в основном будут сосредоточены над исправлением ошибок и заканчивать документацию. Это дает еще больший импульс к использованию Yii2 в реальных проектах.

Мы решили не отставать от новшеств и выбрали именно вторую версию замечательного фреймворка Yii. При разработке проекта возникла необходимость в организации мультиязычности на сайте.
Читать полностью »

Yii framework имеет такую хорошую штуку как компонента. Компоненты в yii позволяют получить доступ к определенным библиотекам/классам в любом месте приложения. Для того, чтобы обратиться к какой-то компоненте нужно написать: Yii::app()->componentName.
Читать полностью »

Постановка проблемы

Необходимо определить знание об адресе контроллера в одном слое системы. Это позволит быстро осуществлять поиск и безболезненно производить рефакторинг контроллеров и их адресов.

Реализовать проверку достаточности параметров для построения адреса. Это необходимо если параметры для адреса задаются в другом слое системы, например в представлении или клиентском скрипте.

Решение

Все адреса должны быть определены в контроллерах. При необходимости недостающие параметры можно заполнить в слое представления или клиентского скрипта.

Для удобной работы можно определить помощника — построитель адресов.

Исходный код построителя адреса

use CUrlManager;

class UrlBuilder {
    const PARAMETER_NAME_HASH = '#';

    /** @var CUrlManager */
    private $urlManager;
    /** @var string */
    private $route;
    /** @var array */
    private $params = array();
    /** @var array */
    private $required = array();

    public static function className() {
        return get_called_class();
    }

    /**
     * @param CUrlManager $urlManager
     */
    public function __construct(CUrlManager $urlManager) {
        $this->urlManager = $urlManager;
    }

    /**
     * @return CUrlManager
     */
    public function getUrlManager() {
        return $this->urlManager;
    }

    /**
     * @return string
     */
    public function getRoute() {
        return $this->route;
    }

    /**
     * @param string $route
     * @return $this
     */
    public function setRoute($route) {
        $this->route = $route;
        return $this;
    }

    /**
     * @return array
     */
    public function getParams() {
        return $this->params;
    }

    /**
     * @param array $params
     * @return $this
     */
    public function setParams($params) {
        $this->params = $params;
        return $this;
    }

    /**
     * @param string $name
     * @return mixed
     * @throws Exception
     */
    public function getParam($name) {
        if (!array_key_exists($name, $this->params)) {
            throw new Exception(sprintf('This param `%s` not exists'));
        }
        return $this->params[$name];
    }

    /**
     * @param string $name
     * @param mixed $value
     * @return $this
     */
    public function setParam($name, $value) {
        $this->params[$name] = $value;
        return $this;
    }

    /**
     * @return string
     * @throws Exception
     */
    public function getHash() {
        return $this->getParam(self::PARAMETER_NAME_HASH);
    }

    /**
     * @param string $value
     * @return $this
     */
    public function setHash($value) {
        $this->setParam(self::PARAMETER_NAME_HASH, $value);
        return $this;
    }

    /**
     * @return array
     */
    public function getRequired() {
        return $this->required;
    }

    /**
     * @param array $required
     * @return $this
     */
    public function setRequired($required) {
        $this->required = $required;
        return $this;
    }

    /**
     * @throws Exception
     * @return string
     */
    public function getUrl() {
        if ($this->hasRequiredParams()) {
            throw new Exception(sprintf('Required params `%s` not exists', implode(', ', $this->requiredParams())));
        }
        return $this->getUrlManager()->createUrl($this->route, $this->params);
    }

    /**
     * @return array
     */
    public function toArray() {
        return array(
            'route' => $this->route,
            'params' => $this->params,
            'required' => $this->required,
        );
    }

    /**
     * @return UrlBuilder
     */
    public function copy() {
        return clone $this;
    }

    protected function hasRequiredParams() {
        return (boolean)$this->requiredParams();
    }

    protected function requiredParams() {
        return array_diff($this->required, array_keys(array_filter($this->params)));
    }
}

Примеры использования

Определение знания об адресе в контроллере

Базовый абстрактный контроллер. Реализация метода создания обектов построителя адреса

class BaseController extends CController {

    public function createUrlBuilder($route, $params = array()) {
        $urlBuilder = new UrlBuilder($this->getUrlManager());
        $urlBuilder
            ->setRoute($route)
            ->setParams($params);
        return $urlBuilder;
    }

    public function getUrlManager() {
        $urlManager = $this->getApp()->getUrlManager();
        return $urlManager;
    }

    public function getApp() {
        return Yii::app();
    }
}

Читать полностью »

в 20:25, , рубрики: active record, yii, yii2, метки: ,

Yii2. Связи Active Record Yii2 еще только в бета-тестировани но видимо это никого не пугает. Многие начали использовать его даже в продакшене и под дулом пистолета, отказываются даже смотреть на код первой версии. Кто-то просто изучает новые возможности.

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

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

Я решил написать свой рецепт, возможно вы посчитаете его полезным, возможно поймете как делать не надо. В любом случае надеюсь материал будет полезен.
Читать полностью »

Доброго времени суток, дорогие читатели!

Хочу рассказать вам об интересной задаче, которая стала передо мной в рамках проекта и, естественно, о ее решении.

Исходные данные:
Стандартный набор LAMP (далее СС),
Yii framework (версия здесь не важна),
удаленный сервер (далее УС), на котором установлен демон Sphinx, searchd.
На УС создан пользователь с правами рута (но не сам рут).
На СС установлен модуль ssh2_mod для PHP.

Сразу оговорюсь, в этой статье я не буду расписывать особенности Sphinx, кому интересно, могут почитать официальный мануал sphinxsearch.com/docs/current.html.
Ограничусь только общей информацией.

Итак, Sphinx — поисковый демон, в моем случае работает с MySQL. Основная особенность — он индексирует базу по определенным запросам (описанным в конфиге сфинкса), и результат выборки сохраняет в свои файлы. Чтобы информация была актуальной (в MySQL возможно и добавление и редактирование записей), нужно запускать индексацию сфинкса. Тогда, он сделает повторную выборку и сохранит ее себе.

Задача:
Запускать индексацию сфинкса на УС.
Причина именно удаленного запуска состоит в том, что необходимо запускать команды по крону с конкретными параметрами, определяемыми в коде. Кроны запускаются с СС.
Т.е. на сервере запускается крон, метод которого выполняет индексацию на УС.
Читать полностью »

Разрабатываю проект на yii2, попутно изучая фреймворк, и не смог не поделиться одним из замечательных инструментов, который он представляет. Пост будет полезен тем, кто до этого с Pjax не работал. Опытным разработчикам, которые уделят посту время, буду благодарен за указание на неточности и дополнения, так пост станет полезнее и информативнее.Читать полностью »

DevConf::PHP 2014 — уже на следующей неделе. PHPNG, Laravel, Yii, Асинхронный PHP — будь в курсе новинок разработки14 июня (суббота) 2014 — пройдет крупнейшая конференция по PHP, Python, Ruby, JavaScript, Android
62 доклада от авторов языков, баз данных и экспертов в WEB-разработке!

Впервые в России нам удалось собрать авторов MySQL, PostgreSQL, Percona Server, Sphinx, Tarantool в отдельном потоке DevConf::Storage — по сути это отдельная конференция по современным БД.

Поток PHP насыщен актуальными темами, который обязан знать каждый WEB-разработчик

  • PHPNG — новый движок для старого php
  • Laravel — Shawn McCool, Laravel core developer — самый «модный» фреймворк года!
  • Yii 2.0, обзор — что творится в мире PHP: тренды, инструменты и фреймворки
  • Архитектура AVITO.ru — самый крупная база объявлений, поглотившая конкурентов
  • Codeception — тестируем с человеческим лицом
  • Pinboard + pinba. Как организовать мониторинг сотни проектов
  • PHPCI: Система непрерывной интеграции для PHP-проектов
  • Асинхронный PHP — миф? Реальность!
  • MySQL + HandlerSocket = NoSQL

Читать полностью »

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

В нашем случае этим фреймворком является Yii, а одной из самых популярных проблем была одновременная разработка web-сервиса для приложений iOS/Android.

Сначала, как и всегда, просто разработчики договаривались между собой что и как, но если разработчик вдруг менялся — начинались проблемы. Далее — описание входных/выходных данных в wiki. При большом количестве мелких изменений возникала проблема синхронизации кода и форматов, описанных в wiki.

Как мы решили проблему — ниже.
Читать полностью »

В данной статье я бы хотел поделиться своим опытом организации перехода от классической 2-х звенки к парадигме SOA, также затронуть некоторые аспекты деплоя в рамках enterprise-решения и интеграции со смежными службами написанными на Java

Предистория

Последние 3 года я работал в отделе внутренней автоматизации компании Новотелеком. Основное развитие систем для автоматизации внутренних процессов смежных с IT подразделений началось в 2008 году вместе с активным ростом самой кампании. В то время руководство не ставила целей делать качественные решения, основной целью было завоевание рынка, и это отложило отпечаток на принимаемые решения. Основной из систем над которыми работает отдел ВА — это внутренняя CRM система, которая включает в себя также элементы планирования человеческих ресурсов и справочные системы. Долгое время система писалась на самописном фреймворке, но после знакомства с Yii и реализации сайта компании на нем, было принято решение перевода системы на данный фреймворк. Обсуждения почему был выбран именно этот фреймворк выходят за рамки моей статьи.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js