Jump to content

Вопрос программистам


Xenia Wanger
 Share

Recommended Posts

drupal - мой второй любимый движок третий - opencart, несмотря на то что структура у него ужасна... но пришлось полностью его перебрать

Какой-же тогда первый?))

Я, правда, говорил именно в контексте данной темы: что и в нормальных (в целом) движках часто используется шаблонизация без метаязыка, на голом php, хоть эта фича и сомнительна.

 

P.S. Недавно натыкался на любопытную заметку, вот, что особо привлекло моё внимание:

 

Количество строк кода

По этому значению можно косвенно судить о сложности фреймворка/CMS. Начнем с самых жирных

 

Фреймворки

Symfony - 10 000 000 (10 миллионов! понятно откуда тормоза)

Zend - 4 200 000

Yii - 280 000

CodeIgniter - 40 000

Kohana - 12 000

Fat Free Framework - 4 000

 

CMS

Joomla - 800 000

Drupal - 180 000

Wordpress - 140 000

 

Для сравнения:

Debian - 65 000 000

Gentoo - 5 500 000

OpenOffice - 25 000 000

Edited by Vin
Link to comment
Share on other sites

Количество строк кода далеко не показатель. Все зависит от метода загрузки и перегруженности классов, работы с переменными и прочими данными.

Например, голая kohana пользует 4mb памяти против 8mb у Yii. Я уже не говорю про методы оптимизации под эти системы конечных проектов. Иногда встречается такой ужас, что хочется сесть в угол и заплакать.

И чем же так плох php native по сравнению со smarty?

  • Like 3
Link to comment
Share on other sites

 

Количество строк кода

По этому значению можно косвенно судить о сложности фреймворка/CMS

Субъективно, PHP native хуже тем:

1. Сложнее для тех, что не знает php (см. заголовок темы и стр. 2). И просто более громоздко.

2. По порядку, но не по значению: позволяет пихать логику в шаблон.

Edited by Vin
Link to comment
Share on other sites

1. Сложнее для тех, что не знает php (см. заголовок темы и стр. 2). И просто более громоздко.

Найдите отличия:

 

<?=$var?>

{% var %}

 

Если верстальщик начинает биться в истерике из-за двух лишних символов, то нафига он нужен такой? 

Link to comment
Share on other sites

1. Сложнее для тех, что не знает php (см. заголовок темы и стр. 2). И просто более громоздко.
 

Так он для верстки ничем не отличается кроме немного синтаксисом. Запросы к БД никто не заставляет верстальщика делать. А работать с готовыми массивами достаточно по сути циклов и условий.

Link to comment
Share on other sites

Никто в истерике от двух лишних символов биться не начинает.

Значит, по второму пункту возражений нет? Во-многом, именно из-за этого потом с шаблонами невозможно работать, т.к. они склонны обрастать громоздкими конструкциями.

Link to comment
Share on other sites

Простейшая логика такого уровня в шаблонах допустима. Под "логикой", которую нельзя вставлять в шаблоны, имеется в виду немного другое. Конкретно со smarty не работал, но, на первый взгляд (да и по отзывам других) он сам по себе слишком уж разросшийся и больше напоминает отдельный ЯП.

Link to comment
Share on other sites

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

"бизнес логика" не допустима

"логика визуализации" разумеется должна быть (а иначе зачем шаблонизатор)

 

это как бы основы )

Edited by nerv
Link to comment
Share on other sites

Зачем тогда шаблонизатор?

чтобы делать сложные вещи просто :)

 

Лично я смарти использую исключительно для простых вещей вроде цикла, условий и т.п. Переменные в шаблонах не использую.

Выбор в пользу смарти производил не я. Когда я пришел в проект(ы), он уже был там.

Для меня в серверном шаблонизаторе решает читабельность синтаксиса, не более. Проще читать/писать/исправлять меньше, чем больше.

 

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

Тут понятие "логики визуализации" преобразуется в понятие "логики поведения". Пример:

<div ng-show="model.toggle">some content</div>

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

model.toggle = true; // false

для CRUD, на мой взгляд, лучшее решение. И мне не нужно:

1. выбирать элементы по селектору

2. делать element.show() или element.hide();

Edited by nerv
  • Like 1
Link to comment
Share on other sites

Лично я смарти использую исключительно для простых вещей вроде цикла, условий и т.п. Переменные в шаблонах не использую.

Я всё ещё не понимаю зачем шаблонизатор.  Я же могу написать циклы и условия во view на чистом PHP. В чем фича смарти тогда?

Link to comment
Share on other sites

Единственный плюс smarty перед php native - это "безопасность" для верстальщика. Всё остальное надуманно. Вешать подобные плюшки на крупный проект финансово неоправданно, а на малый бессмысленно. 

