вторник, 30 апреля 2013 г.

Одинаковые комментарии facebook на каждой странице

Фейсбук это вам не вконтакте =)
Для того что бы на каждой странице были разные комментарии фейсбука, надо  в блоке

<div class="fb-comments" data-href="http://example.com" data-width="470" data-num-posts="10"></div>

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

Пример:

<div class="fb-comments" data-href="http://example.com/page/1" data-width="470" data-num-posts="10"></div>


<div class="fb-comments" data-href="http://example.com/page/2" data-width="470" data-num-posts="10"></div>


<div class="fb-comments" data-href="http://example.com/page/3" data-width="470" data-num-posts="10"></div>



Сделать это можно ручками =) Или вот так:

<div class="fb-comments" data-href="http://<?php echo $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; ?>" data-width="470" data-num-posts="10"></div>

четверг, 25 апреля 2013 г.

php. Деление массива на 2

Для того что бы поделить массив на 2 части можно воспользоваться функцией array_chunk()

Пример:

$array = array('a', 'b', 'c', 'd');

$parts = array_chunk($array, count($array) / 2);

// $parts[0] = array(0 => 'a', 1 => 'b');
// $parts[1] = array(0 => 'c', 1 => 'd');

Если передать третьим аргументом true, то ключи массива будут сохранены:

// $parts[0] = array(0 => 'a', 1 => 'b');
// $parts[1] = array(2 => 'c', 3 => 'd');

суббота, 20 апреля 2013 г.

php. Вычесть из даты год, месяц, или день

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

//вычитаем год
$date = new DateTime();
$date->modify('-1 year');
echo $date->format('Y-m-d H:i:s');

//вычитаем месяц
$date = new DateTime();
$date->modify('-1 month');
echo $date->format('Y-m-d H:i:s');

//вычитаем день
$date = new DateTime();
$date->modify('-1 day');
echo $date->format('Y-m-d H:i:s');



С добавлением оно так же работает, надо просто заменить - на +.


среда, 17 апреля 2013 г.

mysql. Can't create table (errno: 121)

Если при попытке создании внешнего ключа возникает ошибка 121 значит ключ, который вы пытаетесь создать, уже существует. Попробуйте переименовать его во что ни будь более оригинальное.

вторник, 16 апреля 2013 г.

mysql. "Can't create table errno: 150" или как добавить внешний ключ к существующей таблице.

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


ALTER TABLE comment
ADD CONSTRAINT fk_user_id
FOREIGN KEY (user_id) REFERENCES user(id)
ON UPDATE CASCADE
ON DELETE CASCADE;


Надо помнить, что foreign key не поддерживается в MyISAM, придется преобразовывать таблицы в InnoDB

Так же поля для внешнего ключа должны быть одинакового типа и размера. Например:
comment.user_id(UNSIGNED INT 11) и user.id(UNSIGNED INT 11)

Если вы вдруг в чём то ошиблись, то удалить внешний ключ можно так:

ALTER TABLE comment DROP FOREIGN KEY fk_user_id


google maps api автозаполнение. Поиск региона

Понадобилось сделать ввод города или страны,что бы при вводе первых букв показывались возможные значения. Лучшим вариантом показался google maps api autocomplete.

Для того что бы показывались только города и страны, выставляем type = (regions)

Код:

<script src="//maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places"></script>
<script>
      function initialize() {

        var input = document.getElementById('searchTextField');

        var options = {
          types: ['(regions)'],
        };

        var autocomplete = new google.maps.places.Autocomplete(input, options);

        google.maps.event.addListener(autocomplete, 'place_changed', function() {
          var place = autocomplete.getPlace(); //получаем место
          console.log(place);
          console.log(place.name);  //название места
          console.log(place.id);  //уникальный идентификатор места
        });

      }
      google.maps.event.addDomListener(window, 'load', initialize);
</script>


В html:

<input id="searchTextField" size="50" type="text" />



Для того что бы искать только по городам, выставляем type = (cities)

Об ограничениях.

Ограничения яндекса, это 10000 поисковых запросов в сутки с подтверждённым телефоном.
Гугла - 20 000 000 запросов в день.

пятница, 12 апреля 2013 г.

robots.txt для яндекса и гугла

robots.txt имеет простую цель - показать роботам, что можно индексировать, а что нельзя.

Сначала обычно пишется, для кого правило, а потом само правило:


