За последние 24 часа нас посетили 17930 программистов и 1719 роботов. Сейчас ищут 917 программистов ...

Контроллеры

Тема в разделе "PHP для новичков", создана пользователем Evpatiy, 31 мар 2016.

  1. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Да, это аргумент в пользу гибкости языка, потому что можно добавлять не существующий официально функционал, имитируя любое поведение, какое тебе нужно. А в новой редакции таки ввели классы самделишные и приватные свойства честные. Но он пока еще не стандартизирован для браузеров, емнип.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    В новой редакции и хешмапы ввели. В новой редакции осталась одна проблема - конкатенатор. Усё. И js станет отличным языком. А пока он для меня хоть и сильный, но ещё убогий. :D
     
  3. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Ты про что? В ES6 есть Object.assign() для объединения объектов также есть наследование классов, в ES5 есть Array.prototype.concat() для объединения массивов.

    Ты что конкретно имел в виду по словом "конкатенатор"?
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    https://jsfiddle.net/6y5cee0a/

    Надо правильно готовить уметь, чтобы не было отравления. А "+" в качестве конкатенатора юзается везде. Ну..кроме php.

    И снова это никак не опровергает тезис, что "JS более гибкий язык, чем PHP". Никак. А ты почуть включаешь демагогию, пытаясь увести суть в сторону. Не нужно. Детальное сравнение языков - это отдельная тема. А детальное сравнение языков, которые существуют в разных экосистемах и под разными парадигмами - вообще глупость как по мне. Хоть JS и пытается лезть на сервер, но это, как по мне, жесть не нужная.

    Просто прими факт, что когда я говорил, что JS- более гибкий язык, я не пустословил. Свои слова я подкрепил и не раз. А остальные моменты - это уже совсем другая история. Ты привык всегда быть правым, но сейчас ты не прав. И тут нет ничего плохого.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    при прочих равных лучше, когда есть конкатенатор.

    я говорю, что мне не нравится. Из того, что мне не нравится сегодня, завтра останется только одно - конкатенатор. Так что ура, победа, чо.
     
  7. Evpatiy

    Evpatiy Новичок

    С нами с:
    11 ноя 2015
    Сообщения:
    43
    Симпатии:
    0
    А для каких задач такой фарш хорош? Код читают гораздо чаще чем пишут, логично что предпочитают деревянный jquery и стараются не залезать глубоко в "гибкость" - как потом тестировать-то? А поддерживать?
     
  8. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Как так и даже не интересно что это за такая волшебная функция $?

    Добавлено спустя 3 минуты 50 секунд:
    Я изобрёл конкатератор!
    Код (PHP):
    1. function concat(one, two) {
    2.   return new String(one) + new String(two);
    3. }
    4.  
    5. concat(1, 1); // -> '11'
    6. concat(1.34, ' Здесь был Вася') // -> '1.34 Здесь был Вася'
    Добавлено спустя 45 секунд:
    Ладно я пошутил, но в каждой шутке есть доля правды.
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Фарш - понятие относительное. Для человека, далекого от кодов как таковых - html является фаршем. Для дизайнера-верстальщика php является фаршем. Для phpшника код на С++ является фаршем. И тд. Для меня код, написанный на JS по законам JS фаршем не является, потому что воспринимается логично и последовательно. Просто JS это JS. Там именно что другой образ мышления.
    Которая, к слову, уже нафиг не нужна.
    И это все работает уже сейчас и активно используется уже сегодня. И работает гораздо быстрее, чем $, перебирающая все дерево рекурсивно. Хотя хз, мб в последних версиях jQuery содержимое $ упразднили и она не более чем обертка над нативной querySelectorAll.
     
  10. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Ну если тянуть jQuery ради одной функции то да. Она ведь возвращает объект jQuery, что позволяет строить красивые цепочки.

    Хотя и jQuery уже нафик не нужна, как месяц уже пишу на нативном js и не жалусь, а если что то не хватает всегда можно подтянуть маленькую библиотеку для этого хотя это уже другая история...
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Есть четкий тренд делать толстый фронт-энд. Уже никто не экономит килобайты. Только склеивают файлики чтобы открывались быстрее.

    Знать js конечно надо, но пытаться не использовать библиотеки по-моему глупо.
     
  12. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    artoodetoo, только что твой ник светился красным как у админа, обновил страницу и стал прежним? Косп моросит, я морошу(не спал нормаль), или что-то еще:?
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    зрение давно проверял?
    шутка. просто тестировал — новые чакры не открылись. зато тут же все кинулись спрашивать: "ааа чотакоэ?". лучше уж быть как все. ;)
     
  14. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Очень.

    Добавлено спустя 6 минут 21 секунду:
    Вот оно что михалыч!

    Добавлено спустя 9 минут 11 секунд:
    artoodetoo, получается скоро будут какие то сдвиги?
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    нет, я так не думаю.
     
  16. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Печально...

    Добавлено спустя 4 минуты 19 секунд:
    А я ведь уже жратву добровольцам таскать собрался.
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Эти цепочки реализуются на раз два. Просто возвращай из функции наружу ее this.

    Я вот давно заметил, что из жиквери юзаю только аякс, по-сути. Тут не вопрос принципиального не использования, а, скорее, вопрос того, что кодинг на jQuery - это лютый лютый "snippet style". Просто по той причине, что jQuery это вещь в себе. А когда нужно что-то написать с какой-то логикой сложнее свистоперделки, jQuery становится уже неудобна. Да, ранее ее можно было юзать просто ради $, но сейчас и оно не надо как-то. Нативный QuerySelectorAll в разы мощнее.
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я из жука юзаю по сути только селекторы и их методы, .val(), .text() и ещё что-то, что не вспомнить. Раньше юзал больше. Сейчас стал скатываться к коду "накинь класс, сними класс", который можно и без жука мутить. UI не юзаю давно уже.
     
  19. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Это тоже без проблем доступно из нейтива. Только не как методы, а как свойства: .value .innerText
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да. Вообще даже накидывание класса и снятие класса тоже нативно без дублирования работает через
    Код (PHP):
    1. this.classList.remove('bad');
    2. this.classList.add('good');
     
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    В общем, из JQuery только их реализация AJAX и тащит пока что. Но и то, просто потому, что влом свою запиливать, при том, что при желании это делается довольно быстро.
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я на основе jQuery запилил вот чо
    Код (PHP):
    1. /**
    2.  * @param options
    3.  var defaults = {
    4.     url: '',
    5.     data: {},
    6.     onSuccess: false,
    7.     onError: false,
    8.     onFail: false,
    9.     popupOnSuccess: false,
    10.     popupOnError: false,
    11.     messageOnSuccess: false,
    12.     messageOnError: false,
    13.     redirect: false,
    14.   };
    15.  
    16.  */
    17. function apirequest(options) {
    18.   var response = {};
    19.   var defaults = {
    20.     url: '',
    21.     data: {},
    22.     onSuccess: false,
    23.     onError: false,
    24.     onFail: function (reply) {
    25.       console.log('Request to ' + settings.url + ' can not be parsed. Reply: ');
    26.       console.log(reply);
    27.       if (settings.popupOnError) {
    28.         noticePopup({text: 'Сервер ответил ошибкой', type: 'error'});
    29.       }
    30.     },
    31.     onDone: false,
    32.     after: false,
    33.     popupOnSuccess: false,
    34.     popupOnError: false,
    35.     messageOnSuccess: false,
    36.     messageOnError: false,
    37.     redirect: false,
    38.   };
    39.   function extend(){
    40.     for(var i=1; i<arguments.length; i++)
    41.       for(var key in arguments[i])
    42.         if(arguments[i].hasOwnProperty(key))
    43.           arguments[0][key] = arguments[i][key];
    44.     return arguments[0];
    45.   }
    46.   var settings = extend({}, defaults, options);
    47.  
    48.   var request = {
    49.     onFail: function (reply) {
    50.       if (typeof(settings.onFail) === "function") {
    51.         settings.onFail(reply);
    52.       }
    53.     },
    54.     onDone: function () {
    55.       if (typeof(settings.onDone) === "function") {
    56.         settings.onDone();
    57.       }
    58.     },
    59.     onError: function () {
    60.       if (typeof(settings.onError) === "function") {
    61.         settings.onError(response);
    62.       }
    63.       if (settings.popupOnError) {
    64.         this.popup();
    65.       }
    66.       if (settings.messageOnError) {
    67.         this.messages();
    68.       }
    69.     },
    70.     onSuccess: function () {
    71.       if (typeof(settings.onSuccess) === "function") {
    72.         settings.onSuccess(response);
    73.       }
    74.       if (settings.redirect && response.checkRedirect()) {
    75.         response.doRedirect();
    76.       }
    77.       if (settings.reload && response.checkReload()) {
    78.         response.doReload();
    79.       }
    80.       if (settings.popupOnSuccess) {
    81.         this.popup();
    82.       }
    83.       if (settings.messageOnSuccess) {
    84.         this.messages();
    85.       }
    86.     },
    87.     after: function () {
    88.       if (typeof(settings.after) === "function") {
    89.         settings.after(response);
    90.       }
    91.     },
    92.     popup: function () {
    93.       response.popupFirstMessage();
    94.     },
    95.     messages: function () {
    96.       response.drawAllMessages();
    97.     }
    98.   };
    99.  
    100.   this.getToken = function () {
    101.     if (typeof JohnSnow === 'undefined') {
    102.       return false;
    103.     }
    104.     if (typeof JohnSnow.tokens === 'undefined') {
    105.       return false;
    106.     }
    107.     if (typeof JohnSnow.tokens[settings.url] === 'undefined') {
    108.       return false;
    109.     }
    110.     return JohnSnow.tokens[settings.url];
    111.   };
    112.  
    113.   var ajaxSettings = {};
    114.   ajaxSettings.url = settings.url;
    115.   ajaxSettings.type = 'POST';
    116.   ajaxSettings.data = settings.data;
    117.   var token = this.getToken();
    118.   var pd = Object.prototype.toString.call(settings.data) === "[object FormData]";
    119.   if (pd) {
    120.     /* form data */
    121.     ajaxSettings.dataType = 'text';
    122.     ajaxSettings.processData = false;
    123.     ajaxSettings.contentType = false;
    124.     ajaxSettings.data.append('token', token);
    125.   } else {
    126.     /* general */
    127.     ajaxSettings.data.token = token;
    128.   }
    129.  
    130.   ajaxSettings.success = function (reply) {
    131.     if (ajaxResponseParse === undefined) {
    132.       return false;
    133.     }
    134.     response = ajaxResponseParse(reply);
    135.     if (!response) {
    136.       request.onFail(reply);
    137.       return false;
    138.     }
    139.     if (response.isStatusError()) {
    140.       request.onError();
    141.     }
    142.     if (response.isStatusOK()) {
    143.       request.onSuccess();
    144.     }
    145.     request.after();
    146.   }
    147.   $.ajax(ajaxSettings).done(function () {
    148.     request.onDone();
    149.   }).error(function (reply) {
    150.     request.onFail(reply);
    151.   });
    152.  
    153. } 
    В принципе немного доделать, и будет работать совсем без жука. Оно удобное.

    Код (Text):
    1.     url: '',
    2.     data: {},
    3.     onSuccess: false,
    4.     onError: false,
    5.     onFail: false,
    6.     popupOnSuccess: false,
    7.     popupOnError: false,
    8.     messageOnSuccess: false,
    9.     messageOnError: false,
    10.     redirect: false,
    Задаёшь урл.
    Задаёшь данные если надо. В данных можно отсылать и файлы тоже.

    Дальше оно дёрнет или успех, или ошибку, или облом.

    Дальше если с того конца попросили показать попапчик - покажет само автоматом, если хочешь.

    Потом может записать куданить сообщеньку об ошибке или наоборот.

    Ну и редирект если попросили - сделает.

    Работает с двумя другими штуками, если кому интересно - выложу. Но меня часто ругают и я стесняшка-первокласница как целка ломаюсь теперь.
     
  23. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Выложденное выше все круто, но не увидел один важный момент - target для приема данных от ajax. Он как задается у тебя? А в остальном да, вполне себе аналог.
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    В onSuccess и onError передаются данные из ответа.

    Есть ещё дебаг в консоль, когда ты в пхп пишешь что надо завардампить, а когда приходит ответ - он вываливает в консоль.

    пример:
    Код (PHP):
    1. try {
    2.   throwOnTrue(empty($_POST['member']), 'Укажите участника');
    3.   $comMember = Community::memberInfo($_POST['member']);
    4.   throwOnBadArray($comMember, 'В данном сообществе не нашлось такого участника');
    5.   $member = Community::getMember($comMember['community']);
    6.   throwOnFalse($member, 'Вы не являетесь участником данного сообщества');
    7.   throwOnFalse($member->right('user control'), 'У вас нет права управлять участниками данного сообщества');
    8.   //$community = Community::getInfo($comMember['community']);
    9.   //throwOnBadArray($community, 'Не могу получить информацию по данному сообществу. Участник разблокирован, но не будет иметь доступ в TeamSpeak');
    10.   throwOnTrue(empty($_POST['note']), 'Введите текст заметки');
    11.  
    12.   [...]
    13.  
    14.   $note = '
    15. <div class="row" id="note-public">
    16.   <div class="col-lg-3">
    17.     <img class="avatar-small" src="'.PinPIE::parseString('[[$user/avatar?id=' . (int)User::$id . ']]').'">
    18.     [url="/admin/community/users/edit/' . (int)$member->id . '"]' . h(User::$data['nickname']) . '[/url]
    19.     <br>
    20.     <span class="text-muted">' . h(date('Y-m-d H:i:s')) . '</span>
    21.   </div>
    22.   <div class="col-lg-9">
    23.     <div class="form-group">
    24.       <textarea class="form-control" id="npt-note">' . h($_POST['note']) . '</textarea>
    25.     </div>
    26.   </div>
    27. </div>';
    28.   ajaxResponse::data('note', $note);
    29.   ajaxResponse::setStatusOK();
    30.   ajaxResponse::addMessage('Заметка сохранена', 'success');
    31. } catch (Exception $ex) {
    32.   ajaxResponse::debug($ex->getMessage());
    33.   ajaxResponse::debug($ex->getTraceAsString());
    34.   ajaxResponse::debug(DB::Report(false), 'DB');
    35.   ajaxResponse::setStatusError();
    36.   ajaxResponse::addMessage($ex->getMessage(), 'error');
    37. }
    38. echo ajaxResponse::render();
    39.  
    Соотв, если что-то происходит, то вываливается отчет в консоль. Эссно, если это включено в конфиге, т.е. обычные посетители этого не увидят никогда.

    а в браузере такой js
    Код (PHP):
    1. function communityNote(member) {
    2.   apirequest({
    3.     url: '/api/admin/community/users/note/',
    4.     popupOnError: true,
    5.     popupOnSuccess: true,
    6.     data: {member: member, note: $('#npt-note').val()},
    7.     onSuccess: function (reply) {
    8.       $('#note-public').replaceWith(reply.getData('note'));
    9.     }
    10.   });
    11. } 
     
  25. Evpatiy

    Evpatiy Новичок

    С нами с:
    11 ноя 2015
    Сообщения:
    43
    Симпатии:
    0
    А вы юнит-тесты пишите для жабаскрипт?