Его следует использовать только тогда, когда вы продаете cms, расположенную на своих серверах, без доступа к логике, т.е. как услугу (аля narod или ucoz).

Link to comment
Share on other sites

 

Лично я смарти использую исключительно для простых вещей вроде цикла, условий и т.п. Переменные в шаблонах не использую.

Я всё ещё не понимаю зачем шаблонизатор.  Я же могу написать циклы и условия во view на чистом PHP. В чем фича смарти тогда?

 

Ну как минимум пространство имён

Link to comment
Share on other sites

Лично я смарти использую исключительно для простых вещей вроде цикла, условий и т.п. Переменные в шаблонах не использую.

Я всё ещё не понимаю зачем шаблонизатор.  Я же могу написать циклы и условия во view на чистом PHP. В чем фича смарти тогда?
Ну как минимум пространство имён
PHP не стоит на месте и начиная с 5.3 он поддерживает пространства имен. Как-то прочел вот эту статью http://habrahabr.ru/post/178859/ и подумал, а нужно ли на мелких проектах вообще фреймворки? И шаблонизаторы. Edited by wwt
Link to comment
Share on other sites

На самом я тоже считаю, что в PHP вполне православно использовать натив в качестве шаблонизатора. Что касается использования фреймворков для маленьких проектов, то да, нужно обязательно. Во-первых, это быстро для разработки. Во-вторых, это проще поддерживать. Ну и в-третьих любой маленький проект может расти и превращаться в большой.

Link to comment
Share on other sites

Во-первых, это быстро для разработки. Во-вторых, это проще поддерживать. Ну и в-третьих любой маленький проект может расти и превращаться в большой.

 

Ну эти правила  в той или иной степени верны для любого проекта ))) Просто для очень больших и специфичных проектов пишут свой фреймворк либо переписывают один из существующих ))

 

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

 

Smarty вполне можно использовать если ты знаешь зачем он тебе нужен )) Меня к примеру удивляет когда люди используют его когда нужно сделать буквально админку из 2-3 страниц. Это мне кажется глупо. Конечно ничего в этом плохого нет если они рассчитывают что приложение будет развиваться и проект будет рости, а если нет?

Link to comment
Share on other sites

Да что же вы всё с этим похапе-то? Будто других языков нет. Я вот, например, сейчас пишу 95% времени на python — это совсем другой язык, там как в похапе не полчуится. Пишу на django framework. Там шаблонизатор — без него никуда. Изначально тема была про взаимодействие программиста и верстальщика и я ответственно заявил (я правда так считаю, опыт показывает, что так и надо) что верстальщик сам должен работать с шаблонами. Какие они: смарти, похапе или ещё какие — неважно. Главное, что мне кажется, что так правильнее.

Link to comment
Share on other sites

Да что же вы всё с этим похапе-то? Будто других языков нет. Я вот, например, сейчас пишу 95% времени на python — это совсем другой язык, там как в похапе не полчуится. Пишу на django framework. Там шаблонизатор — без него никуда. Изначально тема была про взаимодействие программиста и верстальщика и я ответственно заявил (я правда так считаю, опыт показывает, что так и надо) что верстальщик сам должен работать с шаблонами. Какие они: смарти, похапе или ещё какие — неважно. Главное, что мне кажется, что так правильнее.

