Программист на PHP + MySQL

fhuuz
На сайте с 08.03.2009
Offline
247
#71

Был заказан многофункциональный скрипт. То есть нажатием одной кнопки планировалось выполнить работу минимум трех скриптов. TC реализовал все просто великолепно. Работает как часы.

Вывод-программист высшего класса, делает все быстро и без ошибок.

WP
На сайте с 08.06.2010
Offline
4
#72

Человек помог решить быстро проблему с движком, были траблы с переносом на другой домен. Рекомендую как отличного специалиста своего дела, на будущее готовы на плодотворное сотрудничество с ТС.

Рекомендую. Свое дело знает.

I
На сайте с 05.06.2006
Offline
117
#73

Заказы временно не принимаю - занят до 25 сентября 2010 года

Миграция с ISPManager 4 в VestaCP (https://chast.in/copy-users-from-ispmanager-2-vestacp.html) Хостинг серверов, пользуюсь сам (http://vps-server.ru/rp/pl.php?96)
I
На сайте с 05.06.2006
Offline
117
#74

Несколько раз просили прислать им пример кода в личку | на почту. Видимо, уровень программиста можно оценить по внешнему виду кода. Решил выложить примеры здесь, надеюсь, модераторы не удалят его :)

Это два базовых класса моделей для работы в Zend Framework, они взаимосвязаны.

Первый


<?php
# Ordered.php
abstract class Jest_Model_Ordered extends Jest_Model_DbRow
{
/**
* Имя поля бызы данных по которому вычисляется порядок
*
* @var string
*/
protected $_orderColumn = 'ord';

/**
* Выражение выборки данных из базы.
*
* @return Zend_Db_Table_Select
*/
protected function _getSelect()
{
return $this->dbTable()->select();
}

/**
* Возвращает количество записей в базе
*
* @return Ambigous <Zend_Db_Table_Row_Abstract, NULL>
*/
private function _getCount()
{
$select = $this->_getSelect();
$table = $select->getTable();
$select->from($table, 'COUNT(*)');
$result = $table->fetchRow($select);
return $result ['COUNT(*)'];
}

/**
* Устанавливает порядковый номер для новой записи.
*/
public function save()
{
if ($this->isNew()) {
$this->_row->{$this->_orderColumn} = $this->_getCount();
}
parent::save();
}

/**
* Перенумеровывает оставшиеся элементы
*/
public function delete()
{
$select = $this->_getSelect();
$select->where($this->_orderColumn . ' > ?', $this->_orderColumn);
$table = $select->getTable();
$table->update(array(
$this->_orderColumn => new Zend_Db_Expr($this->_orderColumn . ' - 1')), $select->getPart(Zend_Db_Select::WHERE));
parent::delete();
}

/**
* Возвращает элемент с указанным порядковым значением.
*
* @param unknown_type $orderValue Порядковое значение
* @return Ads_Model_Sub|NULL
*/
private function _getSibling($orderValue)
{
$select = $this->_getSelect();
$select->where($this->_orderColumn . ' = ?', $orderValue);
$row = $select->getTable()->fetchRow($select);
if ($row) {
return new Ads_Model_Sub('row', $row);
} else {
return null;
}
}

/**
* Возвращает следующий по порядку элемент.
*
* @return Ambigous <NULL, Ads_Model_Sub>
*/
public function next()
{
return $this->_getSibling($this->{$this->_orderColumn} + 1);
}

/**
* Возвращает предыдущий по порядку элемент.
*
* @return Ambigous <NULL, Ads_Model_Sub>
*/
public function prev()
{
return $this->_getSibling($this->{$this->_orderColumn} - 1);
}

/**
* Перемещает элемент вверх в порядковом списке
*/
public function moveUp()
{
$prev = $this->prev();
if ($prev) {
$this->{$this->_orderColumn} = $this->{$this->_orderColumn} - 1;
$prev->{$this->_orderColumn} = $prev->{$this->_orderColumn} + 1;
$this->save();
$prev->save();
}
}

/**
* Перемещает элемент вниз в порядковом списке
*/
public function moveDown()
{
$next = $this->next();
if ($next) {
$this->{$this->_orderColumn} = $this->{$this->_orderColumn} + 1;
$next->{$this->_orderColumn} = $next->{$this->_orderColumn} - 1;
$this->save();
$next->save();
}
}

}

Второй:


