четверг, 30 мая 2013 г.

php imagecolorat Всегда возвращает черный цвет

Если imagecolorat возвращает всегда 0, или какие то другие не корректные значения, надо вместо побитового сдвига использовать функцию imagecolorsforindex



Не правильно:

$imgObject = imagecreatefrompng('our.png');
$fillColor = imagecolorat($imgObject, 0, 0);

 $rgba = array(
    ($fillColor >> 16) & 0xFF,
    ($fillColor >> 8) & 0xFF,
     $fillColor & 0xFF,
    ($fillColor >> 24) & 0xFF
);




Правильно:

$imgObject = imagecreatefrompng('our.png');
$fillColor = imagecolorat($imgObject, 0, 0);
$colors = imagecolorsforindex($imgObject, $fillColor);

$rgba  = array(
   $colors['red'],
   $colors['green'],
   $colors['blue'],
    $colors['alpha']
);

среда, 29 мая 2013 г.

Установка ubuntu с флешки

Для установки убунты с флешки понадобится образ убунты, программа Universal-USB-Installer и флешка =) Можно вместо Universal USB Installer воспользоваться такой штукой как unetbootin, но я не пробовал.

После запуска выбираем файл образа, версию и букву диска, жмём Create и получаем флешку с убунтой, которую можно использовать как лайвсиди или для установки на компьютер.

З.Ы. Надо помнить, что перед установкой флешку надо форматировать в fat32, иначе ничего не получится.



Теперь надо перезагрузиться и выбрать в биосе загрузку с usb.

вторник, 28 мая 2013 г.

yii savewithrelated bug

Неожиданно для меня данное расширение отказалось правильно работать при сохранении новой модели со связью многие-ко-многим.

Это связно с тем, что в ESaveRelatedBehavior.php в строке 262
yii не может различить CManyManyRelation и CHasManyRelation

Я не придумал ничего лучше чем просто проверять primaryKey, не очень правильно, зато работает.