Согласен так действительно правильнее имхо. Но это требует от верстальщика знания особенностей разных CMS. Плюс по-любому придется работать в паре с программистом.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By zeiger2
      Здравствуйте! У меня стоит задача, что при наведении на блок li строка должна поменять цвет, в том числе и картинка. Я меняю картинку с помощью 
      background-image: none;     background: url(../img/check_icon_red.png) left no-repeat;   Но теперь картинка позицианируется не там где должна, её можно поставить на место только вручную, через -100px. Нужно поставить ровно туда, где она была. Должна быть в одном ряду с другими
    • By Mix9
      есть див с 5 img, при уменьшении экрана див выходит за него. Я добавил overflow: auto для этого div в надежде на то, что я смогу прокручивать фотки с помощью скроллбара, однако даже с ним почему-то я не вижу часть фоток которые вышли за границу. Что с этим можно сделать? класс video повторяется 5 раз, я тут оставил только 1 
      .content{ width: 90%; background-color: #333; } .video{ margin: 0px 4px 0px 4px; width: 310; display: flex; flex-direction:column; } .video_button_text{ margin-top: 10px; display: flex; flex-direction: row; font-size: 20px; color: white; } .video_text_div{ display: inline-block; width: 250px; } .video_text{ text-align: justify-all; margin: 0px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .slidan_videos{ margin: 0px 10px 0px 20px; overflow: auto; width: auto; margin-bottom: 50px; display: flex; flex-direction: row; justify-content: space-around; } <div class="content"> <div class = slidan_videos> <div class = video> <div> <a href = 'ссылка'><img class="img" src=""картинка"></a> </div> <div class = video_button_text> <div class = avatarka_div> <a href="ссылка" target="_blank"><img class = avatarka src="картинка"></a> </div> <div class = video_text_div> <p class = video_text><a href="ссылка">текст</a></p> </div> </div> </div>
    • By Марко
      Добрый день. Начинающий программист, столкнулся с проблемой. Селектор .class не работает должным образом. Несмотря на правильное, я надеюсь, описание, на web-странице не отображается ни одно изображение. С чем может быть связано? Заранее спасибо за помощь. 



    • By Kaido
      Использую готовый плагин для модальных окон(от MaxGraph). Проблема в том, что когда у меня открыто два модальных окна, для примера Форма + Политика конфендициальности, и мне нужно закрыть политику вместе с ней закрывается и другое модальное окно. В JS я не сильно разбираюсь(собственно из за этого и использую готовый плагин), можете помочь кто работал с этим плагином? Я примерно понимаю как он работает, но реализовать чтобы закрывалось только одно не получается.
       
        <div class="content"> <button class="modal-btn" data-path="first" data-animation="fadeInUp" data-speed="1500">Открыть окно 1</button> </div> <div class="modal"> <div class="modal__wrapp" data-target="first"> <div class="modal__content"> <button class="modal__close">Закрыть</button> модальное окно <button data-path="policy">Политика</button> </div> </div> <div class="modal__wrapp" data-target="policy"> <div class="modal__content"> <button class="modal__close">Закрыть</button> политика </div> </div> </div> .modal { --transition-time: 0.3s; position: fixed; left: 0; top: 0; right: 0; bottom: 0; z-index: 1000; cursor: pointer; overflow-y: auto; overflow-x: hidden; text-align: center; opacity: 0; visibility: hidden; transition: opacity var(--transition-time), visibility var(--transition-time); } .modal__wrapp { display: none; cursor: default; width: fit-content; height: fit-content; } .modal__content{ position: absolute; left: 500px; width: 500px; height: 500px; display: flex; color: white; flex-direction: column; text-align: left; background-color: #000; } .modal__content button{ width: 200px; height: 50px; margin: 50px 0; } .modal.is-open { opacity: 1; visibility: visible; transition: opacity var(--transition-time), visibility var(--transition-time); } .modal__wrapp.modal-open { display: flex; } .disable-scroll { position: relative; overflow: hidden; height: 100vh; position: fixed; left: 0; top: 0; width: 100%; } .fade { opacity: 0; transition: opacity var(--transition-time); } .fade.animate-open { opacity: 1; transition: opacity var(--transition-time); } .fadeInUp { opacity: 0; transform: translateY(vw(-100)); transition: opacity var(--transition-time), transform var(--transition-time); } .fadeInUp.animate-open { opacity: 1; transform: translateY(0); transition: opacity var(--transition-time), transform var(--transition-time); } .modal__wrapp[data-target="policy"] .modal__content{ left: 1050px; background-color: #000; opacity: .5; } class Modal { constructor(options) { let defaultOptions = { isOpen: () => {}, isClose: () => {}, } this.options = Object.assign(defaultOptions, options); this.modal = document.querySelector('.modal'); this.speed = false; this.animation = false; this.isOpen = false; this.modalContainer = false; this.previousActiveElement = false; this.fixBlocks = document.querySelectorAll('.fix-block'); this.focusElements = [ 'a[href]', 'input', 'button', 'select', 'textarea', '[tabindex]' ]; this.events(); } events() { if (this.modal) { document.addEventListener('click', function(e){ const clickedElement = e.target.closest('[data-path]'); if (clickedElement) { let target = clickedElement.dataset.path; let animation = clickedElement.dataset.animation; if (clickedElement.classList.contains('modal-close')) { this.close(); } let speed = clickedElement.dataset.speed; this.animation = animation ? animation : 'fade'; this.speed = speed ? parseInt(speed) : 300; this.modalContainer = document.querySelector(`[data-target="${target}"]`); this.open(); return; } if (e.target.closest('.modal__close')) { this.close(); return; } }.bind(this)); window.addEventListener('keydown', function(e) { if (e.keyCode == 27) { if (this.isOpen) { this.close(); } } if (e.keyCode == 9 && this.isOpen) { this.focusCatch(e); return; } }.bind(this)); this.modal.addEventListener('click', function(e) { if (!e.target.classList.contains('modal__wrapp') && !e.target.closest('.modal__wrapp') && this.isOpen) { this.close(); } }.bind(this)); } } open() { this.previousActiveElement = document.activeElement; this.modal.style.setProperty('--transition-time', `${this.speed / 1000}s`); this.modal.classList.add('is-open'); this.disableScroll(); this.modalContainer.classList.add('modal-open'); this.modalContainer.classList.add(this.animation); setTimeout(() => { this.options.isOpen(this); this.modalContainer.classList.add('animate-open'); this.isOpen = true; this.focusTrap(); }, this.speed); } close() { if (this.modalContainer) { this.modalContainer.classList.remove('animate-open'); this.modalContainer.classList.remove(this.animation); this.modal.classList.remove('is-open'); this.modalContainer.classList.remove('modal-open'); this.enableScroll(); this.options.isClose(this); this.isOpen = false; this.focusTrap(); } } focusCatch(e) { const focusable = this.modalContainer.querySelectorAll(this.focusElements); const focusArray = Array.prototype.slice.call(focusable); const focusedIndex = focusArray.indexOf(document.activeElement); if (e.shiftKey && focusedIndex === 0) { focusArray[focusArray.length - 1].focus(); e.preventDefault(); } if (!e.shiftKey && focusedIndex === focusArray.length - 1) { focusArray[0].focus(); e.preventDefault(); } } focusTrap() { const focusable = this.modalContainer.querySelectorAll(this.focusElements); if (this.isOpen) { focusable[0].focus(); } else { this.previousActiveElement.focus(); } } disableScroll() { let pagePosition = window.scrollY; this.lockPadding(); document.body.classList.add('disable-scroll'); document.body.dataset.position = pagePosition; document.body.style.top = -pagePosition + 'px'; } enableScroll() { let pagePosition = parseInt(document.body.dataset.position, 10); this.unlockPadding(); document.body.style.top = 'auto'; document.body.classList.remove('disable-scroll'); window.scroll({ top: pagePosition, left: 0 }); document.body.removeAttribute('data-position'); } lockPadding() { let paddingOffset = window.innerWidth - document.body.offsetWidth + 'px'; this.fixBlocks.forEach((el) => { el.style.paddingRight = paddingOffset; }); document.body.style.paddingRight = paddingOffset; } unlockPadding() { this.fixBlocks.forEach((el) => { el.style.paddingRight = '0px'; }); document.body.style.paddingRight = '0px'; } } const modal = new Modal({ isOpen: (modal) => { console.log(modal); console.log('opened'); }, isClose: () => { console.log('closed'); }, });  
    • By stasN1
      Мне нужен такой результат :

      Не понимаю почему background не применяется вокруг иконок:

       
      Сам код:
      Html:
      css:

      Html:
      <section class="finish"> <div class="container"> <h2 class="finish_header">По окончании обучения Вы сможете!</h2> <div class="finish_divider"></div> <div class="finish_wrapper"> <finish_item> <div class="finish_round"> <img src="/icons/finish/1 (1).png" alt="" class="finish_icon"> </div> <div class="finish_descr">Создать свой сайт или блог</div> </finish_item> <finish_item> <div class="finish_round"> <img src="/icons/finish/2.png" alt="" class="finish_icon"> </div> <div class="finish_descr">Создать свой сайт или блог</div> </finish_item> <finish_item> <div class="finish_round"> <img src="/icons/finish/3.png" alt="" class="finish_icon"> </div> <div class="finish_descr">Обеспечить ему медленный, но верный рост в ТОП</div> </finish_item> <finish_item> <div class="finish_round"> <img src="/icons/finish/4.png" alt="" class="finish_icon"> </div> <div class="finish_descr">Достигнуть стабильного прироста посетителей</div> </finish_item> <finish_item> <div class="finish_round"> <img src="/icons/finish/5.png" alt="" class="finish_icon"> </div> <div class="finish_descr">Достигнуть стабильного прироста посетителей</div> </finish_item> </div> </div> </section>  
      Css:
      .finish .finish_wrapper { margin-top: 41px; display: flex; justify-content: space-between; } .finish .finish_wrapper .finish_item { width: 204px; } .finish .finish_wrapper .finish_item .finish_round { width: 115px; height: 115px; background-color: #b4e2ff; border-radius: 8px; } .finish_descr { font-family: Roboto; font-size: 17px; line-height: 20px; font-weight: 300; color: #efefef; Спасибо!
       

      Уже решил, спасибо!
      У меня CSS селектор вида:
      .finish .finish_wrapper .finish_item .finish_round

      А должен быть:
      .finish .finish_wrapper finish_item .finish_round
      Т.е. без точки перед finish_item, так как это не класс, а элемент

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy