"PHP" / Говнокод #3565 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
function addimagesave()
	{
		if (!$this->Login->isLogged())
        {
            $this->loginto();
            return;
        }
        else $this->Login->Update();
		$error = '';
		$recordExists = false;
		$post_name = trim($this->input->post('name'));
		if ($post_name != '') $insert['file_name'] = $post_name;
		// now need to get from db if id_all in i_pics
		$this->db->where('id_all',$this->input->post('id_all'));
		$this->db->limit(1);
		$query = $this->db->get('i_pics');
		if ($query->num_rows() == 1)
		{
			$row = $query->row();
			$recordExists = true;
			$file_name = $row->file_name;
			$id_pics = $row->id_pics;
		}
		if (isset($_FILES['upload']) && ($_FILES['upload']['error'] == 0)) // is file loaded?
		{
			$ext = getExtensionOnly($_FILES['upload']['name']);
			if ($post_name != '') $_FILES['upload']['name'] = $post_name.'.'.$ext;
			else $post_name = delExtensionWithDot($_FILES['upload']['name']);
			$_FILES['upload']['name'] = translitIt(delExtensionWithDot($_FILES['upload']['name'])).'.'.$ext;
			$config['upload_path'] = './pics/';
			$config['allowed_types'] = 'gif|jpg|png|bmp';
			$this->load->library('upload', $config);
			if ($this->upload->do_upload('upload'))
			{
				$this->General->setEmes(array('roster'=>"Картинку загружено."), true);
				$data = $this->upload->data();
				$insert['file_name'] = $data['file_name'];
				// resize now
				$config1['image_library'] = 'gd2'; // выбираем библиотеку
				$config1['source_image'] = 'pics/'.$data['file_name'];
				$config1['create_thumb'] = TRUE; // ставим флаг создания эскиза
				$config1['maintain_ratio'] = true; // сохранять пропорции
				$config1['width'] = 250; // и задаем размеры
				$config1['height'] = 180;
				// pre crack image for resizing! )))
				$this->load->model('Image');
				$this->Image->smartsigninto('pics/'.$data['file_name'], 250, 180);
				$this->load->library('image_lib', $config1); // загружаем библиотеку
				$this->image_lib->resize(); // и вызываем функцию
				// now rename and owerwrite original image
				$ext = getExtensionOnly($data['file_name']);
				$fol = "pics/";
				if (is_file($fol.$data['raw_name'].'_thumb.'.$ext))
				rename($fol.$data['raw_name'].'_thumb.'.$ext, $fol.$data['file_name']);
				else $this->General->setEmes(array('roster'=>"Файл *_thumb не был создан!"));
				// now set new file size
				$insert['size'] = round(filesize($fol.$data['file_name'])/1024 , 2);
			}
			else $this->General->setEmes(array('roster'=>$this->upload->display_errors()));
		}
		else // we need to try to rename assigned file if name is not empty and file exists
		{
			if ($recordExists && is_file('pics/'.$file_name) && ($post_name != ''))
			{
				$ext = getExtensionOnly($file_name);
				$fol = "pics/";
				$newName = translitIt($post_name).'.'.$ext;
				if (is_file('pics/'.$newName))
				{
					$this->General->setEmes(array('roster'=>"Имя уже существует"), true);
					$insert['file_name'] = $file_name;
				}
				else
				{
					rename($fol.$file_name, $fol.$newName);
					$insert['file_name'] = $newName;
				}
			}
		}
		// prepare data to be ins or upd
		$insert['lang'] = 'ru';
		$insert['title'] = $this->input->post('title');
		$insert['alt'] = $this->input->post('alt');
		$insert['id_all'] = $this->input->post('id_all');
		if ($recordExists)
		{
			$this->db->where('id_pics',$id_pics);
			$this->db->update('i_pics', $insert);
			$this->General->setEmes(array('roster'=>"Данные обновлены"), true);
		}
		else $this->db->insert('i_pics', $insert);
		$this->redirect('roster/'.$this->input->post('type'));
	}

Функция - контроллер сохранения, resize на лету картинки для новости или прочей байды. Есть все проверки. Любая картинка которая приходит, становится размером 250, 180 , причем без растяжения. Это задача типа вписать прямоугольник в прямоугольник, которую я сейчас ночью выполнил - даже если картинка меньше оно впишет. I must be proud about this functionality! Заметим, что в интернете все и умеют что вырезать квадраты из картинки, а произвольный размер - НЕТ такого. Код выложен чтобы вы посмотрели, нравятся ли вам имена переменных, логическое мышление, форматирование, коментарии (на русском - то не мои коментарии). Код CodeIgniter powered.

Запостил: increazon increazon, (Updated )

Комментарии (53) RSS

  • > Заметим, что в интернете все и умеют что вырезать квадраты из картинки, а произвольный размер - НЕТ такого.
    Я, может, не до конца понимаю, какую именно задачу Вы решили, но как-то не верится, что Вы не изобрели велосипед.
    > Код выложен чтобы вы посмотрели, нравятся ли вам
    Что повторяй, что нет, всё одно ради этого будут выкладывать >_< Страйкер, чем чёрт не шутит, может, и правда пора форум запиливать?
    Ответить
  • Поздравляю, ты не только изобрел принципиально новый прямоугольник, но и смог вписать его внутрь другого. You must be proud about this functionality!

    А твой код на уровне настоящего гуру! Да что там говорить, Макконнелл и Фаулер нервно курят в сторонке.

    Но не все так хорошо, как хотелось бы... Почему ты используешь этот CodeIgniter? Он же для быдлокодеров, а твои знания и навыки позволяют написать свой фреймворк!
    Ответить
  • самое говно в
    // now need to get from db if id_all in i_pics

    код должен обьяснять сам себя

    а не
    for(int i=0;i<10;i++){} //тут цикл від 0 до 9
    Ответить
  • Что мне не нравится
    1) спагетти-код: между ифом и элсом десятки строк! Делаем рефакторинг "выделение метода", пока код не становится типа такого:
    if (isSomeCondition()) {
     doSomething1();
     doSomething2();
    } else {
     doSomething3();
    }

    2) что такое $config1? Где $config42? Кто так переменные называет? И вообще -- половина в кемел-стайле, половина с прочерками, что-то с большой буквы, что-то с маленькой... Нейминг конвеншен нужен. Выбери любой, только один какой нить! и юзай его.
    А еще в PHP советую юзать венгерскую нотацию в представлении Спольски ("Как заставить неправильный код выглядеть неправильно") -- сильно облегчает понимание, и лечит некоторые болезни отсутствия статической типизации.
    $strName = $arrNames[$nIndex]; //  как-то так

    3) Как говорится "или крестик сними или трусы надень": или у тебя "$this->input->post" или у тебя "$config1['height']". Я понимаю, что в PHP принято творить кашу из процедурного и ООП подходов (язык так устроен), но все таки лучше остановится на чем-нить одном. Если уж "$this->input" то "$config->getHeight()"
    И если уж "$config1['height']" то хотя бы 'height' в константу.
    4) И зачем в одной функции (даже не классе, а функции!!) работа с базой, логика переворачивания и редирект? Что бы это все оттестировать было нереально? Как вообще к этому юнит-тест писать -- я не понимаю.

    В общем тут еще много претензий, но этих наверное хватит....
    Ответить
    • Спасибо за глубокий анализ. Дело в том что редирект стоит в каждой функции сохранения результатов, чтобы ЮРЛ был понятен, ведь сама функция сохранения не выводит ничего. А что такое логика переворачивания и где она здесь?
      Ответить
      • >>Дело в том что редирект стоит в каждой функции сохранения результатов, чтобы ЮРЛ был понятен, ведь сама функция сохранения не выводит ничего

        Это и плохо. Одна функция -- одно действие. Чем меньше функция знает об окружающем мире -- тем лучше.

        >>А что такое логика переворачивания и где она здесь?
        Это метафора) Я имел ввиду всякую логику, в твоем случае -- вырезание, или что ты там делаешь.

        В общем желаю тебе почитать Фаулера про "код с душком")
        Ответить
    • Да, анон, спасибо за глубокий анализ, теперь страждущих комментариев на собственные высеры понабежит ещё больше...
      Ответить
      • Думаю сайт для этого и создан, чтобы было больше посетителей. Больше кода - больше денег. Всё впереди, в вконтакте рекламы тоже не было поначалу...
        Ответить
        • > Всё впереди, в вконтакте рекламы тоже не было поначалу...

          Хаха, я ещё помню как дуров говорил "обещаю, вконтакте рекламы не будет никогда" )
          Ответить
        • А у меня есть предположение, что на этом сайте Страйкер просто MZZ обкатывает =) Вообще вряд ли, тематика слишком узкая, достаточно большую аудиторию не собрать, да и всё прекрасно понимающее большинство вряд ли станет активно кликать по баннерам.
          Ответить
  • Кто-то изобрёл прямоугольник. Денис Попов застрелился.
    Ответить
  • У вас течёт крыша! Вам уже ничего не поможет. Крышую, недорого. Тел: 555-55-55. Ночью дешевле!
    Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8