В protected/behaviors/ESaveRelatedBehavior.php стр. 262

} elseif ($relation instanceof CHasManyRelation) { // Handle has_many relations

Меняем на

} elseif ($relation instanceof CHasManyRelation && $this->owner->primaryKey) {


Готово.

понедельник, 27 мая 2013 г.

yii ajax загрузка файлов

Сначала надо подключить jquery.form.js

Затем в jquery.yiiactiveform.js

Меняем в функции $.fn.yiiactiveform.validate с 345 строки по 369

//$.ajax({
  $form.ajaxSubmit({
url : settings.validationUrl,
type : $form.attr('method'),
// data : $form.serialize() + extData,
        data : {ajax:$form.attr('id')},
dataType : 'json',
success : function (data) {
if (data !== null && typeof data === 'object') {
$.each(settings.attributes, function () {
if (!this.enableAjaxValidation) {
delete data[this.id];
}
});
successCallback($.extend({}, messages, data));
} else {
successCallback(messages);
}
},
error : function () {
if (errorCallback !== undefined) {
errorCallback();
}
}
});

И все работает. Теперь можно загружать файлы через аякс.

Решение нашел на форуме http://yiiframework.ru/forum/viewtopic.php?f=3&t=2521

суббота, 25 мая 2013 г.

apache Не видит папку или файл

Если апач не видит папку, посмотрите ее владельца, права и проверьте .htaccess внутри папки. Вполне возможно что внутри .htaccess перезаписывается какое ни будь значение, которое запрещено изменять. Для проверки просто временно очистите .htaccess, если папка появилась, то дело в нём.

Если апач не видит php файл, проверьте, что у него стоят права на исполнение и что отсутствуют права на запись у группы и остальных.

mysql Не сохраняет большие тексты

Максимальный размер поля типа text составляет 64 килобайта, если надо сохранить текст больше, выберите mediumtext или longtext.

среда, 22 мая 2013 г.

Установить facebook like button

Ддя того что бы поставить на сайт лайк фейсбука, надо зайти на страницу https://developers.facebook.com/docs/reference/plugins/like/
Воспользовавшись конфигуратором сгенерировать код кнопки и поставить его на страницу.

Например так:

После открывающего тега <body>


<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/ru_RU/all.js#xfbml=1";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>


Туда, где должна находится кнопка лайка

<div class="fb-like" data-send="true" data-width="450" data-show-faces="true"></div>


Но это еще не всё.
На момент написания поста фейсбук еще не поправил кодогенератор и кое-что придется подправлять ручками.

В

<div class="fb-like" data-send="true" data-width="450" data-show-faces="true"></div>

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

<div class="fb-like" href="http://badphpcoder.blogspot.ru" data-send="true" data-width="450" data-show-faces="true"></div>


Вот конечный код с генерацией ссылки для текущей страницы:

<div class="fb-like" href="http://<?php echo $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; ?>" data-send="false" data-layout="button_count" data-width="450" data-show-faces="false"></div>

Теперь кнопка работает.

php Эмуляция функции mail

При разработке сайтов под windows часто требуется проверить отправку почты. Придумано большое количество заглушек для этого, но на мой взгляд самым удобным способом является использование программки smtp4dev. Она проста и удобна. Если использовать standalone версию, то она будет состоять всего лишь из одного файла smtp4dev.exe. После запуска сворачивается в трей и спокойно ждет, пока какой ни будь скрипт не использует функцию mail.

Скачать можно здесь.

Создание .htaccess windows

Напрямую через проводник создать .htaccess в windows не получится, для этого надо

1. Создать текстовый файл,
2. Открыть его в блокноте,
3. Файл -> Сохранить как
4. Выбрать тип файла "Все файлы (*.*)"
5 Сохранить с именем ".htaccess"

Готово.

Установка yii

Предполагается, что апач уже настроен и поднят, а по запросу http://localhost у вас открывается страница приветствия, к примеру C:\web\localhost

1. Скачаем самую свежую версию с офф сайта http://www.yiiframework.com/download
(это будет что то вроде yii-1.1.13.e9e4a0.tar.gz)

Тем, кто умеет пользоваться git или svn эта статья не понадобится =)



2. Создадим папку C:\web\localhost\yii_project



3. Разархивируем и скопируем подпапку framework из архива в C:\web\localhost\yii_project\framework



4. Открываем cmd и переходим в C:\web\localhost\yii_project\framework

cd C:\web\localhost\yii_project\framework



5. Создаем новый web проект под название mysite

yiic webapp C:\web\localhost\yii_project\mysite

Yii Спросит, создавать приложение, отвечайте "да":


Create a Web application under 'C:\web\yii_project\mysite'? (yes|no) [no]: yes

Теперь у нас есть сайт, который открывается по адресу http://localhost/yii_project/mysite


Далее пойдут необязательные пункты, которые хоть и не нужны для того, что бы просто установить yii, но обычно всегда выполняются.



6. Настройка yii на mysql


Изначально yii настроен на sqlite, ничего плохого в этом не вижу, но я привык работать с mysql.

В файле mysite\protected\config\main.php комментируем строки

/*

'db'=>array(
'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
),


*/


И раскомментируем

'db'=>array(
  'connectionString' => 'mysql:host=localhost;dbname=testdrive',
  'emulatePrepare' => true,
  'username' => 'root',
  'password' => '',
  'charset' => 'utf8',
),


Где
testdrive  - это имя вашей локальной базы данных
username - логин доступа к базе
password - пароль доступа к базе



7. Включение чпу

Всё в том же mysite\protected\config\main.php раскомментируем строчки

'urlManager'=>array(
  'urlFormat'=>'path',
  'rules'=>array(
    '<controller:\w+>/<id:\d+>'=>'<controller>/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
    '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
  ),
),


И вставим строку 'showScriptName' => false,
Получится

'urlManager'=>array(
  'urlFormat'=>'path',
  'showScriptName' => false,
  'rules'=>array(
    '<controller:\w+>/<id:\d+>'=>'<controller>/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
    '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
  ),
),


