Вопросы по Web-программированию |
Здравствуйте, гость ( Авторизация | Регистрация )
Вопросы по Web-программированию |
29.07.2013, 22:26
Сообщение
#281
|
|
Игровой Бог первой степени Репутация: 1167 Группа: Участник Сообщений: 9404 Награды: 5 Регистрация: 15.03.2007 |
мороки много =( а MVC это разделение на логику модели, отображения и контроллера, т.е. вполне, я щитаю, можно искользовать для логики отображения конструкции типа
Код blablabla <div> bla bla bla Собственно, я теперь так и делаю без помещения html кода в переменную: Код $html = "blablabla ".echo model::foo()."";
if (blablabla){ echo $html; } Сообщение отредактировал SaneX - 29.07.2013, 22:40 -------------------- |
 
|
|
|
|
29.07.2013, 22:30
Сообщение
#282
|
|
Мастер Игры Репутация: 248 Группа: Участник Сообщений: 1363 Награды: 4 Регистрация: 08.03.2010 |
Но если сохранить в сессии объект класса, то он добавляется в сессию, однако после обновления старницы значения переменных объекта удаляются из сессии. Вообще паттерн mvc и предназначен для жесткого разделения исполняемого кода и произвольных данных. Вы же, сохраняя класс (который является вместилищем и исполняемого кода тоже) по сути сводите на нет все усилия. Лучше реализуйте сериализацию данных и обратное восстановление при записи в сессию и из нее соответственно. Несмотря на то, что данные сессии хранятся на сервере во временных файлах, от повреждения файлов никто не застрахован, и лучше пусть повредятся произвольные данные, чем повредится исполняемый код, что приведет к непредсказуемым результатам. -------------------- Набор шейдеров для S.T.A.L.K.E.R: Shadow of chernobyl: ECB-Shaderpack -
------ Продюсер электронной музыки в стиле Dark Ambient, автор саундтрека для Desowave S.T.A.L.K.E.R.: Lost Alpha. |
 
|
|
29.07.2013, 22:34
Сообщение
#283
|
|
Игровой Бог первой степени Репутация: 1167 Группа: Участник Сообщений: 9404 Награды: 5 Регистрация: 15.03.2007 |
Но если сохранить в сессии объект класса, то он добавляется в сессию, однако после обновления старницы значения переменных объекта удаляются из сессии. Вообще паттерн mvc и предназначен для жесткого разделения исполняемого кода и произвольных данных. Вы же, сохраняя класс (который является вместилищем и исполняемого кода тоже) по сути сводите на нет все усилия. Лучше реализуйте сериализацию данных и обратное восстановление при записи в сессию и из нее соответственно. Несмотря на то, что данные сессии хранятся на сервере во временных файлах, от повреждения файлов никто не застрахован, и лучше пусть повредятся произвольные данные, чем повредится исполняемый код, что приведет к непредсказуемым результатам. Вы мне советуете с точки зрения опытного разработчика, я же дай бог новичек, у меня это чисто чтобы время убить. Проект, в котором я все это делаю, с вероятностью 98% никогда в сеть не попадет. Так что я особо не заморачиваюсь. Просто потихоньку делаю что-то. По поводу MVC, я уж щас глобально переделывать не буду, пусть будет как есть - функции отдельно, код отображения отдельно без всяких регулярок, шаблонов и прочего. Сообщение отредактировал SaneX - 29.07.2013, 22:35 -------------------- |
 
|
|
29.07.2013, 22:36
Сообщение
#284
|
|
Мастер Игры Репутация: 248 Группа: Участник Сообщений: 1363 Награды: 4 Регистрация: 08.03.2010 |
мороки много =( а MVC это разделение на логику модели, отображения и контроллера, т.е. вполне, я щитаю, можно искользовать для логики отображения конструкции типа Код blablabla ololololol Собственно, я теперь так и делаю без помещения html кода в переменную: Код $html = "blablabla ".echo model::foo().""; if (blablabla){ echo $html; } Если уже подходить последовательно, то модель данных у вас уже есть - это база данных. В ней еще и часть логики вида есть - есть ведь такие штуки как view, которые позволяют делать весьма сложные выборки из таблиц. Тоесть вам по сути надо написать контроллер и шаблонизатор. Остальное уже - это программирование БД. -------------------- Набор шейдеров для S.T.A.L.K.E.R: Shadow of chernobyl: ECB-Shaderpack -
------ Продюсер электронной музыки в стиле Dark Ambient, автор саундтрека для Desowave S.T.A.L.K.E.R.: Lost Alpha. |
 
|
|
29.07.2013, 22:43
Сообщение
#285
|
|
Игровой Бог первой степени Репутация: 1167 Группа: Участник Сообщений: 9404 Награды: 5 Регистрация: 15.03.2007 |
Цитата по сути надо написать контроллер У меня контроллер выбирает из адреса страницы "site.ru/item/1" переменные, к примеру "1", и по ним уже работает модель. Ещё создает объекты класса модели и вью. Ещё назначает общий шаблон для страницы и подключает файл "страница_view.php" Что ещё он должен делать? PS: базовую реализацию я честно стащил с хабры, т.к. с нуля мне не это не по зубам =) Сообщение отредактировал SaneX - 29.07.2013, 22:49 -------------------- |
 
|
|
29.07.2013, 23:03
Сообщение
#286
|
|
Мастер Игры Репутация: 248 Группа: Участник Сообщений: 1363 Награды: 4 Регистрация: 08.03.2010 |
Цитата по сути надо написать контроллер У меня контроллер выбирает из адреса страницы "site.ru/item/1" переменные, к примеру "1", и по ним уже работает модель. Ещё создает объекты класса модели и вью. Ещё назначает общий шаблон для страницы и подключает файл "страница_view.php" Что ещё он должен делать? PS: базовую реализацию я честно стащил с хабры, т.к. с нуля мне не это не по зубам =) Честно говоря то что там на хабре написано ничего кроме фейспалма не вызывает. Да кстати избегайте делать страницы сайта в виде http://сайт/раздел/ только http://сайт/раздел.htm и именно .htm, не .php и тем более не урл со слешем в конце. Очень плохая практика, так как противоречит всем писанным стандартам. Работать в браузере будет, но так делать не стОит. На то есть много причин. Также избегайте как кириллики в урл, так и параметров вроде http://сайт/чтототам.php?var1=многа_многа_букаф Для параметров запроса есть POST или сессии, GET-запросы в свое время были временным костылем, когда в начале 90-х ничего не оставалось как передавать параметры CGI-скриптам таким образом. -------------------- Набор шейдеров для S.T.A.L.K.E.R: Shadow of chernobyl: ECB-Shaderpack -
------ Продюсер электронной музыки в стиле Dark Ambient, автор саундтрека для Desowave S.T.A.L.K.E.R.: Lost Alpha. |
 
|
|
29.07.2013, 23:08
Сообщение
#287
|
|
Игровой Бог первой степени Репутация: 1167 Группа: Участник Сообщений: 9404 Награды: 5 Регистрация: 15.03.2007 |
Цитата только http://сайт/раздел.htm и именно .htm, не .php и тем более не урл со слешем в конце. хм. на будущее усвою, но все же, чем плохо? Тот же d3 открываю, а там: Цитата тем более не урл со слешем в конце у меня щас редирект идет со ссылки вида "site.ru/item/1/" на "site.ru/item/1" Сообщение отредактировал SaneX - 29.07.2013, 23:10 -------------------- |
 
|
|
29.07.2013, 23:10
Сообщение
#288
|
|
Gameru DA Репутация: 3704 Группа: Администратор Сообщений: 10206 Награды: 4 Регистрация: 03.02.2006 |
Да кстати избегайте делать страницы сайта в виде http://сайт/раздел/ только http://сайт/раздел.htm и именно .htm, не .php и тем более не урл со слешем в конце. Работать в браузере будет, но так делать не стОит. На то есть много причин. так и параметров вроде http://сайт/чтототам.php?var1=многа_многа_букаф Готов выслушать пояснение "из первых рук", т.к. в гугле мнений находится много и разных -------------------- |
 
|
|
29.07.2013, 23:29
Сообщение
#289
|
|
Мастер Игры Репутация: 248 Группа: Участник Сообщений: 1363 Награды: 4 Регистрация: 08.03.2010 |
Да кстати избегайте делать страницы сайта в виде http://сайт/раздел/ только http://сайт/раздел.htm и именно .htm, не .php и тем более не урл со слешем в конце. Работать в браузере будет, но так делать не стОит. На то есть много причин. так и параметров вроде http://сайт/чтототам.php?var1=многа_многа_букаф Готов выслушать пояснение "из первых рук", т.к. в гугле мнений находится много и разных Да зачем далеко ходить - возьмите какой-нибудь wget или прочие скачивалки сайтов и посмотрите как бедная программа пытается скачивать html-код в inode директории вместо inode файла. А теперь представьте - на таком же принципе работают и поисковые боты. Аналогично и с кирилликой в именах файлов, которая превращается в жуткую строку состоящую на треть из знаков процента. О страничках с гет-запросами все еще веселее - не всякие оси позволяют сохранять файлы, с символом знака вопроса в filename. -------------------- Набор шейдеров для S.T.A.L.K.E.R: Shadow of chernobyl: ECB-Shaderpack -
------ Продюсер электронной музыки в стиле Dark Ambient, автор саундтрека для Desowave S.T.A.L.K.E.R.: Lost Alpha. |
 
|
|
02.08.2013, 22:51
Сообщение
#290
|
|
Игровой Бог первой степени Репутация: 1167 Группа: Участник Сообщений: 9404 Награды: 5 Регистрация: 15.03.2007 |
Нид хелп!
Есть функция: Код public function bd_query($query) { static $query = false; if (!$query){ $query = func_get_arg(0); return mysqli_fetch_array($query); } else { return mysqli_fetch_array($query); } } Вызываю её многократно вот так: Код public function send_messages_query() { $query = Model::sql_select_few_where_one('id', 'caption', 'dest', 'date','messages', 'autor="'.$_SESSION['login'].'"'); return model::bd_query($query); } public function admin_sales_query() { $query = Model::sql_select_few('id', 'user', 'date', 'name', 'price', 'items'); return model::bd_query($query); } public function admin_users_query() { $query = Model::sql_select_few('id', 'login', 'email', 'reg_date', 'users'); return model::bd_query($query); } public function admin_items_query() { $query = Model::sql_select_few('id', 'name', 'price', 'filename', 'text', 'catalog'); return model::bd_query($query); } Но аргумент $query в эту функцию передаётся только от первого вызова. Дальше - выводятся пустые строки. Т.е. к примеру: Код public function admin_sales_query() { $query = Model::sql_select_few('id', 'user', 'date', 'name', 'price', 'items'); return model::bd_query($query); } ...выдаст результат. А вот следующий вызов в: Код public function admin_users_query() { $query = Model::sql_select_few('id', 'login', 'email', 'reg_date', 'users'); return model::bd_query($query); } Не выдаст никаких ошибок, но результат будет абсолютно пустым. Я так понял дело в Код if (!$query){ , но как пофиксить не понял =)
Сообщение отредактировал SaneX - 02.08.2013, 23:04 -------------------- |
 
|
|
02.08.2013, 23:07
Сообщение
#291
|
|
Gameru DA Репутация: 3704 Группа: Администратор Сообщений: 10206 Награды: 4 Регистрация: 03.02.2006 |
bd_query($query) Хочется взять и... наругать. Не привыкай называть функции (переменные, поля в бд) калькой с рус. слов, db_query раз уж на то пошло. Код if (!$query){, но как пофиксить не понял =) Код public function bd_query($query)
{ if (!$query) return FALSE; return mysqli_fetch_array($query); } -------------------- |
 
|
|
02.08.2013, 23:11
Сообщение
#292
|
|
Игровой Бог первой степени Репутация: 1167 Группа: Участник Сообщений: 9404 Награды: 5 Регистрация: 15.03.2007 |
bd_query($query) Хочется взять и... наругать. Не привыкай называть функции калькой с рус. слов, db_query раз уж на то пошло. Код if (!$query){, но как пофиксить не понял =) Код public function bd_query($query) { if (!$query) return FALSE; return mysqli_fetch_array($query); } Выдает бесконечный цикл 1-й искомой строки в БД, т.к. вызываю её потом вот так: Код while ($row = admin_items_query()){ echo Бла-бла-бла } Условие Код static $query = false; if (!$query){ $query = func_get_arg(0); return mysqli_fetch_array($query); } else { return mysqli_fetch_array($query); } это фиксит. Я конечно могу сделать так в каждой функции: Код public function admin_users_query() { static $query = false; if (!$query){ $query = Model::sql_select_few('id', 'login', 'email', 'reg_date', 'users'); return mysqli_fetch_array($query); } else { return mysqli_fetch_array($query); } } Но это сильно увеличивает объем повторяемого кода в функциях. Сообщение отредактировал SaneX - 02.08.2013, 23:17 -------------------- |
 
