Заметки, Проекты → Ленивые программисты

В последние несколько дней изучаю движки инет-магазинов, хочу сделать для супруги инет-магазин. В процессе изучения натыкаюсь на много интересных вещей, о которых расскажу как-нибудь потом. А сегодня меня ОЧЕНЬ СИЛЬНО удивил движок инет-магазина, стоимостью почти 400$. Вдумайтесь — в некоторых местах нашей родины столько получают за месяц работы! Ну, думаю, раз такая стоимость — продукт должен быть отличный…

А в реале — жесть! Начинается жесть с установки, на шаге, когда просят ввести лицензионный ключ, который можно получить по ссылке. Получил, ввел, работает. Дай, думаю, посмотрю как именно устроена защита движка. Не поверите, нашел 3 места, в которых проверяется лицензионный ключ. ВСЕ! За 40 минут дальнейших поисков не нашел больше ничего! Удалил проверки, в конфиге прописал для лицензионного ключа значение «Ну нету лицензии ))», удалил вывод ошибки в подвале админки и снес файл LicenseAdmin.php. Все работает. И это защита скрипта, стоимостью 400$?!

Можно еще сказать про код. С виду — все отлично, но стоит приглядеться и выпадаешь в осадок. Вот, например, автолоадер:

<?php

/**
 * Основной класс Simpla для доступа к API Simpla
 *
 * @copyright 	2011 Denis Pikusov
 * @link 		http://simplacms.ru
 * @author 		Denis Pikusov
 *
 */

class Simpla
{
	// Свойства - Классы API
	private $classes = array(
		'config'     => 'Config',
		'request'    => 'Request',
		'db'         => 'Database',
		'settings'   => 'Settings',
		'design'     => 'Design',
		'products'   => 'Products',
		'variants'   => 'Variants',
		'categories' => 'Categories',
		'brands'     => 'Brands',
		'features'   => 'Features',
		'money'      => 'Money',
		'pages'      => 'Pages',
		'blog'       => 'Blog',
		'cart'       => 'Cart',
		'image'      => 'Image',
		'delivery'   => 'Delivery',
		'payment'    => 'Payment',
		'orders'     => 'Orders',
		'users'      => 'Users',
		'coupons'    => 'Coupons',
		'comments'   => 'Comments',
		'feedbacks'  => 'Feedbacks',
		'notify'     => 'Notify'
	);
	
	// Созданные объекты
	private static $objects = array();
	
	/**
	 * Конструктор оставим пустым, но определим его на случай обращения parent::__construct() в классах API
	 */
	public function __construct()
	{
	}

	/**
	 * Магический метод, создает нужный объект API
	 */
	public function __get($name)
	{
		// Если такой объект уже существует, возвращаем его
		if(isset(self::$objects[$name]))
		{
			return(self::$objects[$name]);
		}
		
		// Если запрошенного API не существует - ошибка
		if(!array_key_exists($name, $this->classes))
		{
			return null;
		}
		
		// Определяем имя нужного класса
		$class = $this->classes[$name];
		
		// Подключаем его
		include_once('api/'.$class.'.php');
		
		// Сохраняем для будущих обращений к нему
		self::$objects[$name] = new $class();
		
		// Возвращаем созданный объект
		return self::$objects[$name];
	}
}

Как Вам? )) По мне — полный бред. Порадовала фраза:

Конструктор оставим пустым, но определим его на случай обращения parent::__construct() в классах API

Вместе с подобной фразой, разработчик в коде использует не инициализированные объекты! Как?! Как такое возможно?! Или, вот например: в классе управления шаблонами есть такой код:

	private function dir_copy($src, $dst)
	{
		if(is_dir($src))
		{
			mkdir($dst, 0777);
			$files = scandir($src);
			foreach ($files as $file)
				if ($file != "." && $file != "..") $this->dir_copy("$src/$file", "$dst/$file"); 
		}
		elseif(file_exists($src))
			copy($src, $dst);
		@chmod($dts, 0777);
	}

Найдете ошибку? Верно, в последней строке. Интересно, как разработчик продукта тестировал это?! Или, все-таки, не тестировал вообще?! Или вот, еще пример:

	public function add_coupon($coupon)
	{	
		if(empty($coupon->single))
			$coupon->single = 0;
		$query = $this->db->placehold("INSERT INTO __coupons SET ?% $date_query", $coupon);
		
		if(!$this->db->query($query))
			return false;
		else
			return $this->db->insert_id();
	}

Как-бы узнать, как в данный код попадает переменная $date_query? Разработчика спросить? Жесть…

По итогу: провозился с движком порядка полутора часа. До установки были огромные надежды на него (удобная админка, ООП и пр.), но на выходе ужас. Если и брать его, то придется перерыть весь код, чтобы поправить все подобные места. Спрашивается — зачем тогда покупать этот двиг?!