Это еще не все, yii настроен, но сам сервер не понимает запросы, для того что бы научить его, нужно положить в C:\web\localhost\yii_project\mysite файл .htaccess


RewriteEngine on

# если директория или файл существуют, использовать их напрямую
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# иначе отправлять запрос на файл index.php
RewriteRule . index.php


Если не знаете, как создать .htacces то вам сюда


Все, yii настроен.

среда, 15 мая 2013 г.

phpThumb Заливка прозрачным цветом

Обычная заливка в phpThumb делается с помощью метода pad(), который принимает третьим параметром массив цвета в RGB. Что бы научить его заливать прозрачным цветом, надо его немного изменить:

В GdThumb.inc.php на 164 строке

public function pad ($width, $height, $color=array(255, 255, 255))


Меняем на

public function pad ($width, $height, $color=array(255, 255, 255, 0))


А на 182 строке

        $fillColor = imagecolorallocate (
            $this->workingImage,
            $color[0],
            $color[1],
            $color[2]
        );


На

        $fillColor = imagecolorallocatealpha (
            $this->workingImage,
            $color[0],
            $color[1],
            $color[2],
            $color[3]
        );


В 198 строке добавляем

        if($color[3])
        {
            imagesavealpha($this->workingImage, true);
        }



Сохраняем.
Теперь в метод  pad() можно скармливать массив RGBA для заливки с прозрачностью.

понедельник, 13 мая 2013 г.

Вставить видео на сайт

Для вставки видео на сайт есть 2 способа:

1) Вставить видео с ютуба или любого другого сервиса

Для этого надо просто зайти на страницу с видео роликом, нажать "поделиться" и скопировать оттуда html код себе на страницу.

2) Использовать html5 плеер

Что бы вставить видео на сайт с помощью html5, нужно использовать html5 плеер. Одним из таких плееров является flowplayer. Он использует jquery, достаточно удобен на мой взгляд и хорошо документирован.

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

В header вставляем:

<script type="text/javascript" src="js/flowplayer/flowplayer-3.2.2.min.js"></script>

В body, туда где будет наше видео:

    <a href="1.flw" style="display: block; width: 468px; height: 286px;" id="player">
        <img src="1.jpg" width="468" height="286" />
    </a>


Сама инициализация плеера:

    <script language="JavaScript">
        flowplayer("player", {
            src: "http://oursite.com/js/flowplayer/flowplayer-3.2.2.swf",
            wmode: "transparent"},
            {
            clip: {
                autoPlay: true,
                autoBuffering: false,
            },
            playlist: ["http://oursite.com/1.flw"]
        });
    </script>


Здесь вместо ссылки на файл 1.flw будет окно с плеером в котором пользователь сможет его посмотреть. До того, как будет воспроизведено видео пользователь увидит картинку 1.jpg. Для запуска видео ему нужно будет кликнуть по изображению.

пятница, 10 мая 2013 г.

jquery Прокрутка страницы

Для того что бы прокрутить экран до элемента надо использовать функцию animate().

Пример:



    $('a').click(function() {

        $('html, body').animate({
            scrollTop: $('#elementtoScrollToID').offset().top
        }, 'slow');

        return false;
    });


Для прокрутки до верха страницы:


    $('a').click(function() {
        $("html, body").animate({scrollTop: 0}, "slow");
        return false;
    });


php Не правильное время

Если php показывает не правильное время, когда вы используете date() или new DateTime()
Причин может быть несколько. Либо вы выбрали не правильный часовой пояс. либо ошиблись в формате даты.

Часовой пояс выставляется в php.ini:

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Europe/Moscow


Ошибки в формате данных могут быть самые разнообразные, вот например моя:

echo date('Y-m-d H:m:s');


Вместо

echo date('Y-m-d H:i:s');


В итоге я всегда получал значение текущего месяца вместо минут.

Насильно обновить файлы через git pull

Для того что бы насильно обновить файлы до последней ревизии надо использовать


git fetch --all
git reset --hard origin/master