|
|
05.08.2013, 19:22
Сообщение
#293
|
|
Игровой Бог первой степени Репутация: 1167 Группа: Участник Сообщений: 9404 Награды: 5 Регистрация: 15.03.2007 |
Я, кстати, так и не решил проблему.
-------------------- |
 
|
|
06.08.2013, 22:36
Сообщение
#294
|
|
Продвинутый геймер Репутация: 74 Группа: Забанен Сообщений: 359 Награды: 2 Регистрация: 24.08.2007 |
SaneX,
Попробуй так CODE public function bd_query($query) { global $query; if (!$query){ $query = func_get_arg(0); return mysqli_fetch_array($query); } else { return mysqli_fetch_array($query); } } CODE public function send_messages_query() { $query = Model::sql_select_few_where_one('id', 'caption', 'dest', 'date','messages', 'autor="'.$_SESSION['login'].'"'); $result = model::bd_query($query); $query = false; return $result; } public function admin_sales_query() { $query = Model::sql_select_few('id', 'user', 'date', 'name', 'price', 'items'); $result = model::bd_query($query); $query = false; return $result; } public function admin_users_query() { $query = Model::sql_select_few('id', 'login', 'email', 'reg_date', 'users'); $result = model::bd_query($query); $query = false; return $result; } public function admin_items_query() { $query = Model::sql_select_few('id', 'name', 'price', 'filename', 'text', 'catalog'); $result = model::bd_query($query); $query = false; return $result; } |
 
|
|
06.08.2013, 22:47
Сообщение
#295
|
|
Игровой Бог первой степени Репутация: 1167 Группа: Участник Сообщений: 9404 Награды: 5 Регистрация: 15.03.2007 |
Нет, не, выполняется только 1-й вызов функции, последующие вызовы перескакивают на "else" условия.
-------------------- |
 
|
|
08.08.2013, 11:56
Сообщение
#296
|
|
Игровое Воплощение Репутация: 384 Группа: Участник Сообщений: 4718 Награды: 9 Регистрация: 21.05.2008 |
Код Ошибка 1 Тип "System.Web.Mvc.ModelClientValidationRule" существует как в "c:\Program Files\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\System.Web.Mvc.dll", так и в "c:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Web.WebPages\v4.0_2.0.0.0__31bf3856ad364e35\System.Web.WebPages.dll" C:\Users\Nuan\Desktop\дополнительные материалы\Гайдар Магдануров - ASP.Net MVC 3 видеоуроки\Дополнительные материалы\ASP MVC 3 - Part5\StartSample\Models\AccountModels.cs 243 28 MvcTrainingApp Опа... не ожидал ) и какой из них то? |
 
