Заметки программиста

Каждый будний день, ровно в 9, я пишу о себе, о своей работе и о технологиях web программирования123

Posts Tagged ‘ php ’

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

TinyMCE Images plugin

TinyMCE Images: Обзор

TinyMCE Images plugin

TinyMCE Images: Загрузка

TinyMCE Images plugin

TinyMCE Images: Удаление

Плагин достаточно требовательный: PHP 5 и GD2 на сервере, Flash Player и JavaScript у пользователя.

Кратко об установке:

  • Создать в корне сайта папку /storage и дать права на запись/чтение
  • В tinyMCE.init:
    • plugins: …,images,…
    • theme_advanced_buttons1: …,images,…
    • relative_urls : false
    • remove_script_host : true

Плагин поддается локализации, у меня их только 2: ru и en.

Постоянная страница TinyMCE Images на dustweb.ru.

Скачать можно с SourceForge, а посмотреть демо можно здесь.

Скрипт создан для генерации title заголовков для любых сайтов 1.

Логотип Garden
Респект Денису за лого

Можно отнести скрипт к категории SEO Tools, так как работа продвиженца, так же заключается и в прописывании title’ов у сайта, что часто бывает проблематично из-за сложности движка, либо вообще за его отсутствием.

Я предлагаю такое решение:

Схема работы garden

-

garden.php выполняет роль «прокси», но при этом все параметры запроса до сервера доходят неизменно, .htaccess может быть произвольным и в ряде случаев его необходимо настраивать по своему. В исходниках он представлен в 2х вариантах: для обычного сайта (html или php с отдельными скриптами) и сайта с единой точкой входа через mod_rewrite.

Для входа в режим администрирования достаточно зайти на /garden.php (пароль 12345)

Поддерживается и вот такой формат (пример):
/catalog/games?page=*
* – это ряд любых символов, т.е. категория в нашем каталоге не зависимо от страницы будет имет тот title, который мы задали.

Cкачать скрипт garden v0.1

1 — Системные требования: php4(5), mod_rewrite, curl, права на запись, чтение, выполение garden.php

В дословном переводе — Магические Методы (Magic Methods). Эти методы зарезирвированы в php и все начинаются с двойного подчеркивания (__), вообще свои методы не рекомендуется называть используя в начале __. Список всех волшебных методов:

  • __construct
  • __destruct
  • __call
  • __callStatic
  • __get
  • __set
  • __isset
  • __unset
  • __sleep
  • __wakeup
  • __toString
  • __set_state
  • __clone

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

__construct, __destruct

Самые популярные, пожалуй, это __construct и __destruct, их знают все, это методы реализующие базовые понятия ООП: конструктор и деструктор.

__call, __get, __set

__call, __callStatic, __get и __set относятся к методам связанным с перегрузкой, т.е. мы можем выполнить к примеру такой метод $obj->ShowMeTheMoney(1000) даже если он фактически отсутствует, а на самом деле управление будет отдано вот такому методу:

function __call($m, $a) {
    ...
}

где $m = ‘ShowMeTheMoney’, а $a = 1000.
__get и __set выполняют похожие операции, но только со свойствами класса.

__sleep, __wakeup

__sleep и __wakeup очень интересные и специфические методы, они вызываются только из функций serialize и unserialize соответственно. __sleep будет вызвана ранее чего либо при выполнении команды serialize над данным объектом и ожидается что она вернет имена переменных, которые нужно сериализовать. __wakeup в свою очередь выполяется при десериализации и служит, к примеру, для восстановления коннекта к базе данных или еще чего-то подобного.

__toString

При обращении к классу как к строке, PHP возвращает ошибку:

$class = new TestClass('Привет');
echo $class;

Но если мы создадим волшебный метод __toString, никаких проблем не возникнет!

class TestClass
{
    public $foo;

    public function __construct($foo) {
        $this->foo = $foo;
    }

    public function __toString() {
        return $this->foo;
    }
}

__clone

Последний в моем обзоре будет метод __clone, он вызывается только при клонировании объекта (оператор clone). При отсутствии этого метода, он подставится автоматически и скопирует все свойства объекта в новый. В противном случае, т.е. если мы сами, как бэтманы и супермены, описали метод __clone в нашем объекте, выполнится он, а мы же должны позаботиться о том какие свойства будут переданы в новый объект.

UPD

Хороший пример написал m-ga на я.ре.

В данном случае это не очередной обзор версий MySQL, а простой, но очень полезный скрипт. Его назначение — сравнивать таблицы и поля 2х БД.

Для какой цели? Все просто.

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

Простое решение, нужно просто выяснить различия в полях таблиц и подсветить. Принцип работы следующий: один и тот же скрипт загружается на 2 сайта (как правило локальный и удаленный), хотя бы один из них должен быть виден из сети, а другой должен иметь возможность исходящих подключений, далее нужно прописать в каждом из 2х скриптов реквизиты к местной MySQL, и вызвать один из скриптов примерно так: http://mysite/mysql_compare.php?remote_script=http://mysupersite.ru/mysql_compare.php

Скачать скрипт

