Jump to content


  • Posts

  • Joined

  • Last visited

Everything posted by valan

  1. After 10 years of PW development it looks like a break-through!😁 @MarkE thank you! I'll consider using PW again in my next prj.
  2. @MarkE thank you for the module. One of the reasons why I decided to switch to another framework few years ago was lack of such migration tool. You give a good reason to consider PW in my development again)
  3. From the PW side the install option is missing) I've created one for my own purposes and happy to share with the community: https://bitbucket.org/valieand/pw Someone who has more time and competence can fork and polish it in order to add to official install options.
  4. Thank you to all replied. Unfortunately all suggested options require either extra tools (like ddev) and/or time to read, follow X instructions one-by-one, etc. I still think that PW should has official install option that 1) enables ready-to-serve PW in one-line command, e.g. smth like "git clone ... & docker-compose -up d" 2) has Nginx, PHP-FPM and MySql under the hood. From marketing perspective it should be the best option to engage newcomers with no extra time to dive deeper in the very beginning. @ryan what do you think?)
  5. I'm looking for PW install option in docker. This option is missing at PW site "install" section. Could community recommend a non-official repo with docker-compose that builds container with latest versions of PW, nginx, php, mysql?
  6. How to use both vendor libs and PW api in command line scripts? Assuming script is located here: prj/console/myscript.php
  7. Also, how to "require" non-PW vendor classes in PW module?
  8. How to load and use non-PW vendor classes installed with help of composer? Would it be enough to add "use namespace\class;" in the beginning of file? Also, is there any difference for doing that in PW module and template file?
  9. Hi! Thank you for responses. It's clear how to access PW from external PHP script. What's not clear yet is what would be a right setup in my case. As far as I understand, first, PW should be included in vendor directory via "composer require processwire/processwire"; second, it should be installed (e.g. direct some subdomain like pw.mydomain.com to index.php). Correct?
  10. I'd like to use ProcessWire CMS capabilities in existing project which runs on popular PHP framework (Yii2). Specifically, I'd like to handle requests in Yii and call PW if necessary, plus create/modify pages in ProcessWire admin. Is it possible? If yes - how to setup such combination?
  11. @BitPoet thank you for link. Haven't heard about this setting, as well as about FileCompiler=? Checked. Doesn't help. As far as I understand, because PHP compiler already declared class earlier. Looks like in my case Order_Status.class.php should not be required_once as soon as it has been compiled somewhere before + class is in use already. Or (I guess) Order_Status.class.php should never be compiled. But this scenario looks ugly to me as there are a lot of files that I need to prevent from compilation...).
  12. I'm trying to upgrade PW from 2.8 to 3.0 and get: Compile Error: Cannot declare class Order\Order_Status, because the name is already in use (line 6 of /path-to-file/Order_Status.class.php) File Order_Status.class.php: <?php namespace Order; require_once('SomeClass.php'); class Order_Status { // ... } ?> File where compiler breaks Master_Order.class.php: <?php namespace MM\User\Master; require_once('/path-to-file/Order_Status.class.php'); use Order\Order_Status; class Master_Order { // ... } I've checked FileCompiler cache and discovered that: Order_Status.class.php is compiled as expected (e.g. there is 'SomeClass.php' wrapped by file compiler) Master_Order.class.php is uncompiled as required_once('/path-to-file/Order_Status.class.php') is not wrapped Most probably conflict appears as a result of Order_Status.class.php compilation and its usage at early stage (this class is used both in modules and in template files). So my question is - how to fix compiler error in this case?
  13. @arjen thanks! Checked with different selector types = exactly what I need! Just minor fix - adding $selector2 needs to be done through new Selectors($selector2).
  14. @AndZyk thanks. Yes, there are associative and regular arrays used for selectors. It is exactly a reason of the question - how to merge them and get one: $selector1 = 'template=basic-page|product'; $selector2 = [ 'title|body%=' => $sanitizer->text($input->get('q')), ]; $selector3 = [ ['categories', '=', $input->get('categories'), 'int'], ['sort', '-created'] ] $selector = mergeSelectors($selector1, $selector2, $selector3); // <- I need this kind of method $results = $pages->find($selector);
  15. How to merge selectors of different types (string, array, array of arrays, Selectors) and get $selector with some of these types (to pass it to $pages->find($selector))?
  16. At our site we use both email and phone authorizations at frontend. To make life easier, I've developed HelperPhone pack that handles phone numbers. This pack includes following modules for ProcessWire CMS/CMF: FieldtypePhoneNumber: module that stores phone numbers InputfieldPhoneNumber: module that renders inputfield for phone numbers HelperPhone: module that loads PhoneNumber and PhoneNumberConst classes, and 'libphonenumber' namespace All these modules require included PW WireData-derived class PhoneNumber and PhoneNumberConst. PhoneNumber class is a thin wrapper over giggsey/libphonenumber-for-php, itself is port of Google's libphonenumber. PhoneNumberConst class stores constants, used by PhoneNumber class Usage: PhoneNumber class $phone = '8 (916) 318-07-29 ext 1234'; // input string could be in any phone-recognizable format $phoneNumber = new PhoneNumber($phone, 'RU'); // or wire('modules')->get('HelperPhone')->makePhoneNumber($phone, 'RU'); echo ($phoneNumber->isValidNumber() ? 'Yes':'No'); // Yes echo ($phoneNumber->isValidNumberForRegion($regionCode) ? 'Yes':'No'); // Yes echo $phoneNumber->getNumberTypeTitle(); // Mobile echo $phoneNumber->getCountryCode(); // 7 echo $phoneNumber->getRegionCode(); // RU echo $phoneNumber->getNationalNumber(); // 9163180729 echo $phoneNumber->getExtension(); // 1234 echo $phoneNumber->formatForCallingFrom('US') // 011 7 916 318-07-28 echo $phoneNumber->formatForCallingFrom('GE') // 00 7 916 318-07-28 For more methods and properties please refer to PhoneNumber and PhoneNumberConst source files. Need more? Check giggsey/libphonenumber-for-php and use it by accessing $phoneNumber->phoneNumber property - it is instance of \libphonenumber\PhoneNumber or null (if empty). Usage: field Note: on field creation, make sure that you've configured field settings Default region: assumed region if input phone number string is not in international format (starts with '+', etc) Enabled/disabled phone extentions: if disabled, phone extension will be removed on field save. Phone field settings in example below: default region code 'RU', phone extensions are enabled echo $page->phone; // +79163180729 // Note1: $page->phone stores instance of PhoneNumber and renders to string in E164 format. // Note2: E164 format does not include extension. echo $page->getFormatted('phone'); // +7 916 318-07-29 ext. 1234 echo $page->getUnformatted('phone'); // +79163180729 echo $page->phone->format(PhoneNumberConst::RFC3966); // tel:+7-916-318-07-29;ext=1234 echo $page->phone->getNationalNumber(); // 9163180729 Usage: PW selectors FieldtypePhoneNumber is instance of FieldtypeText. It stores phone numbers and extensions as string in E164 format with #extention (if provided by user and enabled in settings) E.g. in db it looks like this: '+79163180729#1234'. This makes it easy to query fields as any text field. echo $pages->find([ 'template' => 'my_temlate', 'phone^=' => '+79163180729', ]); // will echo page ids where phone starts with '+79163180729' Finally I've decided to put it here first and later to Modules directory (based on your feedbacks). GitHub: https://github.com/valieand/HelperPhone Enjoy
  17. @LostKobrakai - thank you! link is very helpful. P.S. and thank you for article - helped me a lot to better structure and maintain the code.
  18. There is excellent article here https://processwire.com/docs/tutorials/using-custom-page-types-in-processwire/ by @LostKobrakai that describes how to use custom page types and extend the Page class. Q: How to extend (e.g. w/o hooks, using method described in article) core Users and User classes and reload $users and $user api variables (they are locked) with new/extended classes? Currently I think about changing User to MyUser class in systems tab (e.g. set another class to be used for 'user' template) and installing module like below. As you can see it adds $myusers and $myuser api variables but I'm not sure that it won't conflict with core. // MyUsers.php class MyUsers extends Users { public function __construct(ProcessWire $wire, $templates = array(), $parents = array()) { parent::__construct($wire, $templates, $parents); $this->setPageClass('MyUser'); } // my non-overlapping methods here ... } // MyUser.php class MyUser extends User { // my non-overlapping methods here ... } class ResourceUser extends WireData implements Module { public static function getModuleInfo() { return [ 'title' => 'Extend Users and User', 'version' => 100, 'autoload' => true, 'singular' => true, ]; } public function __construct() { require_once(dirname(__FILE__) . '/MyUsers.php'); require_once(dirname(__FILE__) . '/MyUser.php'); } public function init() { $pagesType = new MyUsers($this->wire); $this->wire('myusers', $pagesType, true); $page = new MyUser; $this->wire('myuser', $page, true); } }
  19. @Robin S @LostKobrakai thanks. This method looks like a right method for input-specific js/css. It creates config under $this->attr('id') on initial page load... but now w/o values. Looks like when Ajax visibility is set, PW knows $this->attr('id') but doesn't know $this->my_config_key and $this->attr('value'). How to get these values in this method when Ajax visibility is set? P.S. If visibility set to "Open", everything works OK, e.g. it does not work with 2 Ajax visibility options. public function renderReady(Inputfield $parent = null, $renderValueMode = false) { $this->config->js($this->attr('id'), [ 'config' => [ 'my_config_key' => $this->my_config_key, // = null (it's an inputfield config parameter) 'pageId' => $this->attr('value'), // = 0 (it's a page id from InputfieldPage) ], ]); parent::renderReady($parent, $renderValueMode); }
  20. @Robin S thanks for check. Looks like problem is deeper. May be at MySQL level as we've migrated to InnoDb. Or smth else. And thanks for sensible advice!
  21. @arjen thanks. I guess that such kind of errors like "endless loops somewhere in the core" require line-by-line execution debugger in order to find where it occurs. Not sure that Tracy may help here, but will give it a try. I also think its a core issue, not site-specific. Could you check it in admin? - move any page under any user (preliminary make sure you've enabled 'may have children' in user template). Page will be moved, but spinner will continue to run, blocking any further work in admin, so you'll need to create a new session (restart browser/login again).
  22. @kixe thanks. $page already exists, so no need to set template again. Anyway, I did it but issue remained - the same $page->save(). I'm not really advanced enough programmer to debug PW core code (and don't have proper debugging tools, wire('log')->error('My error'); was always enough for me))
  23. Code below works everywhere else, except if applied to pages in Admin tree. Specifically, I change parent to some 'user-car' pages and place them under some 'user' page in admin tree. $page->of(false); $page->parent = $some_user_page; $page->save(); $page->save() freezes, e.g. method does not not return any value/looks like in falls in endless loop somewhere inside. It also does not generate any errors. As it happens only in Admin tree (everywhere else it works), root cause could be: (1) in template settings (I've checked and didn't found any "restrictions", e.g. 'user-car' pages can be freely moved, 'user' may have children) or (2) in core code, somewhere in Page::save() Please, advise how to fix this issue.
  24. Well, specifically, I'm interested to know how to pass js to the page on ajax call. Currently ajax-driven inputfields work only for fields that do not set js inside render(). But what to do if I have such code in render()? $this->wire('config')->js($this->attr('id'), [ 'config' => $my_array, ]); Moving it to init() does not work, as $this->attr('id') is not set at that moment. Adding js script (with <script>my_js_code_that_sets_config();</script>) to redner() output also does not work - script tags are removed by PW. P.S. Just in case if it matters - I'm developing inputfield for FieldtypePage, e.g. it is added to InputfieldPage inputfieldClasses setting.
  • Create New...