|
|
09.08.2013, 17:10
Сообщение
#297
|
|
Игровое Воплощение Репутация: 384 Группа: Участник Сообщений: 4718 Награды: 9 Регистрация: 21.05.2008 |
На всякий случай сообщаю что проблема решена переустановкой .net.
Теперь вопрос такой, написал модульный тест типа : Код [TestMethod] public void Correct_Total_Reduction_Amount() { // Организация FakeRepository repo = new FakeRepository(); decimal reductionAmount = 10; decimal initialTotal = repo.GetTotalValue(); MyPriceReducer target = new MyPriceReducer(repo); // Действие target.ReducePrices(reductionAmount); // Утверждение Assert.AreEqual(repo.GetTotalValue(), (initialTotal - (repo.GetProducts().Count() * reductionAmount))); } Запускаю, ошибок не пишет, но остановить его вообще никак... и не перезапустить тест, не выполнить программу сволочь не дает... Только если закрыть и открыть заного... Может кто сталкивался? |
 
|
|
11.08.2013, 15:21
Сообщение
#298
|
|
Игровое Воплощение Репутация: 384 Группа: Участник Сообщений: 4718 Награды: 9 Регистрация: 21.05.2008 |
Цитата Собственно чтобы выучить Asp.net я стал читать книгу : Сандерсон С - ASP.NET MVC3 Framework с примерами на C# для профессионалов (третье издание) - 2012
В 5 главе, сначала мы эмулируем данные с помощью Moq: Код C# 1 2 3 4 5 6 7 Mock<IProductsRepository> mock = new Mock<IProductsRepository>(); mock.Setup(m => m.Products).Returns(new List<Product> { new Product { Name = "Football", Price = 25 }, new Product { Name = "Surf board", Price = 179 }, new Product { Name = "Running shoes", Price = 95 } }.AsQueryable()); ninjectKernel.Bind<IProductsRepository>().ToConstant(mock.Object); Далее в контроллере: Код C# 1 2 3 4 5 6 7 8 9 10 11 12 13 public class ProductController : Controller { private IProductsRepository repository; public ProductController(IProductsRepository productRepository) { repository = productRepository; } public ViewResult List() { return View(repository.Products); } } Сам List : Код HTML 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @model IEnumerable<SportsStore.Domain.Entities.Product> @{ ViewBag.Title = "List"; } <h2>List</h2> <div> @foreach(var p in Model) { <p>@p.Name </p> <p>@p.Description</p> <p>@p.Price.ToString("c")</p> } </div> При этом все работает и выдает список , как и должен быть. Теперь по книге мы создаем БД и добавляем в Web.config строку подключения: Код HTML 1 2 3 4 5 <connectionStrings> <add name="EFDbContext" connectionString="Data Source=NUAN-ПК\SQLEXPRESS;Initial Catalog=SportsStore;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient" /> </connectionStrings> Я создал проект который тупо к ней подключался чтобы менять\добавлять данные и т.п., оттуда и взял строку. Далее: EFDbContext Код C# 1 2 3 4 5 6 7 namespace SportsStore.Domain.Concrete { class EFDbContext { public DbSet<Product> Products { get; set; } } } Сам Product: Код C# 1 2 3 4 5 6 7 8 9 10 11 namespace SportsStore.Domain.Entities { public class Product { public int ProductID { get; set; } public string Name { get; set; } public string Description { get; set; } public string Category { get; set; } public decimal Price { get; set; } } } Далее IProductsRepository и EFProductRepository Код C# 1 2 3 4 5 6 7 namespace SportsStore.Domain.Abstract { public interface IProductsRepository { IQueryable<Product> Products { get; } } } Код C# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 namespace SportsStore.Domain.Concrete { public class EFProductRepository : IProductsRepository { private EFDbContext context = new EFDbContext(); public IQueryable<Product> Products { get { return context.Products; } } } Вылетает с ошибкой: HTML Ссылка на объект не указывает на экземпляр объекта. Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода. Сведения об исключении: System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. Ошибка источника: Строка 8: <div> Строка 9: Строка 10: @foreach(var p in Model) Строка 11: { Строка 12: <p>@p.Name </p> } в строке 10 , при отладке почему то реализации = null Перепробовал все что только можно, проверил подключение к базе, да она работает... Могу скинуть полностью весь проект. Помогите бился весь вечер, а научиться хочется. |
 
|
|
02.12.2013, 10:42
Сообщение
#299
|
|
Игровой Бог первой степени Репутация: 1167 Группа: Участник Сообщений: 9404 Награды: 5 Регистрация: 15.03.2007 |
Вопрос появился.
Есть код: Код $full_url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $explode = explode('://', $full_url); if (preg_match('#//+#', $explode[1]) > 0) { $new_url = preg_replace('#//+#', '/', $explode[1]); $new_url = preg_replace("#/$#", "", $new_url); $new_url = 'http://'.$new_url; exit("<meta http-equiv='refresh' content='0; url=".$new_url."'>"); } Мы получаем полную ссылку на текущую страницу, удаляем из неё http:// и в оставшейся строке заменяем все символы '/' больше одного на один '/'. Всё работает прекрасно. Но почему, если заменить Код exit("<meta http-equiv='refresh' content='0; url=".$new_url."'>"); на Цитата header('Location:'.$new_url); , то при выполнении условия страница уходит в циклическую переадресацию? Сообщение отредактировал SaneX - 02.12.2013, 10:42 -------------------- |
 
|
|
02.12.2013, 12:45
Сообщение
#300
|
|
Игровой Бог первой степени Репутация: 1167 Группа: Участник Сообщений: 9404 Награды: 5 Регистрация: 15.03.2007 |
первый и последний ап
-------------------- |
 
|
|
Текстовая версия | Сейчас: 23.05.2024, 17:30 |