Скрипт не претендует на готовый программный продукт, а является всего лишь ознакомительной версией и я как автор не несу никакой ответственности за возможные последствия его работы.

В PHP волшебным образом реализована работа с типами переменных, проблемы с конвертированием возникают только в массивах и то вызывают в основном Notice, а так скрипты спокойно позволяют вытворять подобное:

$n = "5";
echo 3 + $n;

А теперь хотите немного специальной php магии?

$a = 'string';
$b = 0;

if ( $a == true && $b == false && $a == $b )
{
    echo ( 'Teddy bear?' );
}

На экране Teddy bear? Как это получилось? Все достаточно просто:

  1. ’string’ == true условие выполняется, т.к. строка конвертируется в true если она не нулевая, при сравнении с булевым типом.
  2. 0 == false условие так же выполняется, ноль при конвертировании в булевый тип является false
  3. ’string’ == 0 и это условие выполняется, как бы странно это ни было на первый взгляд. Строка сравнивается с целым, при этом она конвертируется в число, таким образом если бы $a = ‘23′, то условие бы не выполнилось.

Подробно о конвертировании типов переменных написано в официальной документации, и никакой магии O_O

1 пост тому назад я писал о том как легко и просто генерировать Excel файлы из PHP с помощю  Excel Writer. Но в ходе обсуждения истина, как всегда, пришла сама собой и был найден самый идеальный вариант с морем возможностей. Смотрим Spreadsheet::WriteExcel, этот класс позволяет делать практически все на что способен Excel, склеивать ячейки, задавать стили шрифта и фона, создавать панели и даже вставлять картинки. Пожалуй лучшей реализации я не видел.

И на последок несколько демок.

По этой теме все уже давно написано, я просто покажу как это делается. Друзья из Индии нам помогли и выложили готовый класс – Excel Writer. Вот пример его работы:

<?php

    include("excelwriter.inc.php");

    $excel=new ExcelWriter("myXls.xls");

    if($excel==false)
        echo $excel->error;

    $myArr=array("Name","Last Name","Address","Age");
    $excel->writeLine($myArr);

    $myArr=array("Sriram","Pandit","23 mayur vihar",24);
    $excel->writeLine($myArr);

    $excel->writeRow();
    $excel->writeCol("Manoj");
    $excel->writeCol("Tiwari");
    $excel->writeCol("80 Preet Vihar");
    $excel->writeCol(24);

    $excel->writeRow();
    $excel->writeCol("Harish");
    $excel->writeCol("Chauhan");
    $excel->writeCol("115 Shyam Park Main");
    $excel->writeCol(22);

    $myArr=array("Tapan","Chauhan","1st Floor Vasundhra",25);
    $excel->writeLine($myArr);

    $excel->close();
    echo "data is write into myXls.xls Successfully.";
?>

Для тех кто не может зарегистрироваться на phpclasses (кстати очень полезный сайт), выложу код у себя — Excel Writer.

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

  1. Описываем логику логично
  2. Вывод должен быть выводом, а не php кодом
  3. Запросы тоже нужно писать понятно

[More]

Приведу несколько примеров как поменять отдаваемые сервером заголовки из PHP, кстати чтоб их удобно было просматривать советую плагин для FireFox — LiveHTTPHeaders.

// Страница не найдена (очень важно для поисковиков):
header('HTTP/1.1 404 Not Found');

// Доступ запрещен (имеется ввиду не HTTP авторизация,
// а именно внутренняя авторизация сайта):
header('HTTP/1.1 403 Forbidden');

// Перемещёно окончательно (вот это
// архиважно для роботов, так поисковик легко сможет
// обновить ссылку на новую страницу, и кстати
// используется вместе с 'Location')
header('HTTP/1.1 301 Moved Permanently');

// Перенаправление на другую страницу:
header('Location: http://www.dustweb.ru/');

// Перенаправление с задержкой:
header('Refresh: 10; url=http://dustweb.ru/');

// Замена значения X-Powered-By (понты дороже денег):
header('X-Powered-By: My_super_cms/1.3b');

// Запрет на кеширование текущего документа
// (так уж точно не закешируется):
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 29 Jul 1985 05:00:00 GMT'); // Прошлое время
header('Pragma: no-cache');

// Установка атрибута Content-Type (важная штука, особенно
// если файл отдается через php ну или прямо в нем генерируется):
header('Content-Type: text/html; charset=windows-1251');
header('Content-Type: text/html; charset=utf-8');
header('Content-Type: text/plain'); // просто текстовый файл
header('Content-Type: image/jpeg'); // jpg картинка
header('Content-Type: application/zip'); // zip файл
header('Content-Type: application/pdf'); // pdf файл

По идее PHP не поддерживает перегрузку функций, но есть очень простой способ это обойти — использовать для определения входных параметров func_get_args.

func_get_args — возвращает массив — список аргументов функции.

Простой пример:

function test() {
	echo '<pre>'.print_r(func_get_args(),1).'</pre>';
}

test('hello', 'world', array('of','overloaded','functions'));
test(1,2,3);

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

Трудности могут возникнуть при описании в формате PHPDoc.