<?php
#DbRow.php
abstract class Jest_Model_DbRow
{
/**
* Запись базы данных
* @var Zend_Db_Table_Row
*/
protected $_row = null;
/**
* Внутренне хранилище свойств
* @var array
*/
protected $_properties = array();
/**
* Признак нового объекта, ещё не сохраненного в базе.
* @var bool
*/
private $_isNew = false;

/**
* Волшебный конструктор :)
* Вызывает метод инициялизации с именем - _init%ПервыйАргумент%
*/
public function __construct()
{
$args = func_get_args();
$func = array_shift($args);
call_user_func_array(array(
$this,
$funcName = '_init' . ucfirst($func)), $args);
}

/**
* Инициализаци новой модели
*/
protected function _initNew()
{
$this->_row = $this->dbTable()->createRow();
$this->_isNew = true;
}

/**
* Инициализация по ключу $id
* @param int $id
*/
protected function _initId($id)
{
$this->_row = $this->dbTable()->find($id)->current();
}

/**
* Инициализаци напрямую из записи базы данных
* @param Zend_Db_Table_Row $id
*/
protected function _initRow($row)
{
$this->_row = $row;
}

/**
* Функция должна возращать таблицу базы данных в которой хранится модель
* @return Zend_Db_Table_Abstract
*/
abstract protected function dbTable();

/**
* Заполняет модель из массива.
* ! Заполняются только поля данных в записи таблицы
*
* @param array $data
*/
public function fill($data)
{
foreach ( $data as $key => $value ) {
if (isset($this->_row->$key)) {
$this->_row->$key = $value;
}
}
}

/**
* Сохранение данных в таблицу
*/
public function save()
{
$this->_row->save();
$this->_isNew = false;
}

/**
* Удаляет модель из таблицы
*/
public function delete()
{
$this->_row->delete();
}

/**
* Тест на целостность модели
*/
public function isValid()
{
return ($this->_row !== null);
}

/**
* Заполняет форму данными из записи базы данных
* @param Zend_Form $form
*/
public function populateForm(Zend_Form $form)
{
$form->populate($this->_row->toArray());
}

/**
* Реализует магию :) чтения свойств модели.
* Порядок следующий:
* 1. Из записи базы данных
* 2. Из хранилища свойств
* 3. Через метод доступа _get%ИмяСвойства%
*
* @param string $name
* @return multitype:|unknown|NULL
*/
public function __get($name)
{
// пробуем получить из записи базы данных
if (isset($this->_row->$name)) {
return $this->_row->$name;
}
// пробуем получить из хранилища свойств
if (array_key_exists($name, $this->_properties)) {
return $this->_properties [$name];
}
// пробуем через метод доступа
$method = '_read' . ucfirst($name);
if (method_exists($this, $method)) {
$result = $this->$method();
if ($result !== null) {
// сохраняем в хранилище свойств
$this->$name = $result;
}
return $result;
}
// ничего не нашли :)
}

/**
* Реализует магию :) записи свойств модели.
* Порядок следующий:
* 1. В запись базы данных
* 3. Через метод доступа _set%ИмяСвойства%
* 2. В хранилище свойств
*
* @param string $name
* @param unknown_type $val
*/
public function __set($name, $val)
{
if (isset($this->_row->$name)) {
$this->_row->$name = $val;
} else {
$method = '_write' . ucfirst($name);
if (method_exists($this, $method)) {
$this->$method($val);
} else {
$this->_properties [$name] = $val;
}
}
}

/**
* Удаляет свойство из хранилища
*
* @param string $name
*/
public function __unset($name)
{
unset($this->_properties [$name]);
}

/**
* Возвращает все свойсва в виде массива
*
* @return multitype:
*/
public function toArray()
{
return array_merge($this->_row->toArray(), $this->_properties);
}

/**
* Возвращает true если это новый экземпляр модели,
* еще не сохраненный в базе данных
*
* @return bool
*/
public function isNew()
{
return $this->_isNew;
}

/**
* Преобразует список записей $rowset в масив классов $className
*
* @param Zend_Db_Table_Rowset_Abstract $rowset
* @param string $className
* @return array of $className objects
*/
static public function transformRowset($rowset, $className)
{
$result = array();
foreach ( $rowset as $row ) {
$result [] = new $className('row', $row);
}
return $result;
}
}
A
На сайте с 12.08.2010
Offline
35
#75

Написал в ЛС

брендовые логотипы от 30$ Портфолио (http://www.weblancer.net/users/Argentino/portfolio/) (основное портфолио по запросу через ЛС)
I
На сайте с 05.06.2006
Offline
117
#76

Подниму тему - скоро будет время на крупный проект, обращайтесь.

S
На сайте с 28.07.2005
Offline
51
#77

Работал с ТС

Оперативно, качественно делает работу, за которую берется.

Вносит свои предложения в реализацию.

Всегда на связи, пунктуален.

Четко всегда были урегулированы несостыковки в заказе.

Дмитрию спасибо за работу!

И вообще хороший ЧЕЛОВЕК, советую!!!

покупаю уникальные тексты по ремонту
I
На сайте с 05.06.2006
Offline
117
#78

Подниму тему, есть время для крупного заказа.

C
На сайте с 04.02.2009
Offline
17
#79

Обратился к ТС по рекомендации одного своего давнего клиента, т.к. попалась нетривиальная задача, которая оказалась не под силу программисту с которым давно и плотно работаю.

Был приятно удивлен оперативностью и качеством исполнения задачи.

Полагаю, сотрудничество на этом не закончится.

Рекомендую.

ilyhais
На сайте с 04.05.2010
Offline
64
#80

Обратился к ТС с просьбой устранить баг в цмс, в которой сами разработчики устраняют уже неделю. ТС быстро среагировал и устранил баг в течении 10 минут. Не знаю как ему это удалось, но это и есть профессионализм. Рекомендую!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий