LINUX.ORG.RU

[php]петросянство

 


0

1

Есть такая задача: http://www.drupal.ru/node/75865

Реализовал так:

<div id="content">
<div id="newworks">
<h3>Новые работы:</h3>
<?php
{
$number=4;
while($number !=0)
{
$number--;
$image = glob('newwork/*.png');
$gettext = glob('newwork/*.txt');
$getlink = glob('newwork/*.link');
$text = file_get_contents("$gettext[$number]");
$link = file_get_contents("$getlink[$number]");
echo "<div id='genered'><a href='$link'><img src='$image[$number]' width='' height='' border='0'></a><br>$text</div>";
}
}
?>
</div>
Как можно улучшить код, что бы не такое петросянство было?



Последнее исправление: viktorzinchuk (всего исправлений: 1)

Вот от примерно такого кода и получил свою «славу» PHP как говноязыка.

Работать с FS во вьюшке — мощно! :)

resurtm ★★★
()
<div id="content">
<div id="newworks">
<h3>Новые работы:</h3>
<?php foreach ($templateContext['data'] as $key => $item) : ?>
<div id='genered'><a href='<?php echo $item['link'] ?>'><img src='<?php echo $item['image'][$key] ?>' width='' height='' border='0'></a><br><?php echo $item['text'] ?></div>;
<?php endforeach ?>
</div>

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

GateKeeper ★★
()
Ответ на: комментарий от stevejobs

так это жеж пхп, в нем «настоящий» mvc не получится ведь?

Ну почему, вполне получается. Например вот как дела обстоят в Yii Framework (из реального проекта):

Модель City (AR based, в Yii он почти полностью позаимствован из RoR):

<?php

/**
 * @property integer $id primary key
 * @property integer $region_id регион, в котором находится город
 * @property string $title обычное название города
 * @property string $title_url название города, пригодное для использования в ЧПУ и ссылках
 * @property integer $sort сортировочное поле
 * @property integer $main является ли город основным в своем регионе
 * 
 * @property Region $region регион города
 * @property User[] $users пользователи, живущие в городе
 * @property integer $userCount количество пользователей, проживающих в городе
 * 
 * @property $url постоянная ссылка на страницу с городом
 */
class City extends ActiveRecord
{
	/**
	 * Возвращает статическую модель указанного AR класса.
	 * @param string $className имя AR класса
	 * @return City статическая модель AR класса
	 */
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}
	
	public function tableName()
	{
		return '{{city}}';
	}
	
	public function relations()
	{
		return array(
			'region'=>array(self::BELONGS_TO, 'Region', 'region_id'),
			'users'=>array(self::HAS_MANY, 'User', 'city_id'),
			'userCount'=>array(self::STAT, 'User', 'city_id'),
		);
	}
	
	public function defaultScope()
	{
		$ta=$this->getTableAlias(false, false);
		return array(
			// по умолчанию сортируем по названию города, учитывая при этом сортировочное поле
			'order'=>$ta.'.sort DESC, '.$ta.'.title ASC',
		);
	}
	
	/**
	 * Возвращает ссылку на страницу с городом.
	 * @return string ссылка на страницу с городом
	 */
	public function getUrl()
	{
		return Yii::app()->createUrl('city/view', array('titleUrl'=>$this->title_url));
	}
}

Вьюшка index.php:

<?php /* @var $this CityController */ ?>

<h1>Все города</h1>

<ul>
	<?php foreach($cities as $item): ?>
		<li><?php echo CHtml::link($item->title, $item->url); ?></li>
	<?php endforeach; ?>
</ul>

Вьюшка view.php:

<?php /* @var $this CityController */ ?>

<h1><?php echo $city->title; ?></h1>

<p>Регион города: <?php echo $city->region->title; ?></p>
<p>Количество пользователей в городе: <?php echo $city->userCount; ?></p>

Контроллер CityController:

<?php

/**
 * Контроллер для работы с городом.
 */
class CityController extends Controller
{
	/**
	 * Экшн отображает все города сайта.
	 */
	public function actionIndex()
	{
		$cities=City::model()->findAll();
		
		$this->render('index', array(
			'cities'=>$cities,
		));
	}
	
	/**
	 * Экшн отображает один город на сайте. Страница города.
	 * @param string $titleUrl
	 * @throws CHttpException
	 */
	public function actionView($titleUrl)
	{
		$city=City::model()->findByAttributes(array('title_url'=>$titleUrl));
		if($city===null)
			throw new CHttpException(404);
		
		$this->render('view', array(
			'city'=>$city,
		));
	}
}

Coding style — это чисто Yii'шный. Это нормальный MVC в твоем понимании? В том-же Play Framework все примерно так же и работает.

Ну естественно, у меня в проекте еще есть промежуточные слои между M, V, C и слои для агрегации нескольких моделей, например.

resurtm ★★★
()
Ответ на: комментарий от xpahos

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

boombick ★★★★★
()
Ответ на: комментарий от KRoN73

Не шарю в пхп, но разные люди кидали вот эту ссылку: http://ehhu.ru/people/user/6/blog/39857/

Чесна ниасилил понять, о чем говорит этот человек. У меня мвц вполне существует, вот он, на экране.

Забавно, в тексте поста автор спорит со мной, но я никакого Евгения Калитина точно не знаю. wtf?

stevejobs ★★★★☆
()
Ответ на: комментарий от GateKeeper

тогда используй шаблонизатор над шаблонизатором, делов-то

Ну так и использую :)

KRoN73 ★★★★★
()
Ответ на: комментарий от stevejobs

Чесна ниасилил понять, о чем говорит этот человек

Ну, он утверждает, что _идеального_ MVC не существует. Что, впрочем, тоже неверно. Идеальный (т.е. без примесей) MVC сделать можно, только получится сильно непрактично.

А если за идеалом не гнаться, а разделять только на практически полезном уровне, то это всё равно будет MVC.

Более того, я, к примеру, за чистым MVC в своих проектах не гонюсь настолько, что у меня не только львиная доля контроллера вообще скрыта за фреймворком, но нередко класс модели и класс представления совмещены. Глупо делать два класса по 4 строки, когда можно реализовать один класс на 5 строк :) Опять же, с учётом автоматики неявного контроллера. Никто не мешает любой объект описывать чистым MVC, но на практике выгоднее описывать его как модель + части контроллера + шаблон от представления.

KRoN73 ★★★★★
()

Я бы так сделал:

work.txt

[{url: 'host_name/images/img1.png', desc: 'Работа 1'}, {url: 'host_name/images/img2.png', desc: 'Работа 2'}]

$works = json_decode(file_get_contents(«work.txt»));

foreach($works as $work){ echo «<div id='genered'><a href='$work->url'><img src='$work->url' width=" height=" border='0'></a><br>$work->desk</div>»; }

Писал на обум, мог ошибиться, но думаю так гораздо удобнее. И я с друпал ни разу не работал, хз как там)

spiritkhl
()
Ответ на: комментарий от boombick

я б пришел, но денег нет. В пятницу в горы уезжаю :)

xpahos ★★★★★
()
Ответ на: комментарий от xtraeft

Не, заказчик не хочет вообще друпал, ему тупо нужно одну php страницу накатать, весь остальной сайт у него вообще на html написан, так что модули виевса к друпалу тут не нужны.

viktorzinchuk
() автор топика

Переписал так:

<?php
{
$text_file = file('new_works.txt'); //читаем файл
$temp = array_reverse($text_file); //инвертируем массив
$slice_temp = array_slice($temp, 0, 4); //читаем индекс от нуля до четырех

foreach ($slice_temp as $show_new_works) {
echo $show_new_works;
}
}
?>

Структура new_works.txt выглядит так:

<div id="genered"><a href="1.php"><img src="newwork/1.png" width="" height="" border="0"></a><br>Дизайн сайта «<a href="1.php">name1</a>»</div>
<div id="genered"><a href="2.php"><img src="newwork/2.png" width="" height="" border="0"></a><br>Дизайн сайта «<a href="2.php">name2</a>»</div>
<div id="genered"><a href="3.php"><img src="newwork/3.png" width="" height="" border="0"></a><br>Дизайн сайта «<a href="3.php">name3</a>»</div>
<div id="genered"><a href="4.php"><img src="newwork/4.png" width="" height="" border="0"></a><br>Дизайн сайта «<a href="4.php">name4</a>»</div>

viktorzinchuk
() автор топика
Ответ на: комментарий от viktorzinchuk


viktorzinchuk (07.02.2012 10:31:00):

есть же views и panels

Не распарсил, не нагуглил. ССылкУ можно?

sphericalhorse ★★★★★
()
Ответ на: комментарий от viktorzinchuk

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

xtraeft ★★☆☆
()
Ответ на: комментарий от resurtm

Работать с FS во вьюшке — мощно! :)

Работать с MySQL во вьюшке — мощно! :)

Работать с Memcached во вьюшке — мощно! :)

Работать с libastralstorage во вьюшке — мощно! :)

Только внедрение кортинок в код.

one_time837
()
Ответ на: комментарий от one_time837

Не совсем понял к чему сарказм, но уточню: зачем нужны именно файлы во вьюшках? Кэш? Данные? Что-то другое?

Если кэш, то нужен отдельный сервисный абстрактный слой, для работы с кэшированием фрагментов вьюшек. А дальше уже сервисный слой сам решает какой бэкэнд использовать (memcached, файлы на диске и прочее).

Если данные какие-то, то опять-таки или отдельный слой, или запрашивать из моделей, или получать их в контроллерах и передавать уже во вьюшки.

А file_get_contents во view — это идиотизм и отсутствие архитектуры.

MySQL во вьюшке? MySQL нужно использовать в моделях. Это же основы принципа MVC.

resurtm ★★★
()
Ответ на: комментарий от stevejobs

Я солидарен с KRoN73. Эталонного MVC не существует.

А что касается твоего вопроса: надо было уточнить, в каком именно контексте ставился вопрос «а в PHP разве есть MVC?» :)

resurtm ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.