User-agent: * 
Disallow: /


* - Означает для всех
Disallow - запретить
/ - все директории, начиная с корня сайта



Disallow - запрещает доступ
Allow - разрешает



Вот возможные значения для яндекса:

YandexBot - основной индексирующий робот;
YandexMedia - робот, индексирующий мультимедийные данные;
YandexImages - индексатор Яндекс.Картинок;
YandexCatalog - "простукивалка" Яндекс.Каталога, используется для временного снятие с публикации недоступных сайтов в Каталоге;
YandexDirect - робот Яндекс.Директа, особым образом интерпретирует robots.txt;
YandexBlogs - робот поиска по блогам, индексирующий посты и комментарии;
YandexNews - робот Яндекс.Новостей;
YandexPagechecker - валидатор микроразметки;
YandexMetrika - робот Яндекс.Метрики;
YandexMarket - робот Яндекс.Маркета;
YandexCalendar - робот Яндекс.Календаря.




Googlebot - обозначение робота гугла
Googlebot-Image - гугловый робот для индексирования картинок


Sitemap - директива для обозначения пути до sitemap.xml
Пример: Sitemap: sitemaps.xml

Остальные директивы:

Host - используется для указания главного зеркала сайта роботу

Disallow: 
Host: www.host1.ru



Crawl-delay - задает таймаут между заказчками страниц для робота.

User-agent: Yandex
Crawl-delay: 2


Clean-param - директива, использующаяся для указания параметров, не влияющих на уникальность страницы

User-agent: Yandex
Disallow:
Clean-param: ref /some_dir/get_book.pl


linux Как архивировать папку

tar cvf folder.tar /path/to/folder - без сжатия

tar cvzf folder.tar.gz /path/to/folder - сжатие gzip

tar cvjf folder.tar.bz2 /path/to/folder - сжатие bzip2



Для получения полной справки используйте tar --help

linux Поиск по тексту из консоли

grep -rn 'search phrase' /directory

-r - флаг рекурсивного поиска
-n - флаг выдачи номера строки
'search phrase' - искомая фраза
/directory - директория в которой ищем

Ещё вместо директории можно перечислить файлы.

Более детальное описание можно найти вот здесь: info grep

четверг, 11 апреля 2013 г.

html тег для скайпа

Обозначение номеров и аккаунтов скайпа в html делается так:


Звонок из скайпа одному пользователю

<a href="skype:user">user</a>

На телефон

<a href="skype:+12345678">+12345678</a>

Сразу нескольким

<a href="skype:skype:user1;user2;user3">conference</a>

Теперь при клике по этим ссылкам будут производится аналогичные действия как и для известного mailto

php mb_substr кракозябры в конце строки

Иногда после использования mb_substr в конце строки появляются непонятны символы, это происходит потому что php не правильно определяет кодировку. Надо её просто указать.

Пример:

mb_substr($text, 0, 10, 'utf-8');

Как в yii CListView убрать summary

В zii.widgets.CListView нет настройки, напрямую влияющей на отображение summary блока, но его можно убрать, немного подправив шаблон template

Пример:


    
    widget('zii.widgets.CListView', array(
            'dataProvider'=>$dataProvider,
            'itemView'=>'_view',
            'template'=>'{items}{pager}' <====== вот эти парни =)
    ));

вторник, 9 апреля 2013 г.

Кидалы на фрилансе

Занялся я как то вёрсткой нафрилансе вместо обычного php программирования и был неприятно удивлен одним товарищем, который сначала просто прикидывался дурачком, а потом оказался кидалой, отказавшись платить мне деньги.

В целом заказ был на верстку и прикручивание этой вёрстки к cms. Когда я заподозрил неладное я предложил произвести оплату после выполнения вёрстки, а уже после неё завершить привязку к cms. Возражений не последовало и я сделал вёрстку. После этого товарищ отказался платить и  несколько раз "случайно" отрубал доступ к фтп. В итоге я отказался заканчивать работу без оплаты, а заказчик "разрешил" удалить всё, что я сделал. В итоге я потерял 4 часа рабочего времени и ничего не получил взамен. Интересно, что этот человек сказал, что если бы он меня хотел кинуть, то придумал бы 1000 способов для этого, но не собирается так поступать(это уже было после того как я понял что к чему).

Если оставить моральную сторону вопроса, то остаётся только очевидно крайне не защищённое положение верстака на фрилансе.

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