git fetch Загружает последнюю версию из всех репозиториев без попытки обновления проекта.
git reset Сбрасывает ветку master до только что скачанной ревизии.

четверг, 9 мая 2013 г.

php Установка sendmail на debian

Для того что бы отправлять почту через php надо сначала установить пакет sendmail:

apt-get install sendmail

Затем в /etc/php5/apache2/php.ini найти и поправить sendmail_path:

sendmail_path = /usr/sbin/sendmail -t -i

Установка завершена. Перезапускаем апач и пользуемся:

/etc/init.d/apache2 restart

html5 Геолокация (geolocation)

Для того что бы определить страну или город посетителя по ip можно использовать html5 + google maps api.

В простейшем случае нам надо всего лишь вызвать

navigator.geolocation.getCurrentPosition()

Пример:


navigator.geolocation.getCurrentPosition(foundLocation, noLocation);


function foundLocation(position)
{
    console.log(location.address.city);
}

function noLocation()
{
    console.log('no position');
}



И вроде бы всё просто и хорошо, но мы познаем настоящую печаль, когда окажется что данный способ работает только в firefox.

Для того, что бы сделать код более универсальным, придется использовать сервис для обратного геокодирования, который предоставляет гугл:


navigator.geolocation.getCurrentPosition(foundLocation, noLocation);


function foundLocation(position)
{
    $.get('http://maps.googleapis.com/maps/api/geocode/json?latlng='+position.coords.latitude+','+position.coords.longitude+'&sensor=false', 


    function(response){
        console.log(response);
    });

}

function noLocation()
{
    console.log('no position');
}


В итоге у нас окажется объект response с кучей полезной информации расположении пользователя.

Вот что он вернул мне например, интересующие на данные находятся в results:

Object {results: Array[14], status: "OK"}
results: Array[14]
0: Object
1: Object
2: Object
3: Object
4: Object
5: Object
6: Object
7: Object
8: Object
9: Object
10: Object
11: Object
12: Object
13: Object
length: 14
__proto__: Array[0]
status: "OK"
__proto__: Object


Для работы всего этого дела надо не забыть подключить google maps api конечно же:

<script type="text/javascript" src="//maps.googleapis.com/maps/api/js?v=3.exp&amp;sensor=false&amp;libraries=places"></script>

среда, 8 мая 2013 г.

Ограничить по размерам google.maps.places.Autocomplete

Так как значение ширины высчитывается скриптом, напрямую задать его не удастся. Для того что бы сделать больше или меньше окно селекта google.maps.places.Autocomplete надо через css установить значения для минимальной/максимальной ширины для .pac-container

Пример:

.pac-container {
    min-width: 400px;
}

четверг, 2 мая 2013 г.

yii Некорректный запрос

Контроллеры yii отдают ответ "Некорректный запрос" в случае, если количество передаваемых гет параметров не совпадает с количеством обьявленных входных переменных метода контроллера.

Пример:

Метод

public function actionView($id)
{
      echo 'Это наш метод';
}


Не правильно:

site.com/controller/view

//Мы получим в ответ "Некорректный запрос", так как не указали id

Правильно:

site.com/controller/view/42

//Получим "Это наш метод"




Так же проверьте фильтры. Если, например, метод обозначен как ajaxOnly, то прямой его вызов так же будет генерировать 400 ошибку.

yii Не генерируется код валидации yiiactiveform

Сделал форму через виджет CActiveForm, но она упорно не хотела валидироваться, просмотрел html и выяснил, что не генерируется код валидации yiiactiveform.

После долгих экспериментов выяснилось, что виджету необходимо, что бы были поля error. А если они не нужны то их нужно специально отключать при вызове виджета:


<?php $form = $this->beginWidget('CActiveForm', array(
    'action' => Yii::app()->createUrl('subscribe/save'),
    'id' => 'form',
    'enableClientValidation' => true,
    'clientOptions' => array(
        'hideErrorMessage' => true, // вот эта волшебная опция
    ),
        )); ?>